当前位置: 首页 > news >正文

企业级Redis Cluster部署详解及演练

7.Redis Cluster(无中心化设计)

7.1 Redis Cluster 工作原理

在哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master,从而可以保证redis服务的正常使用,但是无法解决redis单机写入的瓶颈问题,即单机redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素。

redis 3.0版本之后推出了无中心架构的redis cluster机制,在无中心的redis集群当中,其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连接

7.1.1 Redis Cluster特点
  1. 所有Redis节点使用(PING机制)互联

  2. 集群中某个节点的是否失效,是由整个集群中超过半数的节点监测都失效,才能算真正的失效

  3. 客户端不需要proxy即可直接连接redis,应用程序中需要配置有全部的redis服务器IP

  4. redis cluster把所有的redis node 平均映射到 0-16383个槽位(slot)上,读写需要到指定的redis node上进行操作,因此有多少个redis node相当于redis 并发扩展了多少倍,每个redis node 承担16384/N个槽位

  5. Redis cluster预先分配16384个(slot)槽位,当需要在redis集群中写入一个key -value的时候,会使用CRC16(key) mod 16384之后的值,决定将key写入值哪一个槽位从而决定写入哪一个Redis节点上,从而有效解决单机瓶颈。

7.1.2 Redis cluster 架构

image-20250804114856593

假如三个主节点分别是:A, B, C 三个节点,采用哈希槽 (hash slot)的方式来分配16384个slot 的话它们三个节点分别承担的slot 区间可以是:

节点A覆盖 0-5460
节点B覆盖 5461-10922
节点C覆盖 10923-16383

image-20250804114903522

7.1.2.1 Redis cluster 主从架构

Redis cluster的架构虽然解决了并发的问题,但是又引入了一个新的问题,每个Redis master的高可用如何解决?

那就是对每个master 节点都实现主从复制,从而实现 redis 高可用性

image-20250804114912437

7.1.2.2 Redis Cluster 部署架构说明

image-20250804114918860

7.2 创建redis cluster的前提

1.每个redis node节点采用相同的硬件配置、相同的密码、相同的redis版本。

2.每个节点必须开启的参数

  • cluster-enabled yes # 必须开启集群状态,开启后redis进程会有cluster显示
  • cluster-config-file nodes-6380.conf # 此文件有redis cluster集群自动创建和维护,不需要任何手动操作

3.所有redis服务器必须没有任何数据

4.先启动为单机redis且没有任何key value

7.3 部署redis cluster

在所有redis主机中

dnf install redis -ysystemctl disable --now firewalldsystemctl enable --now redis
[root@redis-masterx ~]# vim /etc/redis/redis.conf
bind * -::*
masterauth "123456"					# 集群主从认证
requirepass "123456"				# redis登陆密码	redis-cli 命令连接redis后要用“auth 密码”进行认证cluster-enabled yes					# 开启cluster集群功能
cluster-config-file nodes-6379.conf	# 指定集群配置文件
cluster-node-timeout 15000			# 节点加入集群的超时时间单位是ms[root@redis-master1 ~]# systemctl restart redis.service
# 测试
[root@redis-master1 ~]# redis-cli -a 123456 info
# Cluster
cluster_enabled:1
image-20250804183309195
# 如果想省事,建议使用scp
[root@redis-node1 ~]# vim /etc/redis/redis.conf
[root@redis-node1 ~]# systemctl restart redis.service[root@redis-node1 ~]# scp  /etc/redis/redis.conf  root@172.25.254.60:/etc/redis/redis.conf
[root@redis-node1 ~]# scp  /etc/redis/redis.conf  root@172.25.254.50:/etc/redis/redis.conf
[root@redis-node1 ~]# scp  /etc/redis/redis.conf  root@172.25.254.40:/etc/redis/redis.conf
[root@redis-node1 ~]# scp  /etc/redis/redis.conf  root@172.25.254.30:/etc/redis/redis.conf
[root@redis-node1 ~]# scp  /etc/redis/redis.conf  root@172.25.254.20:/etc/redis/redis.conf# 最后一定要在每个主机中执行
systemctl restart redis.service

7.4 redis-cli --cluster 参数说明

[root@redis-master1 ~]# redis-cli --cluster help
Cluster Manager Commands:create         host1:port1 ... hostN:portN		#创建集群--cluster-replicas <arg>			#指定master的副本数check          <host:port> or <host> <port> 		#检测集群信息info           <host:port> or <host> <port> 		#查看集群信息fix            <host:port> or <host> <port> 		#修复集群reshard        <host:port> or <host> <port> 		#在线热迁移集群指定主机的slots数据rebalance      <host:port> or <host> <port> 		#平衡各集群主机的slot数量add-node       new_host:new_port existing_host:existing_port	#添加主机del-node       host:port node_id						#删除主机import         host:port								#导入外部redis服务器的数据到当前集群-

7.5 创建redis-cluster

