Redis之Cluster(集群)

上文书说到了sentinel,本次来介绍下cluster,这是个分布式的方案,通过分片(sharding)来共享数据,并且支持故障转移,放在当前是流弊的。

节点:

       通常是指一台服务器,也有可能一台机器上部署多个redis,就叫多个节点或多个实例。多个节点如:127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002,三个节点要相互通信可以线登陆到7000上,通过cluster meet 127.0.0.1:7001 来进行握手,加入到大家庭中。在握手的过程中,双方都会相互把对方的信息保存在自己的clusterNode里。然后彼此返回一个PONG表示已经完成了MEET

在启动节点的时候,通过cluster_enabled =yes来开启集群模式。

槽指派

集群目前支持16384个槽,所谓的指派就是瓜分槽,再通俗点就是把1-5000给了7000,5001-10000给了7001,剩下的给7002,有一点需要注意。槽全部处理或者分配,那么集群处于上线状态,否则处于下线状态。

在clusterNode结构的slots里记录了分配到的槽ID,numslots中记录了分配到的数量。

当前的节点还会把自己持有的槽及数量发送给其他的节点,让他们找到存有自己信息的结构中,把槽信息更新。方便之后查找时的定位、故障转移及槽的重新分配(新加节点时使用),加槽可以使用cluster addslots 10086

数据查找

在完成分槽后,集群上线,客户端向节点发送请求的时候,接收命令的节点会查询是否属于自己负责的槽,如果不在向客户端返回一个MOVE命令,并且把自己查到应该定位到那个节点的信息返回。

槽定位是根据

crc16(key) & 16383来计算槽号

MOVED错误:

当节点发现键所在当槽不是自己处理当时候,向客户端返回一个MOVED,指引客户端转向正确当槽节点。

格式:MOVED<slot><ip>:<port>

重新分片的实现原理:

ASK错误

在源节点向目标节点迁移的过程中,客户端发来请求命令,会出现2中情况,如果要是数据还没迁移直接返回,如果已经迁移走,返回ASK,并且引导客户端找到正确的槽

复制与故障转移

集群中每个节点都会定期的向集群中其他的节点发送ping消息来检测对方是否存活,如果其他节点没有在时间范围内返回,就标记为疑似下线。其实就是在这个节点的clusterState.nodes字典中找到节点,打开redis_node_pfail标记为下线。

接着把消息同步给其他节点。其他节点收到后,也修改状态。

选举新的主节点

1、集群中个节点把自己的配置纪元设置为0.

2、每个节点只有一次投票的机会

3、当从节点发现自己正在复制的主节点已经进入下线状态,会向集群广播一条消息。要求所有能收到这条消息,并且具有投票权的主节点投自己一票。

4、如果一个主节点发现自己没有投。就把这宝贵的一票给他

5、当一个节点的票数大于等于n/2+1时就会被认为是新的节点

选出来的新节点会执行slaveof no one成为新的节点,并且撤销所有对已下线的主节点槽指派给自己。同时向集群广播一条消息,告诉大家由从节点变为来主节点并完成故障转移。

 

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读