分布式存储:Redis 集群(Redis Cluster)

1. 数据分布

1.1 数据分布理论

(1)分布式数据库首先要解决把整个数据集按照分区规则映射到对个节点上的问题,每个节点负责整体数据的一个子集
(2)节点取余分区。使用Redis 的键或者用户ID,再根据节点数据量N 使用公式:hash(key)%N 计算出hash值。问题:当节点数变化时,入扩容或者收缩节点,数据到节点的映射需要重新计算,导致数据迁移。
(3)常用的数据库分表规则:一般采用预分区,提前根据数据量规划好分区数,比如512或者1024,保证可支撑未来一段时间的数据量,再根据负载情况将表迁移到其他的数据库中。
(4)
a. 一致性hash分区(Distributed Hash Table)。实现思路是:为每一个节点分配一个token,范围一般在0~2^32。这些token构成一个hash环。据读写执行节点查找操作时,先根据key计算hash值,然后顺时针找到第一个>=该hash值的token节点。
b. 一致性hash的优点:在加入和删除节点只影响hash环中相邻的节点,对其他节点无影响。
c.存在的问题:增减节点会造成hash环中部分数据没法命中。当使用少量节点时,节点变化将大范围影响hash环中数据的映射,所以不适合少量节点的方案。
d. 为了解决上述问题,一些分布式系统采用虚拟槽对一致性hash进行改造。
(5)虚拟槽分区
数据映射到槽中,每个槽是一个整数集合(比如0-3276),让后在把槽映射到节点。槽是数据迁移的基本单位。这样的好处是方便数据拆分和集群扩展。

1.2 Redis 数据分区

(1)Redis Cluster 采用虚拟槽分区,所有的键根据hash函数映射到0~16383整数槽内,计算公式slot=CRC16(key)&16383。
(2)Redis虚拟槽的优点
a. 解耦数据和节点之间的关系。

1.3 集群功能限制

(1)key 的批量操作,比如mset, mget 只支持在相同slot。
(2)只支持key在同一节点上事务操作

2. 搭建集群

2.1 准备节点

(1)至少6个节点才能保证高可用集群。每个节点配置cluster-enable yes。一般划分为3个目录:conf,data,log。

2.2 节点握手

(1)通过Gossip协议, 客户端在摸个节点上对另外一个节点执行 cluster meet ip port。
(2)在集群任意节点上执行cluster meet命令加入新的节点。
(3)节点建立握手之后,集群还不能正常工作,这时集群处于下线状态,所有数据读写都被禁止

2.3 分配槽

(1)Redis集群把所有的数据映射到16384个槽中。
(2)通过 cluster addslots 命令为节点分配槽。
(3)使用 cluster replicate nodeId 命令让一个节点成为从节点。

3. 节点通信

3.1 通信流程

(1)集群中的每个节点单独开辟一个TCP通道,用于节点之间彼此之间通信。
(2)这个节点在固定周期内通过特定的规则选择几个节点发送ping消息。
(3)接受ping消息的节点用pong消息作为响应。

3.2 Gossip 消息

(1)常用的Gossip 消息分为: ping消息,pong 消息, meet 消息,fail 消息。

3.3 节点选择

4. 集群伸缩

4.1 伸缩原理

基于槽的的数据迁移。每个节点把一部分槽和数据迁移到新的节点6385,每个节点负责的槽和数据相比之前变少从而达到了集群扩容的目的。

4.3 收缩集群

(1)首先确定下线节点是否有负责的槽,如果是,需要把槽迁移到其他节点上。
(2)当下线节点不在负责槽,就可以通知集群内其他节点忘记下线节点。

5. 请求路由

5.1 请求重定向

(1)Redis 集群对客户通信协议做了比较大的修改,为了追求性能最大化,并没有采用代理的方式而是采用了客户端直连节点的方式。
(2)客户端发送键命令到任意节点;该节点计算槽和对应的节点;指向自身,执行命令,否者回复MOVED; 客户端收到MOVED命令后,重定向发送键命令到目标节点。
(3)计算槽: CRC16函数计算出散列值,再取对16383的余数,使每个键都可以映射到0–16383槽范围内。
(4)槽节点查询:

5.2 Smart 客户端

(1)Smart 客户端在内部维护slot–>node 的映射关系,本地就实现了键到节点的查询
(2)Redis 客户端内部维护slots缓存表,并且对每个节点维护连接池。

6. 故障转移

6.1 故障发现

(1)主观下线:当cluster-note-timeout 时间内某个节点无法和另外一个节点顺利完成ping消息通信时,则将该节点标记为主观下线
(2)客观下线:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值