[root@redis-master1 ~]# redis-cli  --cluster create -a 123456 \
> 172.25.254.10:6379 172.25.254.20:6379 172.25.254.30:6379 \
> 172.25.254.40:6379 172.25.254.50:6379 172.25.254.60:6379 \
> --cluster-replicas 1#### 以下命令可以直接复制(与上面相同)
#### redis-cli  --cluster create -a 123456 172.25.254.10:6379 172.25.254.20:6379 172.25.254.30:6379 172.25.254.40:6379 172.25.254.50:6379 172.25.254.60:6379 --cluster-replicas 1
####>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460				#哈希槽分配
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.25.254.120:6379 to 172.25.254.10:6379		#主从分配情况
Adding replica 172.25.254.130:6379 to 172.25.254.20:6379
Adding replica 172.25.254.110:6379 to 172.25.254.30:6379>>> Check for open slots...			#检查打开的哈希槽位
>>> Check slots coverage...			#检查槽位覆盖范围
[OK] All 16384 slots covered.		#所有槽位分配完成# 配置文件位置
[root@redis-master1 ~]# ll /var/lib/redis/nodes-6379.conf

image-20250804184138964

# 分配情况如下:

image-20250804184951935

image-20250804184819396

7.5.1 检测redis集群状态
[root@redis-master1 ~]# redis-cli  -a 123456 --cluster info  172.25.254.10:6379		# 查看集群状态,获取Redis集群的全局拓扑状态[root@redis-master1 ~]# redis-cli -a 123456  cluster info							# 查看当前连接节点视角的集群状态[root@redis-master1 ~]# redis-cli  -a 123456 --cluster check 172.25.254.10:6379		# 检测集群,执行深度集群健康诊断
image-20250804185245446 image-20250804185040727 image-20250804185122365 image-20250804185055077
7.5.2 写入数据并测试
# 在10上测试,提示本机哈希槽被分配到20上
[root@redis-node1 ~]# redis-cli -a 123456
127.0.0.1:6379> set name ceshi
(error) MOVED 5798 172.25.254.20:6379# 在20上进行测试
[root@redis-node2 ~]# redis-cli -a 123456
127.0.0.1:6379> set name ceshi
OK
127.0.0.1:6379> get name
"ceshi"
image-20250804184433824 image-20250804185631512

7.6 集群扩容

# 添加master
[root@redis-node1 ~]# redis-cli -a 123456 --cluster  add-node 172.25.254.70:6379 172.25.254.10:6379# 分配槽位
[root@redis-node1 ~]# redis-cli  -a 123456 --cluster reshard  172.25.254.10:6379How many slots do you want to move (from 1 to 16384)? 4096						# 分配哈希槽的大小(16384/4=4096)
What is the receiving node ID? 28f73db3a7003fdb0ba510cf7fd802b4da3ea94b			# 新添加master的id
Source node #1: all																# all-->从其余三台平均分4096个# 添加salve
[root@redis-master1 ~]# redis-cli -a 123456 --cluster  add-node 172.25.254.80:6379 172.25.254.10:6379 --cluster-slave --cluster-master-id 28f73db3a7003fdb0ba510cf7fd802b4da3ea94b

7.7 clsuter集群维护

添加节点的时候是先添加node节点到集群,然后分配槽位,删除节点的操作与添加节点的操作正好相反,是先将被删除的Redis node上的槽位迁移到集群中的其他Redis node节点上,然后再将其删除,如果一个Redis node节点上的槽位没有被完全迁移,删除该node的时候会提示有数据且无法删除。

# 先查看一下
[root@redis-node1 ~]# redis-cli  -a 123456 --cluster check 172.25.254.10:6379
# 移除要下线主机的哈希槽位
[root@redis-node1 ~]# redis-cli  -a 123456 --cluster reshard 172.25.254.10:6379			# 此处只是进入reshard的管理界面 # 删除master
[root@redis-node1 ~]# redis-cli  -a 123456 --cluster del-node  172.25.254.70:6379 d458f34fa900d83212c021dc1e65396e490b5495[root@redis-node1 ~]# redis-cli  -a 123456 --cluster del-node  172.25.254.80:6379 5ab2e93f4f0783983676f7bd118efaacfb202bd1
http://www.dtcms.com/a/316859.html

相关文章:

  • 森赛睿科技成为机器视觉产业联盟会员单位
  • 解决cv::dilate处理后的图像边缘像素出现异常值的问题
  • 结构化设计工具与技术详解
  • Spring 的优势
  • 内部排序算法总结(考研向)
  • 从递归到动态规划-解码方法Ⅱ
  • 软件测试面试如何避坑呢?
  • 8.5 各种攻击实验
  • 使用 BAML 模糊解析改进 LangChain 知识图谱提取:成功率从25%提升到99%
  • 无人机陀螺仪模块技术解析
  • SQL的LEFT JOIN优化
  • 【C语言】动态内存管理详解
  • Centos7 、9 、OpenEuler 22、24对比
  • TCP协议与UDP协议
  • 十六、请求响应-响应:三层架构-分层解耦
  • 信息安全的概述
  • RabbitMQ延时队列的两种实现方式
  • C++算法竞赛篇(九)字符数组题型讲解
  • 坚鹏:AI智能体软件是知行学成为AI智能体创新应用引领者的抓手
  • uvm-register-backdoor-access
  • SpringBoot AI心理学训练实战
  • 更改CodeBuddy的默认terminal为Git Bash
  • 随机森林算法详解:从集成学习原理到代码实现
  • Java技术栈/面试题合集(11)-设计模式篇
  • java web 未完成项目,本来想做个超市管理系统,前端技术还没学。前端是个简单的html。后端接口比较完善。
  • MySQL内外连接详解
  • 学习笔记-相似度匹配改进2
  • 机器学习——随机森林
  • Python高级编程与实践:Python高级数据结构与编程技巧
  • 【C++】Stack and Queue and Functor