NoSql数据库 - Redis Cluster集群详解及案例实现
创始人
2024-09-26 14:47:01
0

Redis Cluster集群(无中心化设计)

1.1 Redis Cluster 工作原理

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

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

Redis Cluster特点如下

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

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

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

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

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

Redis Cluster架构

在这里插入图片描述

1.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

1.3 Redis Cluster的环境部署

部署架构说明:

在这里插入图片描述

主机名IP角色
redis-node1172.25.254.14master 1
redis-node2172.25.254.24master 2
redis-node3172.25.254.34master 3
redis-node4172.25.254.44slave 1
redis-node5172.25.254.54slaveslave 2
redis-node6172.25.254.64slave 3
redis-node7172.25.254.74master 4(扩容)
redis-node8172.25.254.84slave 4(扩容)

注意:以下案例实现的操作环境都为Rhel9.1

# 配置好以上后,需要将防火墙关闭,以防影响案例的实现 [root@redis-node1 ~]# systemctl stop firewalld.service  [root@redis-node1 ~]# systemctl mask firewalld.service  [root@redis-node1 ~]# setenforce 0 

1.4 部署redis cluster

以下配置在所有redis-node主机中进行配置

1.# 安装redis [root@redis-node1 ~]# yum install redis -y  # 安装redis  2.# 设定主配置文件 [root@redis-node1 ~]# vim /etc/redis/redis.conf          bind * -::*                 # 开启redis的端口 masterauth "123456" 		# 集群主从认证 requirepass "123456" 		# redis登陆密码 redis-cli 命令连接redis后要用“auth 密码”进行认证 cluster-enabled yes 		# 开启cluster集群功能 cluster-config-file nodes-6379.conf # 指定集群配置文件 cluster-node-timeout 15000 	# 节点加入集群的超时时间单位是ms  3.# 将修改好的主配置文件拷贝到其他redis主机中 [root@redis-node1 ~]# for i in 24 34 44 54 64 74 84 > do > scp /etc/redis/redis.conf root@172.25.254.$i:/etc/redis/redis.conf > done  

测试:

[root@redis-node1 ~]# redis-cli 127.0.0.1:6379> keys *              # 查询所有key (error) NOAUTH Authentication required.     # 提示需要密码验证 127.0.0.1:6379> auth 123123         # 输入密码进行验证 OK 127.0.0.1:6379> keys *       # 可以在查询key了 (empty array)                # 此时不存在key 127.0.0.1:6379> set name haha    # 尝试写入数据 (error) CLUSTERDOWN Hash slot not served  # 提示哈希槽未提供 127.0.0.1:6379> 

1.5 redis-cli (Cluster)参数说明

参数说明
cteate创建集群
check指定master的副本数
info检测集群信息
fix修复集群
reshard在线热迁移集群指定主机的slots数据
rebalance平衡各集群主机的sloat数量
ass-node添加主机
del-node删除主机
import导入外部redis服务器的数据到当前集群

1.6 创建Redis-Cluster

三主三从

1.6.1 Redis-Cluster配置

# 在redis-node1中进行写入 [root@redis-node1 ~]# redis-cli --cluster create -a 123123 \ > 172.25.254.14:6379 172.25.254.24:6379 172.25.254.34:6379 \ > 172.25.254.44:6379 172.25.254.54:6379 172.25.254.64:6379 \ > --cluster-replicas 1            # 启用集群数1 

在这里插入图片描述

1.6.2 检测redis的状态

1.检测集群

[root@redis-node1 ~]# redis-cli -a 123123 --cluster check 172.25.254.14:6379 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 172.25.254.14:6379 (f4b7f2f4...) -> 0 keys | 5461 slots | 1 slaves. 172.25.254.24:6379 (fd0a3870...) -> 0 keys | 5462 slots | 1 slaves. 172.25.254.34:6379 (3f0d0fe7...) -> 0 keys | 5461 slots | 1 slaves. [OK] 0 keys in 3 masters. 0.00 keys per slot on average. >>> Performing Cluster Check (using node 172.25.254.14:6379) M: f4b7f2f48521679edc7744c80782f662c61a2bff 172.25.254.14:6379    slots:[0-5460] (5461 slots) master    1 additional replica(s) S: 24ee61e1ee3ad2a8b509922f5aaae1370212566e 172.25.254.64:6379    slots: (0 slots) slave    replicates fd0a38707dcfcc5f74e61857bbf101bbb16f6b6f M: fd0a38707dcfcc5f74e61857bbf101bbb16f6b6f 172.25.254.24:6379    slots:[5461-10922] (5462 slots) master    1 additional replica(s) M: 3f0d0fe71de65370bde9cc742c9555e31079aec4 172.25.254.34:6379    slots:[10923-16383] (5461 slots) master    1 additional replica(s) S: 17d0bdc6b738484dc026d55509ed947c55c6c6cf 172.25.254.44:6379    slots: (0 slots) slave    replicates 3f0d0fe71de65370bde9cc742c9555e31079aec4 S: ce9f76a54d24c5c7d73838e46f6d6631b8aa35b3 172.25.254.54:6379    slots: (0 slots) slave    replicates f4b7f2f48521679edc7744c80782f662c61a2bff [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. 

