redis cluster模式下,不建议做物理的读写分离了
我们建议通过master的水平扩容,来横向扩展读写吞吐量,还有支撑更多的海量数据
master的水平扩容
比如redis单机得情况下,读吞吐是5w/s,写吞吐2w/s,
扩展redis更多master,那么如果有5台master,不就读吞吐可以达到总量25w/s QPS,写可以达到10w/s QPS
redis单机的情况,内存是6G或者8G,fork类操作的时候很耗时,会导致请求延时的问题
扩容到5台master,能支撑的总的缓存数据量就是30G,40G ,又或者扩容到 100台,600G,800G,甚至1T+,这就实现了海量数据的吞吐量。
redis是怎么扩容的
1、加入新master,手工搭一个节点出来,方式跟前面介绍的配置方式一样。
mkdir -p /var/redis/7007
port 7007
cluster-enabled yes
cluster-config-file /opt/redisdir/clusterconf/nodeconf/node-7007.conf
cluster-node-timeout 15000
daemonize yes
pidfile /opt/redisdir/run/redis_7007.pid
dir /opt/redisdir/7007
logfile /opt/redisdir/7007.log
bind 192.168.1.51
appendonly yes
搞一个7007.conf,再搞一个redis_7007启动脚本
手动启动一个新的redis实例,在7007端口上
redis-trib.rb add-node 192.168.31.227:7007 192.168.31.187:7001
redis-trib.rb check 192.168.31.187:7001
连接到新的redis实例上,查看cluster nodes,确认自己是否加入了集群,作为了一个新的master
2、reshard一些数据过去
resharding的意思就是把一部分hash slot从一些node上迁移到另外一些node上
redis-trib.rb reshard 192.168.31.187:7001
要把之前3个master上,总共4096个hashslot迁移到新的第四个master上去
How many slots do you want to move (from 1 to 16384)?
1000
在移动hash slot的时候会提示你,需要移动多少个slot。
然后还
3、添加redis node作为slave
同样的方式添加一个节点。
mkdir -p /var/redis/7008
port 7008
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7008.conf
cluster-node-timeout 15000
daemonize yes
pidfile /var/run/redis_7008.pid
dir /var/redis/7008
logfile /var/log/redis/7008.log
bind 192.168.31.227
appendonly yes
redis-trib.rb add-node --slave --master-id 28927912ea0d59f6b790a50cf606602a5ee48108 192.168.31.227:7008 192.168.31.187:7001
以上命令为添加节点,作为某个master的从节点。
4、删除node
先用resharding将数据都移除到其他节点,确保node为空之后,才能执行remove操作
redis-trib.rb del-node 192.168.31.187:7001 bd5a40a6ddccbd46a0f4a2208eb25d2453c2a8db
2个是1365,1个是1366
当你清空了一个master的hashslot时,redis cluster就会自动将其slave挂载到其他master上去
这个时候就只要删除掉master就可以了
slave的自动迁移
比如现在有10个master,每个有1个slave,然后新增了3个slave作为冗余,有的master就有2个slave了,有的master出现了salve冗余
如果某个master的slave挂了,那么redis cluster会自动迁移一个冗余的slave给那个master
只要多加一些冗余的slave就可以了
为了避免的场景,就是说,如果你每个master只有一个slave,万一说一个slave死了,然后很快,master也死了,那可用性还是降低了
但是如果你给整个集群挂载了一些冗余slave,那么某个master的slave死了,冗余的slave会被自动迁移过去,作为master的新slave,此时即使那个master也死了
还是有一个slave会切换成master的
之前有一个master是有冗余slave的,直接让其他master其中的一个slave死掉,然后看有冗余slave会不会自动挂载到那个master