Redis.4 集群伸缩
Redis.4.1 伸缩原理
Redis 集群提供了灵活的节点扩容和收缩方案。在不影响集群对外服务的情况
下,可以为集群添加节点进行扩容也可以下线部分节点进行缩容,如图
Redis 集群可以实现对节点的灵活上下线控制。其中原理可抽象为槽和对应数据在不同节点之间灵活移动。首先来看我们之前搭建的集群槽和数据与节点的对应关系,如图所示
三个主节点分别维护自己负责的槽和对应的数据,如果希望加入 1 个节点实现集群扩容时,需要通过相关命令把一部分槽和数据迁移给新节点,如图
图中每个节点把一部分槽和数据迁移到新的节点 6385,每个节点负责的槽和数据相比之前变少了从而达到了集群扩容的目的。这里我们故意忽略了槽和数据在节点之间迁移的细节,目的是想让读者重点关注在上层槽和节点分配上来,理解集群的水平伸缩的上层原理:集群伸缩=槽和数据在节点之间的移动,下面将介绍集群扩容和收缩的细节。
10.4.2 扩容集群
扩容是分布式存储最常见的需求,Redis 集群扩容操作可分为如下步骤:
1)准备新节点。
2)加入集群。
3)迁移槽和数据。
1.准备新节点
需要提前准备好新节点并运行在集群模式下,新节点建议跟集群内的节点配置
保持一致,便于管理统一。准备好配置后启动两个节点命令如下:
redis-server conf/redis-6385.conf
redis-server conf/redis-6386.conf
启动后的新节点作为孤儿节点运行,并没有其他节点与之通信,集群结构如图
所示。
2.加入集群
新节点依然采用 cluster meet 命令加入到现有集群中。在集群内任意节点执行
cluster meet 命令让 6385 和 6386 节点加入进来,命令如下:
127.0.0.1:6379> cluster meet 127.0.0.1 6385
127.0.0.1:6379> cluster meet 127.0.0.1 6386
新节点加入后集群结构如图所示。
集群内新旧节点经过一段时间的 ping/pong 消息通信之后,所有节点会发
现新节点并将它们的状态保存到本地。例如我们在 6380 节点上执行 cluster
nodes 命令可以看到新节点信息:
127.0.0.1:6380>cluster ndoes
1a205dd8b2819a00dd1e8b6be40a8e2abe77b756 127.0.0.1:6385 master - 0
1469347800759
7 connected
475528b1bcf8e74d227104a6cf1bf70f00c24aae 127.0.0.1:6386 master - 0
1469347798743
8 connected
...
新节点刚开始都是主节点状态,但是由于没有负责的槽,所以不能接受任
何读写操作。对于新节点的后续操作我们一般有两种选择:
·为它迁移槽和数据实现扩容。
·作为其他主节点的从节点负责故障转移。
redis-trib.rb 工具也实现了为现有集群添加新节点的命令,还实现了直接添
加为从节点的支持,命令如下:
redis-trib.rb add-node 127.0.0.1:6385 127.0.0.1:6379
redis-trib.rb add-node 127.0.0.1:6386 127.0.0.1:6379
(Redis5.0 版本后同样把 redis-trib.rb 命令改为 redis-cli )