Redis Cluster集群操作

努力尽今夕,少年犹可夸。这篇文章主要讲述Redis Cluster集群操作相关的知识,希望能为你提供帮助。
Redis Cluster 提供了一种运行 Redis 安装的方法,在这种安装中,数据将自动分片到多个 Redis 节点上。
Redis Cluster 还在分区期间提供一定程度的可用性,即在某些节点失败或无法通信时继续操作的能力。但是,在发生更大的故障时(例如,当大多数主机不可用时) ,集群将停止运行。
Redis Cluster的能力

  • 在多个节点之间自动分割数据集的能力。
  • 当节点子集出现故障或无法与集群的其余部分通信时,继续操作的能力。


Reids Cluster 端口使用除了一般使用6379(默认)端口,Redis Cluster还需要一个端口称之为集群中先端口,一般选择16379(加10000,下文简称为高端口 high port)。
集群中线端口使用二进制协议的点点对点通信。改端口被各个节点用于故障检测、配置更新、故障转移授权等。


Redis Cluster数据分片集群没有使用一致哈希分片,而是一种不同形式的分片,其每个键在概念上都是我们称之为哈希槽(hash slot)的一部分。
Redis Cluster 中有16384个哈希槽,为了计算给定密钥的哈希槽,我们只需要取得密钥模16384的 CRC16。


集群中的每个节点负责哈希槽的子集,例如,你可能有一个集群有3个节点,其中:
  • 节点 a 包含0到5500的哈希槽。
  • 节点 b 包含从5501到11000的哈希槽。
  • 节点 c 包含从11001到16383的哈希槽。
Redis Cluster允许在集群中轻松地添加和移除节点。例如,如果我想添加一个新的节点 d,需要将一些散列槽从节点 a,b,c 移动到 d。当节点 a 为空时,可以将其完全从集群中删除。
将散列槽从一个节点移动到另一个节点并不需要停止操作,添加和移除节点或更改节点持有的散列槽的百分比不需要任何停机时间。


Redis Cluster主从同步为了保证系统健壮性,Redis Cluster使用了主从同步的副本模式。
如果仅有abc三个节点构成Redis Cluster,那么任意节点的下线都会导致分配到这个节点上的hash slot数据丢失,这是不可接受的。
为了解决这个潜在的问题,在集群创立后,向每个节点添加一个副本节点,最终整个Redis Cluster集群由主节点abc和从节点a1b1c1组成。
如果其中一个主节点,比如b失效,Redis Cluster 将提升其从节点b1作为新的主节点,并继续服务。
但是如果主从节点同时失效,Redis Cluster 将无法继续运行。


Redis Cluster数据一致性保证Redis Cluster不能保证强一致性。在某些条件下,可能会丢失系统向客户机所承认的写操作。


异步复制
Redis Cluster可能丢失写的第一个原因是使用了异步复制。
当客户端将数据写给主节点a。主节点会向客户端返回确认。之后才会将数据传递给主节点a的从节点a1,a2,a3...
如果在传递给从节点前(从节点a1 a2 a3没有收到数据),主节点a崩溃了,从节点升级为主节点,则该数据就丢失了。


节点超时
如果客户端一直链接操作的某主节点a因网络异常等问题与其他节点失去连接,但是与客户端可以正常通讯。
如果网络异常情况持续时间很短,客户端写入到主节点a的数据会随着网络的恢复而恢复。
但是如果网络异常情况持续时间很长,在集群内部,主节点a被判定下线,其从节点a1被提升为主节点,那么在此期间客户端发给a的数据都会丢失。
这个时间量是Redis Cluster中一个很重要的配置指令,称之为节点超时时间。
节点超时后,主节点被认为下线,其某个从节点将替换它的功能。同样的,超过节点超时时间后,主节点无法感知其他的节点,会进入错误状态并停止写操作。




Redis Cluster配置参数
cluster-enabled < yes/no>

是否启用Redis Cluster
cluster-config-file < filename>

用于保存Redis Cluster运行过程节点变更时自动保存集群配置文件的文件名。这个文件列出了集群中各节点的状态。
cluster-node-timeout < milliseconds>

节点超时时间。如果主节点在超过此时间后无法访问,则其副本将开始故障转移。
cluster-slave-validity-factor < factor>

从节点确认要素。
如果设置成0,则无论从节点与主节点失联多久,从节点都会尝试升级成主节点。如果设置成正数,则cluster-node-timeout乘以cluster-slave-validity-factor得到的时间,是从节点与主节点失联后,此从节点数据有效的最长时间,超过这个时间,从节点不会启动故障迁移。假设cluster-node-timeout=5,cluster-slave-validity-factor=10,则如果从节点跟主节点失联超过50秒,此从节点不能成为主节点。注意,如果此参数配置为非0,将可能出现由于某主节点失联却没有从节点能顶上的情况,从而导致集群不能正常工作,在这种情况下,只有等到原来的主节点重新回归到集群,集群才恢复运作。
cluster-migration-barrier

主节点需要的最小从节点数,只有达到这个数,主节点失败时,它从节点才会进行迁移。
cluster-require-full-coverage< yes/no>

在部分key所在的节点不可用时,如果此参数设置为”yes”(默认值),
则整个集群停止接受操作;如果此参数设置为”no”,则集群依然为可达节点上的key提供读操作。


