redis cluster和hash slot
redis cluster介绍
从redis3.0.0开始,官方支持了redis cluster的集群模式,结束了redis没有集群的时代。
redis cluster实现(hash slot算法)
Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)
的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16
算法来取模得到所属的slot
,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384
。
(为什么是16384,选取了16384是因为crc16会输出16bit的结果,可以看作是一个分布在0-2^16-1之间的数,redis的作者测试发现这个数对2^14求模的会将key在0-2^14-1之间分布得很均匀,因此选了这个值。)
在构建redis cluster集群时,master必须大于等于3,否则会创建失败。并且,当集群中存活的master节点数小于总节点数的一半的话,集群就无法提供服务了。
例:我们有三个master节点A、B、C,采用哈希槽 (hash slot)
的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:
节点A: ~
节点B: ~
节点C: ~
节点在收到读写请求时,会根据CRC16(key) % 16384算出的槽号去查是否指向自己,如果是则进行处理,如果不是,则返回moved错误,moved错误携带正确的节点IP和端口号返回客户端并指引其转向执行,而后客户端每次关于该key都会去moved返回的节点执行。
当节点的key正在迁移的时候,收到关于该key的请求,那么节点会返回ask错误,并但会正确的节点ip和端口号给客户端去执行。但是这个转向只对本次请求有效,后面关于该key的请求还是会发送到目前正在处理key迁移的节点,直到key迁移完毕并发送广播通知。
当有新节点D加入时,redis cluster的这种做法是从各个节点的前面各拿取一部分slot到D
上。会变成下面这样:
节点A: ~
节点B: ~
节点C: ~
节点D: ~ , ~ , ~
删除节点也是类似,数据会均匀的迁移到剩余节点上,迁移完成后就可以删除这个节点了。
cluster节点通信
redis cluster的构造类似下图所示
在 redis cluster 架构下,每个 redis 要放开两个端口号,比如一个是 6379,另外一个就是 加1w 的端口号,比如 16379。
16379 端口号是用来进行节点间通信的,也就是 cluster bus 的东西,cluster bus 的通信,用来进行故障检测、配置更新、故障转移授权。cluster bus 用了另外一种二进制的协议,gossip 协议,用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间。
主从模式
redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。
不过redis的cluster模式不支持主从的树状结构。
主从模式最经典的是哨兵(Sentinel)模式,而Sentinel模式需要至少三台机器(一主二从三哨兵),而cluster模式建议每个master最好部署在不同的物理机上,所以,算一算搭建一个高可用的redis cluster至少需要九台物理机……
最新文章
- HTML5 学习总结(四)——canvas绘图、WebGL、SVG
- ASP.NET 操作Excel中的DCOM配置方式
- 关于启用 HTTPS 的一些经验分享(二)
- 6410移植android4.4.2笔记(持续更新)
- oracle 数据库导出数据
- js时间倒计时
- [转] 配置Log4j
- sort关于去除重复/查找非重复/查找重复/统计
- 在HCI层看从inquiry的整个过程
- 基于PowerShell 3.0的web接口测试
- TestDirector创建域或工程
- MongoDB应用介绍之前
- python3的正则表达式(regex)
- JavaScript:彻底理解同步、异步和事件循环(Event Loop)
- R语言-图形初阶
- java.lang的详细解读
- react-native-router-flux
- centos7,zabbix3.2通过zabbix_java_gateway监控jmx[java/tomcat]
- 莫烦theano学习自修第八天【分类问题】
- React组件间的通信
热门文章
- list reverse
- tftp-server服务器搭建
- Hello World 之Spring Boot 调用图数据库Neo4j
- Error configuring application listener of class org.springframework.web.context.ContextLoaderListene 标签: tomcat
- Selenium-------ActionChainApi接口详解
- 【JZOJ4887】【NOIP2016提高A组集训第13场11.11】最大匹配
- 通过JS操作CSS
- SDUT-3361_迷宫探索
- C++复制初始化的限制
- 实用的cmd命令