搭建redis集群
1. 编写配置文件
[root@iZbp1htnoa70qlle394f3wZ myRedis]# vim redis6379.conf include /myRedis/redis.conf pidfile "/var/run/redis_6379.pid" port 6379 dbfilename "dump6379.rdb" cluster-enabled yes # 开启集群模式 cluster-config-file nodes-6379.conf # 设置集群节点配置文件名 cluster-node-timeout 15000 # 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
复制五份配置文件,使用命令更改信息
%s/6379/6380
创建后的目录
[root@iZbp1htnoa70qlle394f3wZ myRedis]# ll total 92 -rw-r--r-- 1 root root 181 Jun 23 13:05 redis6379.conf -rw-r--r-- 1 root root 181 Jun 23 13:10 redis6380.conf -rw-r--r-- 1 root root 181 Jun 23 13:11 redis6381.conf -rw-r--r-- 1 root root 181 Jun 23 13:11 redis6390.conf -rw-r--r-- 1 root root 181 Jun 23 13:11 redis6391.conf -rw-r--r-- 1 root root 181 Jun 23 13:12 redis6399.conf -rw-r--r-- 1 root root 63090 Jun 22 22:02 redis.conf -rw-r--r-- 1 root root 393 Jun 23 11:06 sentinel.conf
2. 启动六个redis服务
[root@iZbp1htnoa70qlle394f3wZ myRedis]# ps -ef | grep redis root 18385 18343 0 11:01 pts/4 00:00:18 redis-sentinel *:26379 [sentinel] root 18619 1 0 13:19 ? 00:00:00 redis-server *:6379 [cluster] root 18624 1 0 13:19 ? 00:00:00 redis-server *:6380 [cluster] root 18629 1 0 13:19 ? 00:00:00 redis-server *:6381 [cluster] root 18638 1 0 13:20 ? 00:00:00 redis-server *:6390 [cluster] root 18645 1 0 13:20 ? 00:00:00 redis-server *:6391 [cluster] root 18650 1 0 13:20 ? 00:00:00 redis-server *:6399 [cluster] root 18657 18531 0 13:20 pts/5 00:00:00 grep --color=auto redis
3、将六个节点合成一个集群
组合之前,请确保所有redis实例启动后,nodes-xxx.conf文件都生成正常
一定要在 /opt/redis-5.0.14/src中进行
执行命令
redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6390 127.0.0.1:6391 127.0.0.1:6399
注意建议不要用127.0.0.1IP需要使用服务器的ip
服务器需要打开端口,阿里云需要打开安全组(六台redis需要开启12个端口)
集群总线 每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比如6379,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口,例如:redis的端口为6379,那么另外一个需要开通的端口是:6379 + 10000, 即需要开启 16379。16379端口用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(Cluster bus)用于节点的失败侦测、配置更新、故障转移授权,等等。
>>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 47.110.248.227:6391 to 47.110.248.227:6379 Adding replica 47.110.248.227:6399 to 47.110.248.227:6380 Adding replica 47.110.248.227:6390 to 47.110.248.227:6381 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: 43986ee7cdb4594f424db54f7cc15c17e21d21d2 47.110.248.227:6379 slots:[0-5460] (5461 slots) master M: c52263d5fe8be9ad7a9b4f090319ca349c079760 47.110.248.227:6380 slots:[5461-10922] (5462 slots) master M: db86cb577c74d3a27faa276aec1e4a71f0757cb9 47.110.248.227:6381 slots:[10923-16383] (5461 slots) master S: e0cfe47c4fa7cd4cfdd3a0b5bd95a5291ca919b6 47.110.248.227:6390 replicates 43986ee7cdb4594f424db54f7cc15c17e21d21d2 S: b8c7b3d5c1ae39e45a424441ce3bce4455e1b693 47.110.248.227:6391 replicates c52263d5fe8be9ad7a9b4f090319ca349c079760 S: 9b082c5e69da97df763148aa5cc491675c0e4c3c 47.110.248.227:6399 replicates db86cb577c74d3a27faa276aec1e4a71f0757cb9 Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join ....... >>> Performing Cluster Check (using node 47.110.248.227:6379) M: 43986ee7cdb4594f424db54f7cc15c17e21d21d2 47.110.248.227:6379 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: 9b082c5e69da97df763148aa5cc491675c0e4c3c 47.110.248.227:6399 slots: (0 slots) slave replicates db86cb577c74d3a27faa276aec1e4a71f0757cb9 M: c52263d5fe8be9ad7a9b4f090319ca349c079760 47.110.248.227:6380 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: b8c7b3d5c1ae39e45a424441ce3bce4455e1b693 47.110.248.227:6391 slots: (0 slots) slave replicates c52263d5fe8be9ad7a9b4f090319ca349c079760 M: db86cb577c74d3a27faa276aec1e4a71f0757cb9 47.110.248.227:6381 slots:[10923-16383] (5461 slots) master 1 additional replica(s) S: e0cfe47c4fa7cd4cfdd3a0b5bd95a5291ca919b6 47.110.248.227:6390 slots: (0 slots) slave replicates 43986ee7cdb4594f424db54f7cc15c17e21d21d2 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
4. -c 采用集群策略连接,设置数据会自动切换到相应的写主机
[root@iZbp1htnoa70qlle394f3wZ myRedis]# redis-cli -c -p 6379 127.0.0.1:6379> set a a -> Redirected to slot [15495] located at 47.110.248.227:6381 OK 47.110.248.227:6381>
我们发现,在6379中存储数值,会重定向到6381中,这就说明了前面的中心化集群
任何节点都可以成为入口
5. 查看节点信息
cluster nodes 47.110.248.227:6381> cluster nodes b8c7b3d5c1ae39e45a424441ce3bce4455e1b693 47.110.248.227:6391@16391 slave c52263d5fe8be9ad7a9b4f090319ca349c079760 0 1655964896000 5 connected db86cb577c74d3a27faa276aec1e4a71f0757cb9 172.27.207.45:6381@16381 myself,master - 0 1655964897000 3 connected 10923-16383 e0cfe47c4fa7cd4cfdd3a0b5bd95a5291ca919b6 47.110.248.227:6390@16390 slave 43986ee7cdb4594f424db54f7cc15c17e21d21d2 0 1655964898819 4 connected 9b082c5e69da97df763148aa5cc491675c0e4c3c 47.110.248.227:6399@16399 slave db86cb577c74d3a27faa276aec1e4a71f0757cb9 0 1655964897817 6 connected c52263d5fe8be9ad7a9b4f090319ca349c079760 47.110.248.227:6380@16380 master - 0 1655964896000 2 connected 5461-10922 43986ee7cdb4594f424db54f7cc15c17e21d21d2 47.110.248.227:6379@16379 master - 0 1655964896814 1 connected 0-5460
6. redis cluster 如何分配这六个节点?
一个集群至少要有三个主节点
选项--cluster-replicas 1 表示我们希望为集群中的每个节点创建一个从节点
分配原则则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上
7.什么是slots(插槽)
一个Redis集群包含16384个插槽,数据库中的每个键都属于这1638个插槽的其中一个
集群使用公式CRC6key
%16384来计算键key属于哪个槽,其中CRC6key语句用于计算键key的CRC6校验和(这样的算法实现了数据的平均分配存储)
集群中的每个节点负责处理一部分插槽。举个例子,如果一个集群可以有主节点。
节点A :0-5460
节点B :5461-10922
节点C : 10923-16383
这些在创建集群时都可以现实出来
不在一个slot下的键值,是不能使用mget ,mset
等多键操作
47.110.248.227:6379> mset name luo age 20 (error) CROSSSLOT Keys in request don't hash to the same slot
可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去 把组的名称当作key
47.110.248.227:6379> mset name{per} luo age{per} 10 -> Redirected to slot [12802] located at 47.110.248.227:6381 OK
8. 查询集群中的值 (只能看自己插槽范围内的,其他的看不到)
cluster getkeysinslot <slot> <count> 返回count个slot槽中的键 47.110.248.227:6381> cluster keyslot per # 返回键的所在插槽值 (integer) 12802 47.110.248.227:6381> cluster countkeysinslot 12802 # 返回插槽值中所有的key (integer) 2 47.110.248.227:6381> cluster getkeysinslot 12802 2 # 返回count个slot槽中的键 1) "age{per}" 2) "name{per}"
9. 故障恢复
**如果主节点下线,从节点能否自动升为主节点? 注意:15秒超时**
能,会自动升为主节点,如果之前的主节点再次上线,会变成当前主机的从机
如果所有的某一段插槽的主从节点都宕机,redis服务是否还能继续?
如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为yes,那么,整个集群都挂掉
如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为no,那么,当前插槽数据全部都不能使用,也无法储存
# cluster-require-full-coverage yes # 默认为yes
10.Redis好处
- 实现扩容
- 分摊压力
- 无中心配置相对简单
Redis集群的不足
- 多建操作是不支持的
- 多键的redis事务是不被支持的,lua脚本不被支持
- 之前集群没有出来时,很多公司都是采用其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster ,需要整体迁移而不是逐步过渡,复杂度较大
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决