redis - cluster

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协议传给其他节点,超过半数则认为是客观下线,进行主从节点的切换

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容