上一篇 http://www.cnblogs.com/qinyujie/p/9029522.html, 主要讲解 实验多master写入、读写分离、实验自动故障切换(高可用性),那么本篇咱们就来聊了聊redis cluster 水平扩容以及自动化 slave 迁移。html
redis repliction 主从架构,一主多从更多的是为了提升 读QPS 。而 redis cluster 集群中不建议或者没有说作物理的读写分离了,redis cluster 集群更强调的是经过master的水平扩容,来横向扩展 读写QPS,还有支撑更多的 海量数据。java
注意:水平扩容基于 redis cluster集群部署 基础上来操做,新加的redis 实例博主就直接在192.168.43.18 机器上作了,真正生产环境应该在独立机器上部署,具体根据自身公司需求而定,后面就不赘述了。node
mkdir -p /var/redis/7007 //redis 的持久化文件地址redis
cd /usr/local/redis-3.2.8 && cp redis.conf /etc/redis/7007.confvim
port 7007 cluster-enabled yes cluster-config-file /etc/redis-cluster/node-7007.conf cluster-node-timeout 15000 daemonize yes pidfile /var/run/redis_7007.pid dir /var/redis/7007 logfile /var/log/redis/7007.log bind 192.168.43.18 appendonly yes
cd redis-3.2.8 && cp utils/redis_init_script /etc/init.d/redis_7007 && chmod 777 /etc/init.d/redis_7007 && vim /etc/init.d/redis_7007ruby
./etc/init.d/redis_7007 start架构
redis-trib.rb add-node ip1:port ip2:portapp
ip1:port1: 须要加入redis cluster 中的 redis 实例 ip2:port2 : redis-trib.rb去拿集群状态数据spa
redis-trib.rb add-node 192.168.43.18:7007 192.168.43.16:70013d
redis-trib.rb check 192.168.43.16:7001 查看集群状态信息
经过上图能够看出,7007 redis 实例已经加入到集群中,做为master,可是咱们也能够看到,7007 是没有slot 的,这就意味着没法存储数据,所以咱们须要将其余master 中的部分 slot 迁移到7007 redis 上。怎么作呢 ?
那须要迁移多少的slot 到 7007 redis 呢?
slot ( 4096 ) = 16384 / master 个数(4)
redis-trib.rb reshard 192.168.43.16:7001
而后 yes 便可,下图表示迁移成功:
上面讲了新增一个master redis 实例,那么slave redis 实例又如何加入到集群中呢?
方法和上面建立一个新master redis 实例同样,实例配置启动后,就要加入到集群中了。
redis-trib.rb add-node --slave --master-id ID ip1:port1 ip2:port2
ID : master redis 实例ID ip1:port1: 须要加入redis cluster 中的 redis 实例 ip2:port2 : redis-trib.rb去拿集群状态数据
下面将7008 redis 做为 7001 master redis 的 slave 中(特地放到 7001 master 为下面 slave自动化迁移作准备),以下图:
redis-trib.rb add-node --slave --master-id a65e04974f47d110158a33c54c75ad8239fa6b10 192.168.43.18:7008 192.168.43.16:7001
将某个 redis 实例从集群中移除,当先用resharding将数据都移除到其余节点,确保node为空以后,才能执行remove操做,当你清空了一个master的 hash slot 时,redis cluster就会自动将其slave挂载到其余master上去,这个时候只须要删除掉master就能够了
当要删除的redis node 为master 时,先讲hash slot 迁移到其余三个master 中,
master1 slot(1365) + master2 slot(1365) + master3 slot(1366) = master4 slot(4096)
根据上面,须要分三次迁移,两次迁移1365,一次1366 到其余master 节点中
redis-trib.rb reshard 192.168.43.16:7001
redis-trib.rb del-node 192.168.43.16:7001 cc9ef42e215c5cc1c8cf37acde4946997620f003
若是说redis cluster 集群自己就具有高可用性,那么当 6个节点,3 master 3 slave,当出现某个slave 宕机了,那么就只有master了,这时候的高可用性就没法很好的保证了,万一master 也宕机了,咋办呢? 针对这种状况,若是说其余有多余的slave ,集群自动把多余的slave 迁移到 没有slave 的master 中,那就行了,就能够说具有很好的高可用性了,没错,redis cluster 就是这么NB,redis cluster 就支持自动化slave 迁移。下面咱们演示下吧。
看下如今的集群状态,以下图:
上图能够看到,7001 master 上有 2 slave 。
info Replication //查看redis 实例的主从信息
再次看如今的集群状态,以下图:
从上图结合前面的集群状态信息,能够看出redis cluster 自动的将 7001 中多余的slave 迁移到了 7003 上。
当再度将7006 redis 实例启动后,7003 master 就会有2个slave 了。
总结:在redis cluster 集群中,若是某个master 下没有了slave ,其余master 中有多余的slave 的话,集群会自动slave 迁移,由此能够见,能够利用该特性,在生产环境中,适当的添加冗余的slave 实例,能够很大程度上提升集群的高可用性
PS:有的小伙伴可能在作迁移的时候solt不是很好的均匀迁移出去。就像下面这样 集群状态会有一个警告,。当你再去作其它迁移solt的时候会不让你继续进行下去。
经过查资料发现多是因为redis版本号的问题致使。
redis-server:3.2.8
ruby:2.4.1p111
redis.rb(使用:gem install redis安装):4.0.0 < - 这是问题的缘由
因此有时间再去试试4.0以上版本。
问题还没有解决!