Redis集群篇----Cluster

Cluster是redis中提供的集群方案
Cluster集群中每一个节点负责集群的一部分数据,并且每个节点负责的数据多少可能不一样。
每个节点相互连接组成一个对等的集群,之间使用二进制协议交互集群信息
Cluster的集群模型
Cluster和Codis:
Cluster和Codis不同的是前者是去中心化的
Cluster将所有数据划分为16384个槽位,比codis的1024个槽位更加细致,每个节点负责一部分槽位,不需要像Codis中,不需要另外的分布式存储空间来存储节点槽位信息
客户端在连接集群时,会得到一份集群槽位信息,客户端可以直接定位到目标,不同于Codis需要通过proxy来定位目标节点,而是直接定位
由于客户端缓存了槽位信息需要有槽位信息纠正机制,校验槽位信息
Cluster的每个节点会将集群的配置信息持久化到配置文件中
1、槽位定位算法
Cluster默认会对key使用crc16算法进行hash等到整数值,然后用此值对16384进行取模得到具体槽位
Cluster还允许用户强制把某个key挂到特定槽位上,通过在key里面嵌入tag,就可以强制key所挂的槽位等于tag所在的槽位
2、跳转
当客户端像一个错误的节点发出指令后,该节点会发现key所在的槽位不归自己管理,这时会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连接该节点以获取数据
如:
发出:GET x
获得:-MOVED 3500 127.0.0.1:6378
3500是key对应的槽位编号,后面是目标节点地址,moved前面的-代表一个错误信息
客户端在收到moved信息后会纠正本地槽位信息
3、迁移
提供工具redis-trid可以手动调整槽位的分配情况
迁移过程:
Redis迁移的单位是槽,一个槽一个槽的迁移
当槽迁移时,这个槽就处于中间过渡状态
迁移流程图:
迁移流程图
槽在源节点的状态为migrating,在目标节点的状态为importing,表示数据正在从源节点流向目标节点
Redis-trib首先会在源节点和目标节点设置好中间过渡状态,然后一次性获取源节点槽位的所有key列表(keysinslot指令可以部分获取)
一个key的迁移,以源节点作为目标节点的客户端,源节点对当前key执行dump指令得到序列化的内容,然后通过客户端向目标节点发送restore指令携带序列化的内容作为参数,目标节点进行反序列化获得内容并保存,完成后告知客户端
大致流程:
从源节点获取内容----->存到目标节点---->从源节点删除内容
迁移过程是同步的,整个迁移过程中源节点是阻塞的,直到key被成功删除,由于节点会阻塞,如果key很大则会长时间阻塞,因此应避免大的key
4、容错
在cluster中可以为每个主节点设置若干从节点,当主节点发生故障时集群会将从节点提升为主节点
当主节点没有从节点时,主节点故障时集群将完全处于不可用状态,redis中提供一个参数cluster-require-full-coverage可以允许部分节点发生故障,其他节点可以继续提供对外访问
5、网络抖动
当网络出现抖动时,可能会出现频繁切换,redis cluster中提供cluster-node-timeout,表示某节点持续timeout的时间失联时,才会认定为故障
6、可能下线(PFail)与确定下线(Fail)
Cuuster中一个节点认为某节点失联并不代表所有的节点都认为它失联,所以集群还得经过经过一次协商的过程,必须得到大多数节点都认定,然后进行容错机制
redis集群节点中采用Gossip协议广播自己的状态和其他信息(就是自己发现的其他节点状态等)
如:
当节点发现某节点失联(PFail,(Possibly Fail)),它将信息向集群广播,然后收到某节点失联的节点数量(PFail count)达到集群大多数,然后标记节点为确定下线
7、槽位迁移感知
当槽位正在迁移或者迁移完毕,客户端如何感知呢槽位变化
Cluster中有两个特殊error指令:moved和asking
moved指令用于纠正槽位,主要是将指令发送到错误节点,节点发现不属于自己的槽位返回,然后将目标节点地址返回
asking指令用于临时纠正槽位,在槽位进行迁移时,当旧节点上没有时,旧节点会返回一个askong error并携带新目标节点的地址,客户端会访问目标节点
8、集群变更感知
服务器节点变更时,客户端应该立即得到通知并刷新自己的节点关系表
a、目标节点挂了,客户端会抛出ConnectionError,然后随机找一个节点进行重试,节点通过moved告知目标槽位所在的新节点
b、手动修改了集群信息,将主节点切换到其他节点,并将主节点移除出集群。这是访问到旧的主节点上的指令会收到ClusterDown的错误,告知当前节点所在集群不可用,客户端会关闭连接并将槽位映射关系表清空

猜你喜欢

转载自blog.csdn.net/alvin_666/article/details/90144823