亿级流量场景下,大型缓存架构设计实现,你知道吗?(11)


slave node,readonly,get,这个时候才能在slave node进行读取
redis cluster,主从架构是出来,读写分离,复杂了点,也可以做,jedis客户端,对redis cluster的读写分离支持不太好的
默认的话就是读和写都到master上去执行的
如果你要让最流行的jedis做redis cluster的读写分离的访问,那可能还得自己修改一点jedis的源码,成本比较高
要不然你就是自己基于jedis,封装一下,自己做一个redis cluster的读写分离的访问api
核心的思路,就是说,redis cluster的时候,就没有所谓的读写分离的概念了
读写分离,是为了什么,主要是因为要建立一主多从的架构,才能横向任意扩展slave node去支撑更大的读吞吐量
redis cluster的架构下,实际上本身master就是可以任意扩展的,你如果要支撑更大的读吞吐量,或者写吞吐量,或者数据量,都可以直接对master进行横向扩展就可以了
也可以实现支撑更高的读吞吐的效果
不会去跟大家直接讲解的,很多东西都要带着一些疑问,未知,实际经过一些实验和操作之后,让你体会的更加深刻一些
redis cluster,主从架构,读写分离,没说错,没有撒谎
redis cluster,不太好,server层面,jedis client层面,对master做扩容,所以说扩容master,跟之前扩容slave,效果是一样的
3、实验自动故障切换 -> 高可用性
redis-trib.rb check 192.168.31.187:7001
比如把master1,187:7001,杀掉,看看它对应的19:7004能不能自动切换成master,可以自动切换
切换成master后的19:7004,可以直接读取数据
再试着把187:7001给重新启动,恢复过来,自动作为slave挂载到了19:7004上面去
3、实现redis cluster的水平扩容
redis cluster模式下,不建议做物理的读写分离了
我们建议通过master的水平扩容,来横向扩展读写吞吐量,还有支撑更多的海量数据
redis单机,读吞吐是5w/s,写吞吐2w/s
扩展redis更多master,那么如果有5台master,不就读吞吐可以达到总量25/s QPS,写可以达到10w/s QPS
redis单机,内存,6G,8G,fork类操作的时候很耗时,会导致请求延时的问题
扩容到5台master,能支撑的总的缓存数据量就是30G,40G
100台,600G,800G,甚至1T+,海量数据
----------------------------------------------------------
redis是怎么扩容的
------- 加入master 加入slave
1、加入新master
mkdir -p /var/redis/7007
port 7007cluster-enabled yescluster-config-file /etc/redis-cluster/node-7007.confcluster-node-timeout 15000daemonize yespidfile /var/run/redis_7007.piddir /var/redis/7007logfile /var/log/redis/7007.logbind 192.168.31.227appendonly 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)? 4096
亿级流量场景下,大型缓存架构设计实现,你知道吗?

文章插图
检查一下分配的情况:
亿级流量场景下,大型缓存架构设计实现,你知道吗?

文章插图
3、添加node作为slave
eshop-cache03
mkdir -p /var/redis/7008
port 7008cluster-enabled yescluster-config-file /etc/redis-cluster/node-7008.confcluster-node-timeout 15000daemonize yespidfile /var/run/redis_7008.piddir /var/redis/7008logfile /var/log/redis/7008.logbind 192.168.31.227appendonly yes
redis-trib.rb add-node --slave --master-id 28927912ea0d59f6b790a50cf606602a5ee48108 192.168.31.227:7008 192.168.31.187:7001
亿级流量场景下,大型缓存架构设计实现,你知道吗?

文章插图
检查加入情况:
亿级流量场景下,大型缓存架构设计实现,你知道吗?

文章插图
4、删除node
先用resharding将数据都移除到其他节点,确保node为空之后,才能执行remove操作
先将slot移空
亿级流量场景下,大型缓存架构设计实现,你知道吗?

文章插图
移空后执行删除:
亿级流量场景下,大型缓存架构设计实现,你知道吗?


推荐阅读