这篇是对黄建宏的总结和学习笔记。redis
客户端、节点一、节点2之间的关系?
1.客户端链接节点1
2.客户端发送加入集群命令给链接上的节点1
Cluster meet 节点2ip 节点2port
3.节点1把节点2加入集群
所谓加入集群,其实也就是,给每一个节点创建一个数据结构,数据结构包含了哪些槽。算法
如何给节点添加槽?
也是客户端——节点。
客户端发送添加槽命令。
命令的具体格式是:addslots 槽编号。数组
细节
具体细节是客户端发送命令到节点。命令格式以下: 1.命令 2.哪一个节点IP 3.哪一个槽数据结构
哪两个?
1.单个节点的槽
2.全部槽负载均衡
第一种,数据结构是节点数据结构的数据(槽数组,即二进制位数组)。学习
第二种,是集群数据结构的数据(二进制位数组)。指针
如今的问题是,为何要搞两种?
由于,第一种是用于节点之间互相通讯,告知对方我有哪些槽,而后对方就把你的槽保存起来。 第二种是,用于查找某一个槽是在哪个节点,本质上第一种也能够查找到,可是须要遍历,因此实际上。这又是一个用空间换时间的问题。cdn
所谓槽slot?就是一个bit,就是一个位,二进制。blog
传播的目的是,使得每一个节点都保存/知道了每一个槽slot是指向哪个节点。或者叫告知别的节点,我有哪些槽,具体实现是经过命令,节点1——节点2。排序
具体实现?二进制bit位。
具体保存的数据结构是,每一个节点,包括当前节点本身,都有一个数据结构存放这些数据。
集群是有下线和上线的状态的:
1.下线
2.上线
不一样状态,只能作不一样的事。
例如,下线的时候,你得先让集群上线。上线的标志就是,全部槽分配完毕,一个都不能剩下,不然状态字段就是下线。
上线以后,就能够发送更多的命令了。好比,数据命令。所谓数据命令,就是写数据啊读数据的命令。
步骤
1.先计算Hash
2.Hash值和总槽数量进行按位与
总结
像这种负载均衡,通常都是采用Hash方法,即便不是Hash,也是在Hash的基础之上再进行按位与运算。
注意
Redis的Hash,不是通常的Hash,而是crc,其实也是一种Hash算法,本质上都是为了尽量地获得一个惟一的值。
就是客户端从某个节点读数据的时候,发现该数据不在当前节点,这个时候就要重定向。
具体怎么作?
固然是根据IP/port,若是错误,就会返回正确的IP/port,由于每一个节点都保存命了全部的槽/节点。
注意
这里还有个问题,就是客户端与节点的通讯。客户端与节点的通讯,本质上都是TCP套接字创建链接,并且一个客户端可能也能够同时和多个节点链接/创建套接字。
若是重定向的时候,发现新的节点没有创建链接,就先创建链接,不然就直接通讯。
即存储key+槽+多个指针,使用的数据结构是跳跃链表skiplist。
跳跃链表的节点,包含的字段有:
1.value,即数据
这里是key
2.score,即分数,用于排序
这里是槽编号
3.指针,多级
整个流程
说明
有专门的功能模块redistrib,来处理切换槽到新的节点。
槽的数据迁移完以后,其余节点(非源节点和目标节点)怎么知道槽已经切换节点?
经过消息。
具体一点?书上没讲清楚,这个地方。
另外,所谓的分片,就是分配槽,片就是槽,一个片就是一个槽。明明概念里是叫槽,非要整出来一个新名词,看着让人烦。
集群和哨兵是两套不一样的实现高可用/集群的机制。
1.哨兵
是哨兵选leader哨兵,leader哨兵再选从节点。
2.集群
如何判断一个主节点是否挂了?
选举机制/算法。
就是全部的主节点之间互相投票。
这个时候是没有哨兵的,那么就只能在主数据节点之间互相投票选举,所谓投票选举,其实就是互相两两之间进行投票,且只能投给一我的,哪一个得票数最早过半,就胜出。
除了没有哨兵节点,和不是哨兵节点来选举从数据节点之外,其余都差很少。
可是,本质上,选举算法是同样的,不论是哨兵机制的哨兵内部选leader哨兵,仍是集群机制的判断某个主节点是否下线,仍是其余的选举,只要是投票选举,而且只能选一我的,那么就是计算最终得票数量,最早过半,就胜出。
还有一个问题,就是由谁来广播哪一个节点下线?
由于虽然是投票,可是最终是有一个节点标记下线节点,并且这个节点须要把下线节点这个消息广播出去。可是这个标记下线节点和广播消息的节点,是怎么选出来的?按id排序或者其余什么排序,参考哨兵机制下的选从节点。
广播的消息,主要两个数据:1.我已经升级成为新的主节点 2.旧的主节点已经下线。
五种
1.拉别人加入集群Cluster Meet
2.请求ping
3.响应pong
4.fail
5.publish
Gossip协议?
黄建宏