2.查看集群的状态

[root@redis-node1 ~]# redis-cli -a 123123 --cluster info 172.25.254.14:6379 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 172.25.254.14:6379 (f4b7f2f4...) -> 0 keys | 5461 slots | 1 slaves. 172.25.254.24:6379 (fd0a3870...) -> 0 keys | 5462 slots | 1 slaves. 172.25.254.34:6379 (3f0d0fe7...) -> 0 keys | 5461 slots | 1 slaves. [OK] 0 keys in 3 masters. 0.00 keys per slot on average. 

3.写入数据

[root@redis-node1 ~]# redis-cli -a 123123 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6379> set name haha (error) MOVED 9189 172.25.254.24:6379         # 被分配到24(redis-node2)的hash槽位上  [root@redis-node2 ~]# redis-cli -a 123123 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6379> set name haha OK 

4.读取数据

通过查看当前通过hash分配的写入主机master2查看对应的slave

在这里插入图片描述

去到与master2对应的slave3去查看数据

[root@redis-node6 ~]# redis-cli -a 123123 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6379> get name     # 查看数据 (error) MOVED 5798 172.25.254.24:6379      # 但是此时发现还是查看不了 

原因是:此时我们通过查看master2的集群可以发现,对应的slacve中没有分配hash槽位,只有当master故障后,才会分配到对应的slave hash槽位,这时才能去查看数据

在这里插入图片描述

1.7 集群扩容

四主四从

1.7.1 添加Master

# 添加master [root@redis-node1 ~]# redis-cli -a 123123 --cluster add-node 172.25.254.74:6379 172.25.254.14:6379 

在这里插入图片描述

查看master是否已添加

[root@redis-node1 ~]# redis-cli -a 123123 --cluster info 172.25.254.14:6379 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 172.25.254.14:6379 (f4b7f2f4...) -> 0 keys | 5461 slots | 1 slaves. 172.25.254.74:6379 (2c6ed811...) -> 0 keys | 0 slots | 0 slaves.        # 添加的master成功 172.25.254.24:6379 (fd0a3870...) -> 1 keys | 5462 slots | 1 slaves. 172.25.254.34:6379 (3f0d0fe7...) -> 0 keys | 5461 slots | 1 slaves. [OK] 1 keys in 4 masters. 0.00 keys per slot on average. 

1.7.2 分配槽位

[root@redis-node1 ~]# redis-cli -a 123123 --cluster reshard 172.25.254.14:6379 

在这里插入图片描述

1.7.3 添加slave

[root@redis-node1 ~]# redis-cli -a 123123 add-node \ > 172.25.254.84:6379 172.25.254.14:6379 \ > --cluster-slave --cluster-master-id 2c6ed8115e3c8bbf8c6ef79fbba14ce7a4d08a5e 

在这里插入图片描述

1.7.4 查看集群

[root@redis-node1 ~]# redis-cli -a 123123 --cluster check 172.25.254.14:6379 

在这里插入图片描述

1.8Redis-Cluster集群的维护

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

1.移除需要下线的Master对应的Slave

[root@redis-node1 ~]# redis-cli -a 123123 --cluster del-node 172.25.254.84:6379 9dd9585dee4b05c5d733ed28b1f98f555783e394         # 需要移除的Slave对应的IP及ID Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Removing node 9dd9585dee4b05c5d733ed28b1f98f555783e394 from cluster 172.25.254.84:6379 >>> Sending CLUSTER FORGET messages to the cluster... >>> Sending CLUSTER RESET SOFT to the deleted node.  [root@redis-node1 ~]# redis-cli -a 123123 --cluster check 172.25.254.14:6379  # 查看集群删除的slave是否已经删除 

2.移除要下线主机的哈希槽位

[root@redis-node1 ~]# redis-cli -a 123123 --cluster reshard 172.25.254.14:6379 

