redis-cluster 感觉比较重要和重点单独起一片文章
搭建需要6台服务器,3主3从
需要考虑的问题:均匀分布,客户端访问,数据扩展
一致性hash:
虚拟的圆环,顺时针插入数据, 首先将服务节点根据名称等分布到hash环上,然后数据顺时针找到相邻的服务节点将数据插入,第三点服务节点新增或者删除的时候,由于数据的都是顺时针插入所以最多只会影响一个节点的数据
均匀的分布:创建虚拟节点,使得服务节点均匀分布再hash环上
按照槽的形式进行数据存储(slot) 16384个。数据定位的方式是:默认将key值与crc16 hash算法进行hash然后与16384取余进行位置判断
cluster主从切换是通过slave向其余msaster节点通知,当超过半数ack的时候就会ok
raft选举算法两个超时时间(拓展):
1:选举的超时时间,那个先到达那个先发起来,各个节点不一致
2:保活时间,保活时间低于各个节点的选举时间,各个节点收到心跳包重置各个节点的超时时间
带着问题学习
问题一数据迁移的步骤
在之前的java面试题中的到解释:先cluster add node 新增节点,然后执行 cluster share node(可以选择哪个节点或者所有的节点 向 目标家节点进行数据迁移 )
用源码相关解释:
redis 的迁移单位是槽slot, 在迁移中,该槽在源节点的状态是migrating状态。在目标节点的状态时候importing表示正在引入
数据以序列化形式传播:
1:源节点执行dump将slot中的值都序列化
2:目标节点进行反序列化,并将数据进行存储
3:目标节点返回ok
4:源节点删除slot
在迁移过程中client的访问原则:
client是先访问源节点,此时虽然知道是哪一个槽,单一部分数据在源 节点, 另一部分数据在目标节点,所以如果源节点不存在的话,会让client访问新节点,访问指令是个ASKING命令(不带任何参数);该命令会强制节点查询数据,原则上数据在迁移过程中还是归原来节点管理不归新节点管理。不使用该命令,新节点会提示 -moved 让他去源节点访问,出现循环问题
cluster-node timeout :支持网络抖动,某一个节点当达到了该时间的不可访问时间,就进行选举操作
节点间的传输协议:与eureka一致,使用的gossip协议,病毒式传输,某一个节点超时时间失联,进行主观下线,通过gossip协议传给其他节点,超过半数则认为是客观下线,进行主从节点的切换