此时,使用客户端连上集群中的任何一个节点,都相当于连上了整个集群
101-109
这个九个节点,是一个整体可以通过 cluster nodes
查看整个集群的情况
6379
是业务端口,后面的 16379
是管理端口myself
:我们刚才客户端连上的节点id
看到主从关系前面学到的所有 redis
命令,在这里都是适用的
k1
这个 key
通过 hash
计算之后,得到 slot 12706
,属于 103
这个分片,但我们是在 101
上进行的操作redis-cli
的时候,加上 -c
选项 key
的操作不在当前分片上的时候,就能够自动的重定向到对应的分片主机12706
103
-c
选项添加后,redis
客户端就会根据当前 key
实际算出来的槽位号,自动找到匹配的分配主机,进一步的就可以完成操作
使用集群之后,之前学过的命令,都能正常使用(不够严谨)
key
的,此时如果 key
是分散在不同的分片上,就可能出现问题了有特殊的方式,可以解决上述问题——
hash tag
当我们尝试在从节点上写操作的时候,就会自动的被重定向到指定的主节点上
此处,集群做的工作,就和之前哨兵做的类似,会自动把该主节点旗下从节点,给挑出一个,提拔成主节点
101
是主节点,105
和 106
是他的从节点。在 101
挂了之后,106
成了新的主节点,代替了原来 101
的位置105
就成了 106
的从节点了在重启 redis1
之后,发现其还是从节点,身份恢复不了
集群机制,也能处理故障转移
识别出某个节点是否挂了
ping
包,B 就会给 A 返回一个 pong
包。ping
和 pong
除了 message type
属性之外,其他部分都是一样的。这里包含了集群的配置信息(该节点 id,该节点从属于哪个分片,是主节点还是从节点,从属于谁,持有哪些 slots
的位图…)ping
包,而不是全发一遍。这样设定是为了避免在节点很多的时候,心跳包也非常多(比如有 9
个节点,如果全发,就是 9 * 8
有 72
组心跳了,而且这是按照 N^2
这样的级别增长的)ping
包,B 不能如期回应的时候,此时 A 就会尝试重置和 B 的 TCP
连接,看能否连接成功。如果连接失败,A 就会把 B 设为 PFAIL
状态(相当于主观下线) PFAIL
之后,会通过 redis
内置的 Gossip
协议,和其他节点确认 B 的状态(每个节点都会维护一个自己的“下线列表”,由于视角不同,每个节点的下线列表也不一定相同)PFAIL
,并且数目超过总集群个数的一般,那么 A 就会把 B 标记成 FAIL
(相当于客观下线),并且把这个消息同步给其他节点(其他节点收到之后,也会把 B 标记成 FAIL
)B 是否下面,就已经明确了
休眠时间 = 500ms 基础时间 + [0, 500ms]随机时间 + 排名 * 1000ms
offset
的值越大,数据就越接近主节点,排名越靠前,休眠时间就越短slaveof no one
,并且让 D 执行 slaveof C
)谁休眠时间短,大概率就是新的主节点了
上述选举的过程,称为
Raft
算法,是一种在分布式系统中广泛使用的算法
leader
,然后 leader
负责找一个从节点,升级成主节点以下三种情况会出现集群宕机:
master
节点都挂了 master
都挂了,此时说明集群遇到了非常严重的情况。此时就得赶紧停下来,检查检查是不是有什么问题如果集群中有个节点挂了,无论是什么节点,程序员都要尽快处理好
101-109
九个主机,构成了三主六从结构的集群了。现在将 110
和 111
也加入到集群中,以 110
为 master
,111
为 slave
集群扩容操作,是一件风险较高,成本较大的操作
命令:
redis-cli --cluster add-node 172.30.0.110:6379 172.30.0.101:6379
master
,都有响应的 slots
。但是新增的这个,没有 slots
把之前三组 master
上面的 slots
拎出来一些,分配给新的 master
redis-cli --cluster reshard 172.30.0.101:6379
此处会先打印出当前集群每个机器的情况,并且要求用户输入要移动多少个 slots
16384
个,除 4
得到的就是 4096
ID
slots
all
,表示从其他每个持有 slots
的 master
都拿过来点slots
(以 done
为结尾)all
之后,会给出一个搬运的计划(还没真正开始搬运),当程序员输入 yes
之后,搬运真正开始 slots
重新划分,也会把 slots
上对应的数据,也搬运到新的主机上slots
如果在搬运 slots
/ key
的过程中,此时客户端能否访问 redis
集群呢?
key
这个过程,大部分 key
是不用搬运的。针对这些未搬运的 key
,此时可以正常访问,针对这些正在搬运中的 key
,是可能会出现访问出错的情况k1
,集群通过分片算法,得到 k1
是第一个分片的数据,就会重定向到第一个分片的节点,就可能在重定向过去之后,正好 k1
被搬走了,自然就无法访问了redis-cli --cluster add-node 172.30.0.111:6379 172.30.0.101:6379 --clusterslave --cluster-master-id [172.30.1.110 节点的 nodeId]
执行完毕后,就添加完成了
redis
集群