13.redis水平扩容master支撑更高读写吞吐+海量数据

可以看到redis-trib.rb具有以下功能:
1、create:创建集群
2、check:检查集群,检查集群状态的命令,没有其他参数,只需要选择一个集群中的一个节点即可
3、info:查看集群信息
4、fix:修复集群
5、reshard:在线迁移slot
6、rebalance:平衡集群节点slot数量
7、add-node:将新节点加入集群
8、del-node:从集群中删除节点
9、set-timeout:设置集群节点间心跳连接的超时时间
10、call:在集群全部节点上执行命令
11、import:将外部redis数据导入集群


redis cluster的自动化slave迁移实现更强的高可用架构
slave的自动迁移
比如现在有10个master,每个有1个slave,然后新增了3个slave作为冗余,有的master就有2个slave了,有的master出现了salve冗余
如果某个master的slave挂了,那么redis cluster会自动迁移一个冗余的slave给那个master



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是怎么扩容的
1、加入新master
(1)复制/usr/local/redis-4.0.2/utils/redis_init_script文件到/etc/init.d/目录下
  
cp /usr/local/redis-4.0.2/utils/redis_init_script /etc/init.d/
 
(2)重命名redis_init_script文件
 
mv redis_init_script redis_7007(启动脚本端口号默认6379,要改为7007)
 
(3)创建两个目录/etc/redis(存放redis配置文件) /var/redis/7007(存放redis持久化文件)
 mkdir /etc/redis(之前创建了就不用)
 mkdir /var/redis/7007
  (4)复制redis配置文件redis.conf到/etc/redis目录下 并且重命名7007.conf
mkdir -p /var/redis/7007
(5)修改/etc/redis/7007.conf配置文件
vi /etc/redis/7007.conf

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 自身分配的ip地址(ifconfig查看)
appendonly yes

(6)手动启动一个新的redis实例,在7007端口上
(7)加入新的master到集群
#(1)添加主节点    redis-trib.rb add-node 192.168.31.227:7007 192.168.31.187:7001
注释:192.168.31.227:7007是新添加的节点, 192.168.31.187:7001是cluster集群任意一个旧的节点,用来定位所在的cluster集群

#(2)检查集群状态 redis-trib.rb check 192.168.31.187:7001  检查集群状态的命令,没有其他参数,只需要选择一个集群中的一个节点即可
注释: 192.168.31.187:7001是cluster集群任意一个旧的节点,用来定位所在的cluster集群

#(3)添加从节点    redis-trib.rb add-node --slave --master-id 03ccad2ba5dd1e062464bc7590400441fafb63f2 192.168.10.220:6385 192.168.10.219:6379  
注释: --slave表示添加的是slave节点,--master-id 后跟指定的master的id,
 192.168.10.220:6385是新添加的节点,192.168.10.219:6379 是cluster集群任意一个旧的节点,用来定位所在的cluster集群


#(4)重新分配slot       redis-trib.rb reshard 192.168.10.219:6378 //下面是主要过程


How many slots do you want to move (from 1 to 16384)? 1000 //设置slot数1000  
What is the receiving node ID? 03ccad2ba5dd1e062464bc7590400441fafb63f2 //新节点node id  
Please enter all the source node IDs.  
Type 'all' to use all the nodes as source nodes for the hash slots.  
Type 'done' once you entered all the source nodes IDs.  
Source node #1:all //表示全部节点重新洗牌  
Do you want to proceed with the proposed reshard plan (yes/no)? yes //确认重新分 
注释:192.168.10.219:6378是cluster集群任意一个旧的节点,用来定位所在的cluster集群


#(5)删除节点()
(5.1)删除从节点 redis-trib.rb del-node 192.168.10.220:6385 '9c240333476469e8e2c8e80b089c48f389827265'


注释:192.168.10.220:6385是cluster集群任意一个旧的节点,用来定位所在的cluster集群,
9c240333476469e8e2c8e80b089c48f389827265 是要删除的节点的id


(5.2)删除主节点
(5.2.1)取消分配的slot
redis-trib.rb reshard 192.168.10.219:6378 //取消分配的slot,下面是主要过程  

How many slots do you want to move (from 1 to 16384)? 1000 //被删除master的所有slot数量  
What is the receiving node ID? 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052 //接收6378节点slot的master  
Please enter all the source node IDs.  
Type 'all' to use all the nodes as source nodes for the hash slots.  
Type 'done' once you entered all the source nodes IDs.  
Source node #1:03ccad2ba5dd1e062464bc7590400441fafb63f2 //被删除master的node-id  
Source node #2:done   
   Do you want to proceed with the proposed reshard plan (yes/no)? yes //取消slot后,reshard 

(5.2.2)删除清空了的主节点
redis-trib.rb del-node 192.168.10.219:6378 '03ccad2ba5dd1e062464bc7590400441fafb63f2' 


注释: 如果主节点有slot,去掉分配的slot,然后再删除主节点
192.168.10.219:6378是cluster集群任意一个旧的节点,用来定位所在的cluster集群
03ccad2ba5dd1e062464bc7590400441fafb63f2是要删除的节点的id

#(6)设置集群节点间心跳连接的超时时间
set-timeout用来设置集群节点间心跳连接的超时时间,单位是毫秒,不得小于100毫秒,因为100毫秒对于心跳时间来说太短了。
该命令修改是节点配置参数cluster-node-timeout,默认是15000毫秒。通过该命令,可以给每个节点设置超时时间,
设置的方式使用config set命令动态设置,然后执行config rewrite命令将配置持久化保存到硬盘

redis-trib.rb set-timeout 10.180.157.199:6379 30000

注释:10.180.157.199:6379是cluster集群任意一个旧的节点,用来定位所在的cluster集群




#(7)import将外部redis数据导入集群
import命令可以把外部的redis节点数据导入集群。导入的流程如下:


1、通过load_cluster_info_from_node方法转载集群信息,check_cluster方法检查集群是否健康。
2、连接外部redis节点,如果外部节点开启了cluster_enabled,则提示错误。
3、通过scan命令遍历外部节点,一次获取1000条数据。
4、遍历这些key,计算出key对应的slot。
5、执行migrate命令,源节点是外部节点,目的节点是集群slot对应的节点,如果设置了--copy参数,则传递copy参数,如果设置了--replace,则传递replace参数。
6、不停执行scan命令,直到遍历完全部的key。
7、至此完成整个迁移流程

这中间如果出现异常,程序就会停止。没使用--copy模式,则可以重新执行import命令,使用--copy的话,最好清空新的集群再导入一次。


import命令更适合离线的把外部redis数据导入,在线导入的话最好使用更专业的导入工具,以slave的方式连接redis节点
去同步节点数据应该是更好的方式。
redis-trib.rb import --from 10.0.10.1:6379 10.10.10.1:7000

注释: 10.0.10.1:6379(redis 2.8)上的数据导入到 10.10.10.1:7000这个节点所在的集群













































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值