第二部分:Redis数据库的三种模式(③:Cluster 集群模式)
以下是本篇文章正文内容,如有错误麻烦请指出。 谢谢 !!!
一、集群简介
1、描述
- Redis Cluster是一种服务器 Sharding 技术,3.0版本开始正式提供;
- Redis 的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,很浪费内存;
- Redis3.0上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说每台 Redis 节点上存储不同的内容。
2、集群作用
- 分散单台服务器的访问压力,实现负载均衡;
- 分散单台服务器的存储压力,实现可扩展性;
- 降低单台服务器宕机带来的业务灾难。
二、Redis 集群结构设计
1、描述
- Redis 集群没有使用一致性 hash,而是引入了哈希槽【hash slot】的概念;
- Redis 集群有16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽。集群的每个节点负责一部分hash槽。
2、数据存储设计
- 通过算法设计,计算出key应该保存的位置;
- 将所有的存储空间计划切割成16384份,每台主机保存一部分,每份代表的是一个存储空间,不是一个key的保存空间;
- 将key按照计算出的结果放到对应的存储空间。
3、集群内部通讯设计
- 各个数据库相互通信,保存各个库中槽的编号数据;
- 一次命中,直接返回;
- 一次未命中,告知具体位置。
说明: 因为A、B、C三个节点都互相存储了各自占用的hash slot(hash槽),当第一次去A节点查询的时候,发现数据不再A节点上,此时A节点就会告知查询数据所在的具体位置。
4、Redis 集群节点的删除和添加
-
由于Redis集群把总的存储空间计划切割成16384份,集群的每个节点负责一部分hash槽。
-
举个例子,比如当前集群有3个节点,那么:
节点 A 包含 0 到 5460 号哈希槽 节点 B 包含 5461 到 10922 号哈希槽 节点 C 包含 10923 到 16383 号哈希槽
-
这种结构很容易添加或者删除节点。
(1)如果想新添加个节点 D, 此时需要从节点 A,B,C 中得部分槽到 D 上;
(2)如果想移除节点 A ,需要将 A 中的槽移到 B 和 C 节点上,然后将没有任何槽的 A 节点从集群中移除即可;
(3)由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态。
(4)在 Redis 的每一个节点上,都有这么两个东西,一个是插槽(slot),它的的取值范围是:0-16383。还有一个就是 cluster,可以理解为是一个集群管理的插件。当我们的存取的 Key到达的时候,Redis 会根据 CRC16 的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
5、Redis 集群的主从复制模型
- 为了保证高可用,redis-cluster集群引入了主从复制模型,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点;
- 当其它主节点 ping 一个主节点 A 时,如果半数以上的主节点与 A 通信超时,那么认为主节点 A 宕机了;
- 如果主节点 A 和它的从节点 A1 都宕机了,那么该集群就无法再提供服务了。
6、集群的特点
- 所有的 Redis 节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽;
- 节点的 Fail 是通过集群中超过半数的节点检测失效时才生效;
- 客户端与 Redis 节点直连,不需要中间代理层;
- 客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
对以前的知识回顾,加深基础知识!
每天进步一点点,也许某一天你也会变得那么渺小!!!