一、Redis分布式扩展之Redis Cluster方案

主从切换的过程中会丢失数据,因为只有一个master,只能单点写,没有解决水平扩容的问题。而且每个节点都保存了所有数据,一个是内存的占用率较高,另外就是如果进行数据恢复时,非常慢。而且数据量过大对数据IO操作的性能也会有影响。所以我们同样也有对Redis数据分片的需求,所谓分片就是把一份大数据拆分成多份小数据,在3.0之前,我们只能通过构建多个redis主从节点集群,把不同业务数据拆分到不冉的集群中,这种方式在业务层需要有大量的代码来完成数据分片、路由等工作,导致维护成本高、增加、移除节点比较繁琐。Redis3.0之后引入了Redis Cluster集群方案,它用来解决分布式扩展的需求,同时也实现了高可用机制。

1.Redis Cluster架构

一个Redis Cluster由多个Redis节点构成,不同节点组服务的数据没有交集,也就是每个一节点组对应数据sharding的一个分片。节点组内部分为主备两类节点,对应master和slave节点。两者数据准实时一致,通过异步化订的主备复制机制来保证。一个节点组有且只有一个master节点,同时可以有0到多个slave节点,在这个节点组中只有master节点对用户提供些服务,读服务可以由master或者slave提供。
如图中,包含三个master节点以及三个master对应的slave节点,一般一组集群至少要6个节点才能保证完整的高可用。其中三个master会分配不同的slot(表示数据分片区间),当master出现故障时,slave会自动选举成为master顶替主节点继续提供服务。

2.关于gossip协议

在整个redis cluster架构中,如果出现以下情况

  1. 新加入节点
  2. slot迁移
  3. 节点宕机
  4. slave选举成为master

我们希望这些变化能够让整个集群中的每个节点都能够尽快发现,传播到整个集群并且集群中所有节点达成一致,那么各个节点之间就需要相互连通并且携带相关状态数据进行传播,按照正常的逻辑是采用广播的方式向集群中的所有节点发送消息,有点是集群中的数据同步较快,但是每条消息都需要发送给所有节点,对CPU和带宽的消耗过大,所以这里采用了gossip协议。Gossip protocol 也叫 Epidemic Protocol (流行病协议),别名很多比如:“流言算法”、“疫情传播算法”等。它的特点是,在节点数量有限的网络中,每个节点都会“随机”(不是真正随机,而是根据规则选择通信节点)与部分节点通信,经过一番杂乱无章的通信后,每个节点的状态在一定时间内会达成一致,如图所示。
假设我们提前设置如下规则:

  1. Gossip 是周期性的散播消息,把周期限定为 1 秒
  2. 被感染节点随机选择 k 个邻接节点(fan-out)散播消息,这里把 fan-out 设置为 3,每次最多往 3个节点散播。
  3. 每次散播消息都选择尚未发送过的节点进行散播
  4. 收到消息的节点不再往发送节点散播,比如 A -> B,那么 B 进行散播的时候,不再发给 A。这里一共有 16 个节点,节点 1 为初始被感染节点,通过 Gossip 过程,最终所有节点都被感染:
3.gossip协议消息

gossip协议包含多种消息,包括ping,pong,meet,fail等等。
ping:每个节点都会频繁给其他节点发送ping,其中包含自己的状态还有自己维护的集群元数据,互相通过ping交换元数据;
pong: 返回ping和meet,包含自己的状态和其他信息,也可以用于信息广播和更新;
fail: 某个节点判断另一个节点fail之后,就发送fail给其他节点,通知其他节点,指定的节点宕机了。
meet:某个节点发送meet给新加入的节点,让新节点加入集群中,然后新节点就会开始与其他节点进行通信,不需要发送形成网络的所需的所有CLUSTER MEET命令。发送CLUSTER MEET消息以便每个节点能够达到其他每个节点只需通过一条已知的节点链就够了。由于在心跳包中会交换gossip信息,将会建节点间缺失的链接。

4.gossip的优缺点

