1.Cluster集群扩容概念
当redis数据量日渐增长,当内存不够用的时候,这时候就需要集群扩容了,cluster集群扩容可以增加内存也可以增加节点,因为redis数据都是存在内存中
redis cluster增加节点进行扩容步骤:
1.在新的服务器上部署redis cluster
2.使用工具将新部署的节点加到集群中
3.使用工具将集群槽位重新分配
4.将主从复制关系调整成交叉模式
扩容原理: 原来的节点算好要拿出多少的槽位给新加的节点,新加的节点准备导入的槽位,准备的前提条件就是加入集群,一切准备就绪后,主节点将划分出来的槽位分配给新节点,然后将相关槽位的数据迁移到新的节点
4个节点的redis cluster,每个节点的槽位时16384/4,一个节点4096个槽位
扩容前后的架构图对比图
新增节点后,主从复制就变成了四主四从,只需要变动192.168.81.230的从库关系即可,192.168.81.230节点从库复制192.168.81.240节点的主库,192.168.81.240从库复制192.168.81.210的主库
环境准备
2.在新节点部署redis cluster
1.将redis管理工具从redis-1拷贝到redis-4并安装 [root@redis-1 ~]# scp -rp /data/redis_cluster root@192.168.81.240:/data [root@redis-4 ~]# cd /data/redis_cluster/redis-3.2.9 [root@redis-4 /data/redis_cluster/redis-3.2.9]# make install 2.创建部署路径 [root@redis-4 ~]# mkdir -p /data/redis_cluster/redis_{6390,6391}/{conf,data,logs,pid} 2.准备配置文件 [root@redis-4 ~]# cat > /data/redis_cluster/redis_6390/conf/redis_6390.conf <<EOF bind $(ifconfig | awk 'NR==2{print $2}') port 6390 daemonize yes logfile /data/redis_cluster/redis_6390/logs/redis_6390.log pidfile /data/redis_cluster/redis_6390/pid/redis_6390.log dbfilename "redis_6390.rdb" dir /data/redis_cluster/redis_6390/data cluster-enabled yes cluster-config-file node_6390.conf cluster-node-timeout 15000 save 60 10000 save 300 10 save 900 1 EOF [root@redis-4 ~]# cat > /data/redis_cluster/redis_6391/conf/redis_6391.conf <<EOF bind $(ifconfig | awk 'NR==2{print $2}') port 6391 daemonize yes logfile /data/redis_cluster/redis_6391/logs/redis_6391.log pidfile /data/redis_cluster/redis_6391/pid/redis_6391.log dbfilename "redis_6391.rdb" dir /data/redis_cluster/redis_6391/data cluster-enabled yes cluster-config-file node_6391.conf cluster-node-timeout 15000 save 60 10000 save 300 10 save 900 1 EOF 3.启动redis [root@redis-4 ~]# ./redis_shell.sh start 6390 [root@redis-4 ~]# ./redis_shell.sh start 6391
3.使用工具将redis-4加入集群
在原来集群的任意一台机器安装了ruby环境即可操作
3.1.安装ruby环境
//安装ruby管理工具 [root@redis-1 ~]# yum -y install rubygems //移除官网源 [root@redis-1 ~]# gem sources --remove https://rubygems.org/ https://rubygems.org/ removed from sources //增加阿里云源 [root@redis-1 ~]# gem sources -a http://mirrors.aliyun.com/rubygems/ http://mirrors.aliyun.com/rubygems/ added to sources //更新缓存 [root@redis-1 ~]# gem update --system ruby2.3.0以下版本执行会报错 //安装ruby支持redis的插件 [root@redis-1 ~]# gem install redis -v 3.3.5 Fetching: redis-3.3.5.gem (100%) Successfully installed redis-3.3.5 Parsing documentation for redis-3.3.5 Installing ri documentation for redis-3.3.5 1 gem installed
3.2.将redis-4加入集群
需要将redis-4的6390和6391端口都加入到集群,可以使用工具进行添加
命令:./redis-trib.rb add-node 新节点:端口 现有集群:端口
[root@redis-1 ~]# cd /data/redis_cluster/redis-3.2.9/src/ [root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb add-node 192.168.81.240:6390 192.168.81.210:6380 [root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb add-node 192.168.81.240:6391 192.168.81.210:6380
查看集群信息,已经有8个节点
[root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 cluster nodes ce75dacf45d3ad4f852b7fb4d359a295b8a2bcdd 192.168.81.220:6380 master - 0 1612424799243 2 connected 5461-10922 9b7641253ea66073d865accdd4460d2877f9ff5d 192.168.81.220:6381 master - 0 1612424801262 8 connected 10923-16383 b19722a1d3d482a2c6eaaec15e5e72018600389f 192.168.81.240:6391 master - 0 1612424797227 0 connected 6b6ca5d58187ecbf0bff15d71a5789f4aa78cfa2 192.168.81.240:6390 master - 0 1612424796216 9 connected bdd20b03b573b2def6a9ee5053a75867709fc908 192.168.81.210:6381 slave ce75dacf45d3ad4f852b7fb4d359a295b8a2bcdd 0 1612424796721 4 connected 812ae8ccf55d8994f1f9d30a20f6cff42fb24b4a 192.168.81.230:6380 slave 9b7641253ea66073d865accdd4460d2877f9ff5d 0 1612424800253 8 connected 904a0109976cae38e5a3059fd70ce2727a0ed8fb 192.168.81.230:6381 slave b61b8d0421b94b9de7267dda6c6f401a42622047 0 1612424798232 6 connected b61b8d0421b94b9de7267dda6c6f401a42622047 192.168.81.210:6380 myself,master - 0 0 1 connected 0-5460
4.将槽位重新分配
当新节点加入集群后,需要重新分配槽位,否则整个集群是无法使用的
命令格式./redis-trib.rb reshard 集群任意一个主库的ip:端口
分配的时候可以选择all,直接将所有节点分出一部分槽位迁移给新节点
也可以指定某个节点迁移出一部分槽位给新节点
4.1.所有节点分出槽位给新节点
[root@redis-1 ~]# cd /data/redis_cluster/redis-3.2.9/src [root@redis-1 /data/redis_cluster/redis-3.2.9/src]# ./redis-trib.rb reshard 192.168.81.210:6380 How many slots do you want to move (from 1 to 16384)? 4096 //需要迁移的槽位数量,也就是要拿出多少个槽位给新节点,我们输入4096,因为16384除4刚好是4096 What is the receiving node ID? 6b6ca5d58187ecbf0bff15d71a5789f4aa78cfa2 //迁移给目标节点的ID号,也就是新节点的6390ID号,6390作为新节点的主库 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 //迁移方式:all将所有主节点分出一部分槽位给新节点 Do you want to proceed with the proposed reshard plan (yes/no)? yes //是否继续分配
设置要迁移的槽位数量,填写4096
填写要迁移到目标节点的ID号,也就是要迁移给谁,这里我们要迁移给新加的节点,我们要让新机器的6390节点成为主库,因此就填写6390节点的ID号
设置要从哪个节点上迁移槽位,可以一台一台的迁移,也可以填写all,all的意思是从所有节点上一共取出4096个槽位分给新机器,如果使用all迁移,会把所有主节点迁移出一部分槽位给新节点,执行完all直接就退出工具
我们使用all自动将所有主节点进行迁移,直接输入all即可自动迁移,一般都使用all
提示我们是否继续分配,我们选择yes
迁移完成自动退出程序
4.2.迁移指定节点的槽位给新节点
前面步骤一致,只需要在source node选择指定节点即可
填写要迁移的主节点ID,填写完主机节点ID后,输入done,回车之后开始迁移数据
提示我们是否继续,我们输入yes
开始数据迁移
4.3.查看集群信息及状态
当6390分配完槽位后,可以看下集群信息是否分配成功
[root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 cluster nodes
可以看到6390上有3段槽位号,说明是从三个节点上分出来的,正好也验证了之前说的一句话,槽位顺序不一定要存在,只要槽位数量够就可以
再次使用reshard命令即可看到都是4096个槽位
查看集群状态
[root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:8 #节点数已经是8个了 cluster_size:4 cluster_current_epoch:11 cluster_my_epoch:1 cluster_stats_messages_sent:67364 cluster_stats_messages_received:67293
5.配置四主四从交叉复制
目前是5个主节点3个从节点,显然是不合理的,我们要手动配置一些交叉复制实现四主四从
只需要操作192.168.81.230的6381端口和192.168.81.240的6391端口即可
192.168.81.230的6381端口作为192.168.81.240的6390端口的从库
192.168.81.240的6391作为192.168.81.210的6380端口的从库
再配置与新节点交叉复制的时候,建议先操作192.168.81.230,这样192.168.81.210的主库就没有需要传输rdb文件到从库了,也可以减轻主库的压力,如果先让192.168.81.240配置交叉,这样一来192.168.81.210的主库就有2份复制了,主库就需要一次传输2份rdb文件,压力也就大了
注意:先做192.168.81.230的交叉在做192.168.81.240的交叉
5.1.配置四主四从交叉复制
1.将master主库的所有ID获取下来 [root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 cluster nodes | grep 'master' | awk '{print $1,$2}' ce75dacf45d3ad4f852b7fb4d359a295b8a2bcdd 192.168.81.220:6380 6b6ca5d58187ecbf0bff15d71a5789f4aa78cfa2 192.168.81.240:6390 812ae8ccf55d8994f1f9d30a20f6cff42fb24b4a 192.168.81.230:6380 b61b8d0421b94b9de7267dda6c6f401a42622047 192.168.81.210:6380 2.建议在记事本里准备好命令 redis-3同步redis-4 192.168.81.230:6381> CLUSTER REPLICATE 6b6ca5d58187ecbf0bff15d71a5789f4aa78cfa2 redis-4同步redis-3 192.168.81.240:6391> CLUSTER REPLICATE b61b8d0421b94b9de7267dda6c6f401a42622047
5.2.查看集群信息及状态
[root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 cluster nodes [root@redis-1 ~]# redis-cli -h 192.168.81.210 -p 6380 cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:8 cluster_size:4 cluster_current_epoch:11 cluster_my_epoch:1 cluster_stats_messages_sent:69698 cluster_stats_messages_received:69627 [root@redis-1 ~]#
已经是三主三从了,并且集群状态也是ok