搭建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, 即需要开启 1637916379端口用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(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 ,需要整体迁移而不是逐步过渡,复杂度较大
posted @   小罗要有出息  阅读(29)  评论(0编辑  收藏  举报
编辑推荐:
· 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语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示