创建和使用Redis Cluster  要创建集群,首先需要在集群模式下运行一些空的 Redis 实例。这基本上意味着集群不是使用普通的 Redis 实例创建的,因为需要配置一个特殊的模式,以便 Redis 实例将启用特定于集群的特性和命令。


在三台机器上分别部署六个redis 节点,三主三从。
192.168.0.191 端口 6379 6380
192.168.0.192 端口 6379 6380
192.168.0.193 端口 6379 6380


最小配置如下
port 6380
bind 192.168.0.193
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

另一端口配置
port 6379
bind 192.168.0.193
cluster-enabled yes
cluster-config-file nodes-6380.conf
cluster-node-timeout 5000

启动所有六个redis节点
然后在任意节点启动如下命令构建集群
redis-cli --cluster create 192.168.0.191:6379 192.168.0.191:6380 192.168.0.192:6379 192.168.0.192:6380 192.168.0.193:6379 192.168.0.193:6380 --cluster-replicas 1
【Redis Cluster集群操作】根据提示输入yes

根据上图所示,可以看到相应主从节点信息
查看配置文件中指定的cluster-config-file也可以看到集群信息

也可以登录其中一个节点使用命令 cluster nodes 获取节点信息
注意:
在命令行里操作集群时建议给redis-cli命令加上-c参数

注意:
构建Reids Cluster时,要保证每个redis 的db0 中没有数据(Redis Cluster不支持多数据库,只能使用db 0)


如果出现了配置错误或者其他需要恢复Redis Cluster 到初始状态,可以使用cluster reset 命令
比如,在操作过程中加入了一些错误配置,导致无法初始化集群等情况。



重新分片集群交互方式
redis-cli --cluster reshard ip:port
reshard后接的参数是RedisCluster中的一节点IP:Port

通过redis-cli执行cluster check命令可以看到slots数发生了变化



如果交互中使用了slave节点的ID会报错(调整分片必须在master上操作)。

非交互方式方式
redis-cli --cluster reshard < host> :< port> --cluster-from < node-id> --cluster-to < node-id> --cluster-slots < number of slots> --cluster-yes
redis-cli --cluster reshard 192.168.0.191:6379 --cluster-from 2dcea1c4375fbc192ad876f936cd1cb059ce8e2d --cluster-to cc98199ebd82769446e5e151fce797cd8 cc98199ebd82769446e5e151fce797cd86e0a511 --cluster-slots 100 --cluster-yes





添加节点/移除节点添加master节点
redis-cli --cluster add-node IP:Port IP:Port
第一个IP:PORT为要添加的节点,第二个IP:PORT为现有集群中的一个节点
操作,将192.168.0.211:6379加入到现有集群中

检查集群状态
redis-cli --cluster check 192.168.0.191:6379
可以看到新加入的节点已经出现在Redis Cluster中,但是有两点要注意
  • 它不保存数据,因为它没有分配的哈希插槽。slots数量为0
  • 因为它是一个没有分配插槽的master,所以当slave希望成为主机时,它不参与选择过程。
根据上一节的重新分片功能为其分片。具体操作不在赘述。

添加slave节点
添加一个slave有两种方式
1、不指定maste,只是将以节点作为一个slave直接添加到集群中。
与前面添加master的命令类似,只是多了一个--cluster-slave参数
redis-cli --cluster add-node 192.168.0.211:6380 192.168.0.191:6379 --cluster-slave



2、指定master,将新加入的节点作为指定master的副本。
多一个--cluster-master-id参数用于指定master节点
redis-cli --cluster add-node 192.168.0.211:6380 192.168.0.191:6379 --cluster-slave --cluster-master-id 1b5ec03530b1e289c0313fc81ff4b2da5b8ad948


移除节点redis-cli --cluster del-node 127.0.0.1:7000 `< node-id> `
这个命令可以直接用来移除slave节点,如果要移除master节点,要保证master节点上的所有slots都被分配到其他master节点。
redis-cli --cluster del-node 192.168.0.191:6379 167afda1253a439ebb469e3696d0416eb5d4080c

注意,移除节点会关闭redis-server进程
R


手动故障转移Redis 群集使用 CLUSTER FAILOVER 命令支持手动故障转移,必须在要进行故障转移的主服务器的一个副本中执行该命令。
如下图所示,在192.168.0.191:6380节点(原本为192.168.0.193:6379的slave节点)上执行了CLUSTER FAILOVER命令,之后这两个节点身份发生了对调



副本迁移集群将slave从一个master移动到另一个master
CLUSTER REPLICATE < master-node-id>
在这个示例中,将原本在192.168.0.191:6380(579821cc163cef25e6f58da69e0bb151e828d2c2 )这个master节点下的slave节点192.168.0.193:6379(d557586097b746518d63873a7c250d7312011f6a)迁移到192.168.0.211:6379(1b5ec03530b1e289c0313fc81ff4b2da5b8ad948)
先看一下579821cc163cef25e6f58da69e0bb151e828d2c2与1b5ec03530b1e289c0313fc81ff4b2da5b8ad948下面的副本情况



当前的链接就是192.168.0.193:6379,在其上执行
cluster replicate 1b5ec03530b1e289c0313fc81ff4b2da5b8ad948
可以看到1b5ec03530b1e289c0313fc81ff4b2da5b8ad948 有两个slave




    推荐阅读