Dawn's Blogs

分享技术 记录成长

0%

Redis学习 (7) 集群

目前有如下两个问题:

  • 容量不够,Redis 如何进行扩容。
  • 并发写操作,Redis 如何分摊操作。

解决方法:无中心化集群

Redis集群

Redis 集群实现了对 Redis 的水平扩容,即启动 N 个 Redis 节点,将整个数据库分布存储在这 N 个节点中,每个节点存储总数据的 1/N

Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

image-20210702164116027

开启集群

开启集群的步骤

  1. 为集群中的每一个 Redis 服务器编写配置文件,并开启 Redis 服务。
  2. 启动集群,用 redis-cli --cluster create 命令将节点合并成一个集群(一个集群中至少 3 个主节点)。
1
2
3
redis-cli --cluster create --cluster-replicas 1 <Redis地址1> <Redis地址2> <Redis地址3> ...

# --cluster-replicas 参数表示从机的数量,为集群中的每个主节点创建从节点的个数。
  • 访问集群时,需要给 redis-cli 加上 -c 参数才可以:
1
redis-cli -c -p 端口
  • cluster node 命令:查看集群信息。

slots

一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个 key 都属于这 16384 个插槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽,集群中的每个节点负责处理一部分插槽。

img

节点之间也互相监听,一旦有节点退出或者加入,会按照 slot 为单位做数据的迁移。例如 Node1 如果掉线了,0-5640 这些 slot 将会平均分摊到 Node2 和 Node3 上,由于 Node2 和 Node3 本身维护的 slot 还会在自己身上不会被重新分配,所以迁移过程中不会影响到 5641-16384 slot段的使用。

不在一个 slot 下的键值,是不能使用 mget、mset 等多键操作。

image-20221229143617723

可以通过 {} 来定义组的概念,从而使 key 中 {} 内相同内容的键值对放到一个 slot 中去。

image-20221229143700171

故障恢复

如果主节点下线,如果超过配置文件中配置的节点超时时间(cluster-node-timeout 选项配置),从节点就会自动升为主节点。主节点恢复后,主节点回来变成从机

  • 如果某一段插槽的主从节点都挂掉,而 cluster-require-full-coverage 为 yes :整个集群都挂掉

  • 如果某一段插槽的主从节点都挂掉,而 cluster-require-full-coverage 为 no :该插槽数据全都不能使用,也无法存储。