首页  

Redis cluster 原理     所属分类 redis 浏览量 1528
redis cluster 
数据分片 master slave
hash slot 

redis cluster vs  replication + sentinal

hash slot  简化 节点新增或移除时的数据迁移

手工分配slot 
CLUSTER ADDSLOTS 0 1 2 3 4 ... 5000 

每个节点会记录哪些槽指派给了自己,哪些槽指派给了其他节点。
客户端向节点发送命令,节点要计算这个键属于哪个槽。
如果是自己负责的槽,那么直接执行命令,如果不是,向客户端返回MOVED,指引转向正确的节点。


slave 高可用 热备 主备切换
redis cluster默认不支持slave节点读写

redis cluster节点间采取gossip协议进行通信

元数据存储 集中式 vs 分布式 (gossip)

集中式
优点
元数据的更新和读取,时效性好,一旦元数据出现了变更,立即就更新到集中式的存储中,其他节点读取的时候立即就可以感知到
缺点
所有的元数据的跟新压力全部集中在一个地方,可能会导致元数据的存储有压力

gossip
优点
元数据分散,降低了压力; 
缺点
元数据更新有延时,可能导致集群的一些操作会有一些滞后


每个节点都有一个专门用于节点间通信的端口,提供服务的端口号+10000 
每隔一段时间都会往另外几个节点发送ping消息,其他节点收到ping之后返回pong

交换的信息
故障信息,节点的增加和移除,hash slot信息,等

gossip协议包含多种消息,包括ping,pong,meet,fail 等

meet: 某个节点发送meet给新加入的节点,让新节点加入集群中
redis-trib.rb add-node

每个节点发送ping给其他的节点, 交换数据,进行元数据的更新
某个节点判断另一个节点fail之后,就发送fail给其他节点

ping很频繁,并携带一些元数据,可能会加重网络负担
每个节点每秒会执行10次ping,每次会选择5个最久没有通信的其他节点
如果发现某个节点通信延时达到了cluster_node_timeout / 2,那么立即发送ping,避免数据交换延时过长 

每次ping,带上自己的信息,还要带上1/10其他节点的信息 
至少包含3个其他节点的信息,最多包含总节点-2个其他节点的信息

查看key对应的slot 
cluster keyslot mykey

redis-cli  -c参数 自动重定向 接收到moved之后,自动重定向到对应的节点执行命令
 
根据key计算CRC16 ,然后对16384取模

用hash tag 手动指定key对应的slot 
set mykey1:{100}   set mykey2:{100}

重定向消耗网络IO
smart jedis
本地维护一份hashslot -> node 映射表,缓存 ,避免 moved重定向


JedisCluster 
初始化时随机选择一个node,初始化hashslot -> node映射表
为每个节点创建一个JedisPool连接池
本地计算key的hashslot,在本地映射表找到对应的节点
返回moved 时会更新本地 映射表
定位节点 重试超过5次 JedisClusterMaxRedirectionException

如果hash slot正在迁移,返回ask重定向给jedis
收到ask不会更新hashslot本地缓存

高可用性与主备切换 


1 判断节点宕机
  如果一个节点认为另外一个节点宕机,那么就是pfail,主观宕机
  如果多个节点都认为另外一个节点宕机了,那么就是fail,客观宕机,跟哨兵类似,sdown,odown
  在cluster-node-timeout内,某个节点一直没有返回pong,那么就被认为pfail
  如果一个节点认为某个节点pfail了,那么会在gossip ping消息中,ping给其他节点,如果超过半数的节点都认为pfail了,那么就会变成fail

2 从节点过滤
  对宕机的master node,slave node中,选择一个切换成master node
  检查每个slave node与master node断开连接的时间,如果超过了cluster-node-timeout * cluster-slave-validity-factor,那么就没有资格切换成master

 
3 从节点选举

  哨兵:对所有从节点进行排序,slave priority,offset,run id
  每个从节点,都根据自己对master复制数据的offset,来设置一个选举时间,offset越大(复制数据越多)的从节点,选举时间越靠前,优先进行选举
  所有的master node开始slave选举投票,给要进行选举的slave进行投票,如果大部分master node(N/2 + 1)都投票给了某个从节点,那么选举通过,从节点可以切换成master

上一篇     下一篇
mybatis动态更新自动去掉多余逗号

dubbo知识点

lambda使用说明

redis内存设置及淘汰策略

redis高可用架构之哨兵

zookeeper不适合用于服务注册与发现