zoukankan      html  css  js  c++  java
  • Azure Redis Cache (5) Redis Cache Cluster集群模式

      《Windows Azure Platform 系列文章目录

      

      Redis Cluster 3.0之后的版本,已经支持Redis Cluster集群模式,Redis Cluster采用无中心架构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。其redis-cluster架构图如下

      

      架构特点:

      1.所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽

      2.节点的fail是通过集群中超过半数的节点检测失效时才生效

      3.客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

      4.redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护node<->slot<->value

      5.Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中

      Redis Cluster集群节点分配:

      假设我们的Redis Cluster有三个节点,分别是A,B和C,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:

      节点A覆盖:0-5460

      节点B覆盖:5461-10922

      节点C覆盖:10923-16383

      插入数据:

      如果插入一个值,按照Redis Cache Cluster的哈希槽的算法: CRC16('key')%16384 = 6782。 就会把这个key 的存储分配到 B 上了。同样,当我连接(A,B,C)任何一个节点想获取'key'这个key时,也会这样的算法,然后内部跳转到B节点上获取数据   

      新增一个主节点:

      新增一个节点D,redis cluster的这种做法是从各个节点的前面各拿取一部分slot到D上,我会在接下来的实践中实验。大致就会变成这样:

      节点A覆盖:1365-5460

      节点B覆盖:6827-10922

      节点C覆盖:12288-16383

      节点D覆盖:0-1364,5461-6826,10923-12287

      同样删除一个节点也是类似,移动完成后就可以删除这个节点了

      所以我们在设置Redis Cache集群的Scale Out,需要小心处理,因为数据会产生移动,消耗大量的IO

  • 相关阅读:
    git stash错误小记
    PHP,Mysql根据经纬度计算距离并排序
    JS~字符串长度判断,超出进行自动截取(支持中文)
    Redis的三种启动方式
    Ubuntu 14.04 LTS下安装Google Chrome浏览器
    PHP-PHPExcel用法详解
    git设置log的别名 for hist log样式格式化
    Ubuntu系统下配置PHP支持SQLServer 2005
    Git命令图片版
    《一线架构师实践指南》读后感(二)
  • 原文地址:https://www.cnblogs.com/threestone/p/9917176.html
Copyright © 2011-2022 走看看