redis集群搭建与验证
生产环境用了redis集群,用了一段时间以来,redis集群还是挺好用的。因此,把在生产环境中学习到的redis集群的运维知识跟大家分享一下。
1: 先安装redis-server
可从官方下载最新http://redis.io/download,编译安装即可。
cd /usr/local/src
tar -zxvf redis-3.0.7.tar.gz
cd redis-3.0.7
make
安装完后src目录下,三个比较常用的命令如下。redis-server用于启动redis服务器,redis-cli用于连接redis服务器,redis-trib.rb用于创建redis集群:
[root@2_17 redis-3.0.7]# ll -h src/redis*
-rwxr-xr-x 1 root root 4.5M Jun 22 00:51 src/redis-cli
-rwxr-xr-x 1 root root 6.2M Jun 22 00:51 src/redis-server
-rwxrwxr-x 1 root root 60K Jan 25 22:57 src/redis-trib.rb
cp src/redis-cli src/redis-server src/redis-trib.rb /usr/local/bin/拷贝到bin目录可直接运行。
2: 创建redis集群对应的目录,并启动redis-server:
mkdir -pv /data/redis-cluster/7000
mkdir -pv /data/redis-cluster/7001
mkdir -pv /data/redis-cluster/7002
mkdir -pv /data/redis-cluster/8000
mkdir -pv /data/redis-cluster/8001
mkdir -pv /data/redis-cluster/8002
3: 创建配置并启动redis-server,vim /data/redis-cluster/7000/redis.conf
daemonize yes pidfile "/data/redis-cluster/7000/redis.pid" port 7000 tcp-backlog 511 timeout 0 tcp-keepalive 0 loglevel notice logfile "/data/redis-cluster/7000/redis.log" cluster-enabled yes #save 900 1 #save 300 10 #save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename "dump.rdb" dir "/data/redis-cluster/7000" slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite yes auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes # Generated by CONFIG REWRITE maxmemory 5859375kb maxmemory-policy volatile-lru
启动redis服务器:redis-server /data/redis-cluster/7000/redis.conf 。
4: 启动7001,7002,8000,8001,8002的redis服务器。
cp /data/redis-cluster/7000/redis.conf /data/redis-cluster/7001/redis.conf
cp /data/redis-cluster/7000/redis.conf /data/redis-cluster/7002/redis.conf
cp /data/redis-cluster/7000/redis.conf /data/redis-cluster/8000/redis.conf
cp /data/redis-cluster/7000/redis.conf /data/redis-cluster/8001/redis.conf
cp /data/redis-cluster/7000/redis.conf /data/redis-cluster/8002/redis.conf
vim /data/redis-cluster/7001/redis.conf:
%s/7000/7001/g 把7000的都替换成7001,并启动redis-server:redis-server /data/redis-cluster/7001/redis.conf。
5: 其它的也是类似的替换方式。
6: 此时,redis服务器进程如下:
[root@2_17 7002]# ps auxfw|grep redis root 4078 0.0 0.1 103244 856 pts/0 S+ 21:13 0:00 \_ grep redis root 4034 0.0 0.4 137444 2440 ? Ssl 21:03 0:00 redis-server *:7000 [cluster] root 4043 0.0 0.4 137444 2436 ? Ssl 21:05 0:00 redis-server *:7001 [cluster] root 4054 0.0 0.4 137444 2440 ? Ssl 21:07 0:00 redis-server *:7002 [cluster] root 4062 0.0 0.4 137444 2440 ? Ssl 21:12 0:00 redis-server *:8002 [cluster] root 4067 0.0 0.4 137444 2440 ? Ssl 21:12 0:00 redis-server *:8001 [cluster] root 4071 0.0 0.4 137444 2436 ? Ssl 21:12 0:00 redis-server *:8000 [cluster]
7: 创建redis集群
创建前准备:
ruby -v #没有ruby的时候安装一下ruby。 yum install gem -y gem -v #没有gem的时候安装一下gem。 yum install rubygems -y gem install redis #由于集群是使用ruby的,gem是给ruby安装redis扩展,让ruby能操作redis。
创建redis集群:
#redis-trib.rb create --replicas 1 172.16.0.3:7000 172.16.0.3:7001 172.16.0.3:7002 172.16.0.3:8000 172.16.0.3:8001 172.16.0.3:8002 #此命令创建集群虽然快,但哪个主哪个从无法指定,多台机器的时候比较麻烦,因此使用如下的创建方式。
7.1 先创建redis主的集群。
redis-trib.rb create 172.16.0.3:7000 172.16.0.3:7001 172.16.0.3:7002
#redis-trib.rb add-node 172.16.0.3:7004 172.16.0.3:7000 redis集群新增主,这个未测试。
7.2 一个一个创建redis主集群的从库,多台主机的时候使用这个创建。集群在生产环境使用都是三台主机。
redis-trib.rb add-node --slave 172.16.0.3:8000 172.16.0.3:7000
redis-trib.rb add-node --slave 172.16.0.3:8001 172.16.0.3:7001
redis-trib.rb add-node --slave 172.16.0.3:8002 172.16.0.3:7002
7.3 查看redis集群的情况。
[root@2_17 7002]# redis-cli -p 7000 -c cluster nodes 5b0f437d2760745948123b24acfa70122f13420d 172.16.0.3:8002 slave a3e334fbce1d167a1129f627bcc9cb4a19d1cd79 0 1471785839075 3 connected cdff657dd5bf50db775ecc439eafb247f902fb08 172.16.0.3:8000 slave 5be2a3e20dcbdff1368b80823d70511ccc514bdf 0 1471785838071 1 connected a3e334fbce1d167a1129f627bcc9cb4a19d1cd79 172.16.0.3:7002 master - 0 1471785835564 3 connected 10923-16383 495b5d3891e85f9fe325e12df8d2bef991c6ce2a 172.16.0.3:8001 slave 6d3891e9a8c634624ad0d828bb463ee10d044e8b 0 1471785836065 2 connected 5be2a3e20dcbdff1368b80823d70511ccc514bdf 172.16.0.3:7000 myself,master - 0 0 1 connected 0-5460 6d3891e9a8c634624ad0d828bb463ee10d044e8b 172.16.0.3:7001 master - 0 1471785837068 2 connected 5461-10922
7.4 测试集群是否可用
#连接集群不管是写入数据还是读取数据都需要加入-c的参数。
for line in {1..100};do redis-cli -p 7000 -c set ops_${line} ${line}; done #往集群里面写入一百条数据。
for line in {1..100};do redis-cli -p 7000 -c get ops_${line}; done #读取数据看一下是否能读取到。
查看集群的key的分布情况:
db0:keys=30,expires=0,avg_ttl=0
127.0.0.1:7000> #7000有30个。
db0:keys=41,expires=0,avg_ttl=0
127.0.0.1:7001> #7001有41个。
db0:keys=29,expires=0,avg_ttl=0
127.0.0.1:7002> #7002有29个。
# Keyspace
db0:keys=30,expires=0,avg_ttl=0
127.0.0.1:8000> #8000是7000的备份,30个。
7.5 验证集群的切换
redis-cli -p 7000 SHUTDOWN #关闭集群
for line in {1..100};do redis-cli -p 7001 -c get ops_${line}; done #因为7000关闭,所以得用其它端口去测试,看下能否读取成功。
重装启动7000端口的redis服务器:redis-server /data/redis-cluster/7000/redis.conf
redis-cli -p 7000 #使用info看下7000已经成从库,本来应该是主库的。
redis-cli -p 7000 CLUSTER FAILOVER #使用这个命令把7000再次切换为主库。
for line in {1..100};do redis-cli -p 7001 -c get ops_${line}; done #再次验证下数据是否正常。
以上验证都正常。
7.6 redis集群数据的保证
三主三从,三从是用来备份数据的,因此得启动bgsave或者aof其中一个,aof对机器的性能影响比较小,一盘都在从库上开启aof备份数据。操作如下:
config set appendfsync everysec
config set appendonly yes #一设置为yes以后,redis就会启动BGREWRITEAOF,把数据生成一份aof。
config rewrite #直接把配置写入配置文件。
CONFIG SET auto-aof-rewrite-percentage 0 #一般来说把auto-aof-rewrite-percentage设置为0,不让从库自动进行BGREWRITEAOF,以免业务量大的时候影响性能。为什么要进行BGREWRITEAOF,因为aof存的是对redis服务器的操作命令,随着时间的推移,aof文件会不断增大。所以执行是要执行,但要由运维人员自己定时间执行,可以在定时任务在业务空闲的时候使用redis-cli -p 8000 BGREWRITEAOF。