环境信息
centos7
redis5
安装redis
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar -zxvf redis-5.0.3.tar.gz
cd redis-5.0.3
yum install gcc
make MALLOC=libc
# 安装到 /usr/local/redis 目录中 安装的文件只有一个bin目录
make install PREFIX=/usr/local/redis/
# 创建配置文件和data存放目录
mkdir /usr/local/redis/conf /usr/local/redis/data
修改配置文件
首先我们需要准备六台服务器,搭建三个一主一从结构,也就是四个redis服务,由于没有六台服务器,我们修改端口号,端口号分别为:6379,6380,6381,6382,6383,6384
并在每个配置文件中加入:
#端口号
port 6379
#后台启动的意思
daemonize yes
# redis数据文件存放的目录
dir /usr/local/redis/data
bind 0.0.0.0
# 开启集群
cluster-enabled yes
# 会自动生成在上面配置的dir目录下
cluster-config-file nodes-6379.conf
cluster-node-timeout 5000
# 这个文件会自动生成
pidfile /usr/local/redis/conf/redis_6379.pid
启动6个Redis实例
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis1.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis2.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis3.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis4.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis5.conf
创建cluster
/usr/local/redis/bin/redis-cli --cluster create 192.168.130.128:6379 192.168.130.128:6380 192.168.130.128:6381 192.168.130.128:6382 192.168.130.128:6383 192.168.130.128:6384 --cluster-replicas 1
自动设置主从,而且会提示你,是否运行使用自动的配置
Can I set the above configuration? (type ‘yes’ to accept): yes
集群检验和测试
检查集群,查看所有节点信息
/usr/local/redis/bin/redis-cli -c -h 192.168.130.128 -p 6379 cluster nodes
执行后结果:
[root@localhost conf]# /usr/local/redis/bin/redis-cli -c -h 192.168.130.128 -p 6379 cluster nodes
ee091364b2511c96f823d9ea6436ef56ee2c5537 192.168.130.128:6381@16381 master - 0 1601644106810 3 connected 10923-16383
29cb50aa256bddb9d4abc7c7453c8d76552b2636 192.168.130.128:6379@16379 myself,master - 0 1601644107000 1 connected 0-5460
d09929dd6be03ecfcb36e5ba33b98feaaed32de9 192.168.130.128:6382@16382 slave ee091364b2511c96f823d9ea6436ef56ee2c5537 0 1601644108523 4 connected
a2b4a1d58296c6859e262146491a8680ff8217b0 192.168.130.128:6383@16383 slave 29cb50aa256bddb9d4abc7c7453c8d76552b2636 0 1601644108523 5 connected
4679a80039b5e60cf3207bd6405fbb9e9e762e20 192.168.130.128:6380@16380 master - 0 1601644108000 2 connected 5461-10922
648b66b11474bd94a61203743471f83c7404e386 192.168.130.128:6384@16384 slave 4679a80039b5e60cf3207bd6405fbb9e9e762e20 0 1601644107817 6 connected
节点id ip+端口 角色 masterid 处理的ping数量 最后一个pong时间 节点配置版本 节点连接状态 slot槽分配情况
进入redis:
-c 是支持cluster重定向
/usr/local/redis/bin/redis-cli -c -h 192.168.130.128 -p 6381
#当存入的key不属于当前节点时自动重定向
192.168.130.128:6381> set test1 a
-> Redirected to slot [4768] located at 192.168.130.128:6379
OK
# 查看一个key属于哪一个节点
192.168.130.128:6379> CLUSTER KEYSLOT key
(integer) 12539
192.168.130.128:6379> CLUSTER KEYSLOT test1
(integer) 4768
192.168.130.128:6379> get test1
"a"
192.168.130.128:6379>
集群slot数量整理 reshard
redis-cli --cluster reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes
我们将6381中的一千个slot移至6379中
由前面输出的节点信息我们知道:
6379ID:29cb50aa256bddb9d4abc7c7453c8d76552b2636
6381ID: ee091364b2511c96f823d9ea6436ef56ee2c5537
即执行此命令:
/usr/local/redis/bin/redis-cli --cluster reshard 192.168.130.128:6379 --cluster-from ee091364b2511c96f823d9ea6436ef56ee2c5537 --cluster-to 29cb50aa256bddb9d4abc7c7453c8d76552b2636 --cluster-slots 1000 --cluster-yes
重新检查集群
/usr/local/redis/bin/redis-cli --cluster check 192.168.130.128:6382
可以看到移动成功
扩容
加入到已经存在的集群作为master
/usr/local/redis/bin/redis-cli --cluster add-node 192.168.130.128:6385 192.168.130.128:6379
新节点没有分配hash槽,需要手动分配
加入到已经存在的集群作为slave
redis-cli --cluster add-node 192.168.130.128:6383 192.168.130.128:6379 --cluster-slave
手工指定master,否则就是选择一个slave数量较少的master
redis-cli --cluster add-node 192.168.130.128:6383 192.168.130.128:6379 --cluster-slave --cluster-master-id <node-id>
缩容(删除节点)
# 注意:删除master的时候要把数据清空或者分配给其他主节点
/usr/local/redis/bin/redis-cli --cluster del-node 192.168.100.242:6381 <node-id>
故障转移
redis中的当一个主节点宕机时,其从节点会默认成为主节点,继续提供服务。
我们也可以手动故障转移
# 可能某个节点需要维护(机器下线、硬件升级、系统版本调整等等场景),需要手动的实现转移
# 在slave节点上执行命令
CLUSTER FAILOVER