优点: gossip协议的优点在于元数据的更新比较分散,不是集中在一个地方,更新请求会陆陆续续,打到所有节点上去更新有一定的延时,降低了压力; 去中心化、可扩展、容错、一致性收敛、简单。 由于不能保证某个时刻所有节点都收到消息,但是理论上最终所有节点都会收到消息,因此它是一个最终一致性协议。
缺点: 元数据更新有延时可能导致集群的一些操作会有一些滞后。 消息的延迟 , 消息冗余 。

5.数据分布

Redis Cluster中,Sharding采用slot(槽)的概念,一共分成16384个槽,这有点儿类似pre sharding思路。对于每个进入Redis的键值对,根据key进行散列,分配到这16384个slot中的某一个中。使用的hash算法也比较简单,就是CRC16后16384取模[crc16(key)%16384]。Redis集群中的每个node(节点)负责分摊这16384个slot中的一部分,也就是说,每个slot都对应一个node负责处理。
如图5所示,假设现在我们是三个主节点分别是:A, B, C 三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是

6.客户端重定向

如图5-6所示,假设k这个key应该存储在node3上,而此时用户在node1或者node2上调用 set k v 指令,这个时候redis cluster怎么处理呢?

127.0.0.1:7291> set qs 1
(error) MOVED 13724 127.0.0.1:7293

服务端返回MOVED,也就是根据key计算出来的slot不归当前节点管理,服务端返回MOVED告诉客户端去7293端口操作。
这个时候更换端口,用redis-cli –p 7293操作,才会返回OK。或者用./redis-cli -c -p port的命令。但是导致的问题是,客户端需要连接两次才能完成操作。所以大部分的redis客户端都会在本地维护一份slot和node的对应关系,在执行指令之前先计算当前key应该存储的目标节点,然后再连接到目标节点进行数据操作。在redis集群中提供了下面的命令来计算当前key应该属于哪个slot

redis> cluster keyslot key1
6.高可用主从切换原理

如果主节点没有从节点,那么当它发生故障时,集群就将处于不可用状态。
一旦某个master节点进入到FAIL状态,那么整个集群都会变成FAIL状态,同时触发failover机制,failover的目的是从slave节点中选举出新的主节点,使得集群可以恢复正常,这个过程实现如下:

当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master。由于挂掉的、master可能会有多个slave,从而存在多个slave竞争成为master节点的过程, 其过程如下:

  1. slave发现自己的master变为FAIL
  2. 将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST 信息
  3. 其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发送一次ack
  4. 尝试failover的slave收集master返回的FAILOVER_AUTH_ACK
  5. slave收到超过半数master的ack后变成新Master (这里解释了集群为什么至少需要三个主节点,如果只有两个,当其中一个挂了,只剩一个主节点是不能选举成功的)
  6. 广播Pong消息通知其他集群节点。
    从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,一定的延迟确保我们等待FAIL状态在集群中传播,slave如果立即尝试选举,其它masters或许尚未意识到FAIL状态,可能会拒绝投票。
    延迟计算公式: DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms
    SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已复制的数据越新。这种方式下,持有最新数据的slave将会首先发起选举
7.集群什么时候不可用
  1. 无主从备份,某一节点宕机
  2. 某一节点主从全部宕机
  3. 超半数主节点宕机
二、codis的架构

如图5-7所示,表示Codis的整体架构图。
Codis Proxy: 客户端连接的 Redis 代理服务, 实现了 Redis 协议。 除部分命令不支持以外(不支持的命令列表),表现的和原生的 Redis 没有区别(就像 Twemproxy)。
对于同一个业务集群而言,可以同时部署多个 codis-proxy 实例;不同 codis-proxy 之间由 codis-dashboard 保证状态同
codis-redisgroup: 代表一个redis服务集群节点,一个RedisGroup里有一个Master,和多个Slave
Zookeeper:Codis 依赖 ZooKeeper 来存放数据路由表和 codis-proxy 节点的元信息, codis-config 发起的命令都会通过 ZooKeeper 同步到各个存活的 codis-proxy.

