1. 什么是集群
Redis 集群实现了对 Redis 的水平扩容,即启动 N 个 Redis 节点,将整个数据库分布存储在这 N 个节点中,每个节点存储总数据的 1 N \displaystyle\frac{1}{N} N1.
Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求.
2. 模拟包含 6 个服务器的集群
2.1 配置文件修改,这里以 6369 为例
cluster-enabled yes
:打开集群模式cluster-config-file nodes-6369.conf
:设定节点配置文件名为nodes-6369.conf
cluster-node-timeout 15000
:设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
依次复制 5 个,分别对应 6370、6371、6389、6390、6391 端口
2.2 启动这 6 个 Redis 服务
2.3 将 6 个结点合成一个集群
组合之前,请确保所有 Redis 实例启动后,nodes-xxxx.conf
文件都生成正常
然后,必须进入我们一开始解压缩环境的 src 目录下:
cd /opt/redis-6.2.3/src/
然后执行命令:
redis-cli --cluster create --cluster-replicas 1 118.25.151.78:6369 118.25.151.78:6370 118.25.151.78:6371 118.25.151.78:6389 118.25.151.78:6390 118.25.151.78:6391
此处不要用
127.0.0.1
, 请用真实 IP 地址
--replicas 1
采用最简单的方式配置集群,一台主机,一台从机,正好三组
填 yes
,回车
至此,集群创建成功
2.4 集群登录
之前普通方式登录,可能直接进入读主机,存储数据时,会出现 MOVED 重定向操作,所以,应该以集群方式登录:
集群登录只需要加参数 -c
,采用集群策略连接,设置数据会自动切换到相应的写主机:
2.5 查看集群信息
3. Redis cluster 如何分配这六个节点
-
一个集群至少要有三个主节点
-
选项
--cluster-replicas 1
表示我们希望为集群中的每个主节点创建一个从节点 -
分配原则尽量保证每个主数据库运行在不同的 IP 地址,每个从库和主库不在一个IP地址上
4. slots
部署完末尾出现了下图所示提示:
一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个.
集群使用公式 CRC16(key) % 16384
来计算键 key 属于哪个槽, 其中 CRC16(key)
语句用于计算键 key 的 CRC16
校验和
集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:
- 节点 A 负责处理 0 号至 5460 号插槽
- 节点 B 负责处理 5461 号至 10922 号插槽
- 节点 C 负责处理 10923 号至 16383 号插槽
5. 在集群中录入值
在 redis-cli 每次录入、查询键值,Redis 都会计算出该 key 应该送往的插槽,如果不是该客户端对应服务器的插槽,Redis 会报错,并告知应前往的 Redis 实例地址和端口
redis-cli 客户端提供了–c
参数实现自动重定向
不在一个 slot 下的键值,是不能使用 mget
,mset
等多键操作:
可以通过 {}
来定义组的概念,从而使 key 中 {}
内相同内容的键值对放到一个 slot 中去:
6. 故障恢复
-
如果主节点下线?从节点能否自动升为主节点?注意:15 秒超时:
-
主节点恢复后,主从关系会如何?回来之后变成从机
-
如果所有某一段插槽的主从节点都宕掉,Redis 服务是否还能继续?
- 如果某一段插槽的主从都挂掉,而
cluster-require-full-coverage
为yes
,那么 ,整个集群都挂掉 - 如果某一段插槽的主从都挂掉,而
cluster-require-full-coverage
为no
,那么,该插槽数据全都不能使用,也无法存储
cluster-require-full-coverage
是 redis.conf 中的参数 - 如果某一段插槽的主从都挂掉,而