rediscluster集群扩容主从节点详细教程(代码片段)

Jiangxl~ Jiangxl~     2023-02-01     371

关键词:

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的主库

环境准备

IP主机名端口号节点
192.168.81.210redis-16380master
192.168.81.210redis-16381slave—>redis-2
192.168.81.220redis-26380master
192.168.81.220redis-26381slave—>redis-3
192.168.81.230redis-36380master
192.168.81.230redis-36381(slave—>redis-1)x slave—>redis-4
192.168.81.240redis-46390master
192.168.81.240redis-46391slave—>redis-1

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==2print $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==2print $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

rediscluster集群原理+实战(代码片段)

目录[图片上传失败…(image-fd8c53-1617457870946)]RedisCluster集群原理+实战背景之前我们介绍过Redis主从集群+哨兵的搭建,架构如下图所示这种集群模式下水平扩容和垂直扩容都可以实现,并且可以实现高可用性和易用性... 查看详情

「故障演练」rediscluster集群,当master宕机,主从切换

...缓存的身影,为了保证缓存服务的高可用,我们通常采用RedisCluster集群模式。描述:集群部署采用了3主3从拓扑结构,数据读写访问master节点,slave节点负责备份。随便登录一台redis节点,都可以看到集群的slot的槽位分步区间,... 查看详情

redis开发与运维rediscluster集群(代码片段)

文章目录一、集群伸缩原理扩容收缩二、请求路由请求重定向客户端原理JedisCluster一、集群伸缩原理Redis集群提供了灵活的节点扩容和收缩方案,其中的原理可以抽象为槽和对应数据在不同节点之间灵活移动。扩容准备新节... 查看详情

rediscluster集群模式下master宕机主从切换期间rediscommandtimedout的问题(代码片段)

 一、异常场景如下表所示,redis集群6个节点分别部署在3台机器上,每台机器分布一个主节点和一个从节点机器redis主节点端口redis从节点端口主机170017004主机270037006主机370057002将主机1关闭,redis集群发生主从切换,从节点7006... 查看详情

故障演练rediscluster集群,当master宕机,主从切换,客户端报错timedout(代码片段)

...缓存的身影,为了保证缓存服务的高可用,我们通常采用RedisCluster集群模式。描述:集群部署采用了3主3从拓扑结构,数据读写访问master节点,slave节点负责备份。随便登录一台redis节点,都可以看到集群的slot的槽位分步区间,... 查看详情

redis集群模式2-rediscluster模式

...同步数据,冗余的数据比较多。从Redis3.0开始官方推出了RedisCluster集群模式,采用分片集群模式,可以减少冗余数据,但也提高了集群成本,RedisCluster集群最大的优点:动态扩容、缩容。以最简单的为例,分别搭建3组节点,每组... 查看详情

docker下rediscluster分片集群搭建

...,redis推出Cluster集群架构,该结构具有如下特点:(1)RedisCluster采用的是基于P2P的去中心化的网络拓扑架构,没有中心节点,所有节点既是数据存储节点,也是控制节点;(2)引入槽(slot)的概念,通过CRC+hashslot算法支持多个主... 查看详情

rediscluster集群选主

...redis数据淘汰原理redis过期数据删除策略redisserver事件模型redisclustermget引发的讨论redis3.xwindows集群搭建redis命令执行过程redisstring底层数据结构redislist底层数据结构redishash底层数据结构redisset底层数据结构rediszset底层数据结构redis客... 查看详情

redis中主从哨兵和集群这三种模式有什么区别?

...、哨兵、集群各自架构的优点和缺点对比Sentinel哨兵模式rediscluster集群高性能高可用Redis集群数据共享槽的计算公式Redis中主从、哨兵和集群这三种模式有什么区别?主从模式:备份数据、负载均衡,一个Master可以有多个Slaves。sen... 查看详情

接近3w详解docker搭建redis集群(主从容错主从扩容主从缩容)(代码片段)

1、场景解决方案1、哈希取余分区优点:简单粗暴,直接有效,只需要预估好数据规划好节点,例如3台、8台、10台,就能保证一段时间的数据支撑。使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处... 查看详情

rediscluster的部署与维护(代码片段)

1、RedisCluster的工作原理  不管是Redis的主从复制,还是基于主从复制环境之上的Redis哨兵(Sentinel)模式,这些都是做到了数据的远程备份,并且在哨兵模式下还可以做到原主节点故障后的新主节点的自动转移,但是还是没办... 查看详情

rediscluster集群搭建

参考技术A目前手头上只有3台物理机,所以采取每台服务器开启2台实例构建基础主从。服务器:ubuntu20.04redis:6.2.6地址规划与结构图:简单说明:分别修改3台物理机的/etc/hosts文件,添加如下内容在node1(192.168.100.101)上进行操作:... 查看详情

rediscluster的部署与维护

...,提高Redis的性能,可以采用分布式集群的解决方案,即RedisCluster。部署RedisCluster1.1准备 查看详情

解决k8s集群中rediscluster故障

...d是正常的,应用又报redis链接的错误,所以问题肯定出在RedisCluster上,查看RedisCluster状态:这个示意图我只画出三个node,简单表达一下意思即可。三个node上各运行了一个master和一个slave节点。由于node3节点故障已经移除集群,这... 查看详情

redis集群相关

...点,并进行数据查询发现获取数据异常!分析:消息机制rediscluster集群中通过消息来进行通信。消息共有以下5种。meet消息:发送者会向接受 查看详情

redis-cluster

参考技术A是一种去中心化的集群架构RedisCluster的性能与单节点部署是同级别的。多主节点、负载均衡、读写分离RedisCluster支持标准的主从复制配置来保障高可用和高可靠。failover(故障转移)RedisCluster也实现了一个类似Raft的共... 查看详情

rediscluster初探之部署(代码片段)

一、简介在3.0版本之前,redis通过哨兵实现主从的高可用,在3.0版本之后,redis官方推出了高可用的redis集群解决方案。重点知识:数据分区分布式数据库是将数据根据分区规则划分到多个节点上,每个节点负责存储一部分数据;... 查看详情

redis开发与运维rediscluster集群(代码片段)

文章目录一、故障转移故障发现故障恢复二、集群运维集群完整性带宽消耗Pub/Sub广播问题集群倾斜集群读写分离数据迁移一、故障转移故障发现Redis集群不需要依赖哨兵,自身实现了高可用。高可用首先需要解决集群部分失... 查看详情