redis 集群模式原理相关推荐

  1. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  2. Redis:Redis集群模式(Cluster)原理

    1.前言 由于Redis主从复制模式和Redis哨兵模式采用的都是复制Master节点的数据,实现读写分离.但是这种设计存在一个严重的问题,它没有真正意义上实现数据分片.两个模式都有一个问题,不能水平 ...

  3. redis集群模式工作原理

    目录 1 redis集群模式背景 2 redis cluster介绍 2.1 节点间的内部通信机制 2.2 基本通信原理 2.2.1 gossip 协议 2.2.2 ping 消息深入 3 分布式寻址 ...

  4. redis集群模式详解

    redis集群模式详解 一,redis集群 1,哨兵集群 2,redis Cluster 二,redis Cluster集群的搭建 1,配置文件 2,redis服务启动 三,springboot连接r ...

  5. Redis数据库(四)——Redis集群模式(主从复制、哨兵、Cluster)

    Redis数据库(四)--Redis集群模式(主从复制.哨兵.Cluster) 一.Redis主从复制 1.主从复制流程 二.哨兵模式 1.哨兵模式集群架构 2.哨兵模式主要功能 3.哨兵监控整个系统 ...

  6. Redis集群模式搭建

    前言 本文主要介绍如何搭建redis集群环境 原理简介 - Redis 集群是一个提供在多个Redis间节点间共享数据的程序集,集群节点共同构建了一个去中心化的网络,集群中的每个节点拥有平等的身份,节 ...

  7. Redis集群的原理和搭建

    Redis集群的原理和搭建 前言 Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.单节点的Redis已经就达到了很高的性能,为了提高可用性我们可以使用Re ...

  8. redis集群模式登陆

    总结 redis单机模式时,登陆redis的命令格式: ./redis-cli -h 地址 -p 端口 redis集群模式时,登陆redis的命令格式: ./redis-cli -h 地址 -p 端口 ...

  9. Redis集群模式源码分析

    目录 1 主从复制模式 2 Sentinel(哨兵)模式 3 Cluster模式 4.参考文档 1 主从复制模式 主库负责读写操作,从库负责数据同步,接受来自主库的同步命令.通过分析Redis的客户端 ...

最新文章

  1. outlook正在与服务器联系以获取信息,Outlook 2016点击邮件显示正在与服务器联系以获取信息...
  2. poj 2987 Firing【最大权闭合子图+玄学计数 || BFS】
  3. 中国大学MOOC 人工智能导论第三章测试
  4. float排版c语言,如何解决因float带来的排版问题?
  5. Tomcat上下文JUnit @Rule
  6. JS~~~ 前端开发一些常用技巧 模块化结构 命名空间处理 奇技淫巧!!!!!!...
  7. python 生成xml文件
  8. FCKeditor.NET的配置、扩展与安全性经验交流
  9. mac android 投屏幕,将android/ios屏幕投射到windows/mac的良好参考
  10. 内核调试神器SystemTap — 探测点与语法(二)
  11. 报表工具如何实现多次导入Excel
  12. 黑域 绿色守护 安卓最好的省电工具?
  13. android多开技术,多开常见配置 - 技术交流 - 逍遥安卓论坛 - Powered by Discuz!
  14. java毕业设计网上租贸系统mybatis+源码+调试部署+系统+数据库+lw
  15. 服务器iis建站维护,云服务器iis建站教程
  16. 公众号采集,公众号批量自动采集,微信公众号免费文章采集
  17. 色深和色度采样,视频编解码
  18. [Vuforia] 详解·高通Vuforia识别追踪3D物体/模型,Unity开发
  19. Kindle 转换器
  20. 拼多多店铺打造爆款必经之路,竞品分析、店铺基本操作

热门文章

  1. 《Orleans 构建高性能分布式Actor服务》读书笔记
  2. matlab画奥迪标志,绘画汽车,用PS绘制一个逼真的奥迪汽车
  3. LA4670 Dominating Patterns[AC自动机]
  4. android 动画坐标,Android应用坐标系统全面详解
  5. 自定义View和控件
  6. 魅族魅蓝A5完美打开Usb调试模式的方法
  7. python四瓣花图形_详解python使用turtle库来画一朵花
  8. c++ 树状数组三种方法
  9. excel表格打印每页都有表头_office办公软件Excel表格的打印技巧,建议收藏
  10. 中文域名都有哪些类型?