在这里插入图片描述

3.移除master

[root@redis-node1 ~]# redis-cli -a 123123 --cluster del-node 172.25.254.74:6379 2c6ed8115e3c8bbf8c6ef79fbba14ce7a4d08a5e Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Removing node 2c6ed8115e3c8bbf8c6ef79fbba14ce7a4d08a5e from cluster 172.25.254.74:6379 >>> Sending CLUSTER FORGET messages to the cluster... >>> Sending CLUSTER RESET SOFT to the deleted node. 

重新查看集群:

在这里插入图片描述

以上通过对比,可以看出,master和对应的slave已经移除

相关内容

热门资讯

海事综合服务系统安卓,便捷航运... 你有没有想过,出海航行的时候,那些忙碌的船员们是如何轻松搞定各种繁琐的海事手续的呢?嘿这都得归功于一...
安卓系统优势在哪找到,开放生态... 你有没有发现,现在手机的世界里,安卓系统就像是个超级明星,无处不在,魅力四射!那么,这个安卓系统到底...
安卓系统如何关闭分身,轻松释放... 亲爱的手机控们,你们是不是也和我一样,对手机里的分身功能爱恨交加呢?一边享受着两个账号同时登录的便利...
修改安卓系统的工具,安卓系统工... 亲爱的手机控们,你是否曾想过给你的安卓手机来个“大变身”?别急,今天我要给你揭秘那些神奇的修改安卓系...
安卓系统钱箱怎么设置,轻松创建... 你有没有想过,你的安卓系统钱箱是怎么设置的?是不是每次看到它,都感觉有点神秘呢?别急,今天就来给你揭...
安卓系统虚拟windows系统... 亲爱的电脑迷们,你们有没有想过,在Windows系统上直接运行安卓手机应用?想象你坐在电脑前,一边处...
安卓手机玩鸿蒙系统,体验鸿蒙系... 你有没有想过,你的安卓手机能不能玩鸿蒙系统呢?这可不是个简单的问题,里面可是藏着不少门道呢!今天,我...
安卓系统平板电脑续航,续航能力... 你有没有想过,为什么有时候拿着平板电脑,还没刷几条朋友圈,电量就“嗖”的一下子见底了呢?别急,今天就...
360安卓系统软件,全方位安全... 你有没有发现,手机里的那些小玩意儿,就像是你的贴身小助手,帮你解决各种小麻烦?今天,咱们就来聊聊36...
安卓机什么系统最好,安全稳定的... 你有没有想过,安卓机什么系统最好呢?这可是个让人纠结的问题,就像吃火锅是吃麻辣还是清汤一样,各有各的...
小米9安卓升级系统,体验流畅新... 你有没有发现,你的小米9最近是不是有点儿“慢吞吞”的?别急,别急,让我来给你支个招儿,让你的小9重新...
安卓系统有没有app,基于安卓... 你有没有想过,你的安卓手机里有没有那些特别酷炫的app呢?今天,我就要给你好好盘点让你的手机瞬间变身...
安卓12系统卡吗,性能提升与卡... 亲爱的手机控们,你是不是也遇到过这样的烦恼:手机里正玩得high,突然间,安卓12的小家伙就卡壳了,...
安卓15系统更新内容,性能飞跃... 哇塞,你有没有听说?安卓15系统更新啦!这次更新可是满满的惊喜,让我带你一起探索一下这个全新的系统吧...
安卓软件系统签名限制,数字签名... 你有没有遇到过这种情况?辛辛苦苦开发了一个安卓APP,结果一上传到应用市场,就被误报成病毒了!这可真...
安卓多系统教程没用,安卓多系统... 你有没有遇到过这种情况?满心欢喜地想要学习安卓多系统,结果一看教程,哎哟,怎么这么复杂,还都是一些没...
安卓系统怎么连接键盘,蓝牙与U... 你是不是也和我一样,对手机屏幕上的小键盘有点儿审美疲劳了呢?想要换一个更舒适、更高效的键盘来输入文字...
x431安卓系统,智能诊断新时... 你有没有想过,你的手机里竟然能藏着一个强大的汽车医生?没错,就是那个x431安卓系统!今天,就让我带...
安卓系统要装几个,副标题智能推... 你有没有想过,你的安卓手机里到底装了多少个应用程序呢?是不是有时候觉得手机越来越卡,其实是因为你装了...
华为手机也是安卓系统,引领智能... 你有没有想过,那些在我们手中滑动自如的华为手机,其实也是安卓家族的一员呢?没错,华为手机也是安卓系统...