zoukankan      html  css  js  c++  java
  • Redis cluster

    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
  • 相关阅读:
    一起谈.NET技术,验证.NET强命称的思路和实例 狼人:
    一起谈.NET技术,基于SQL Server 2008 Service Broker构建企业级消息系统 狼人:
    一起谈.NET技术,一句代码实现批量数据绑定[下篇] 狼人:
    一起谈.NET技术,晚绑定场景下对象属性赋值和取值可以不需要PropertyInfo 狼人:
    一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(六)流光追影 狼人:
    一起谈.NET技术,ASP.NET下用URLRewriter重写二级域名 狼人:
    这样覆写Object类的toString方法对吗
    【Cocos2DX 】初窥门径(7)无限地图滚动
    poj2975——Caesar密码
    [置顶] poi最简单易学解析xls代码
  • 原文地址:https://www.cnblogs.com/daomeidan/p/12624103.html
Copyright © 2011-2022 走看看