redis 集群

根据之前的诸多分析,我们知道单机的redis有很多的局限性,所以可以使用多台机器来实现分区存储,构建更大的数据库,满足更高的业务需求。

之前我们实现的主从复制,可以实现一主多从的架构,但是抽象来看,其实也只是一个redis架构,只有一个主库实现读写,并不是多主多从的结构,所以我们需要redis集群来分散单台服务器的访问压力,实现负载均衡,同时减轻单机的存储上限,提高扩展性。

单机架构

在redis3.0时,提供了redis cluster来满足集群搭建的需求,可以进行手动搭建,分配节点和节点握手,然后手动分配槽。

同时官方提供了redis-trib.rb的ruby脚本,推荐使用该脚本来实现快速搭建和管理。值得一提的是,单机redis本身是有0-15个数据库的,而集群中每个redis节点只有db0。

集群架构

数据分区

如果是单机存储的话,直接将数据存放在单机redis就行了。但是如果是集群存储,就需要考虑到数据分区了。

数据分区通常采取顺序分布和hash分布。

分布方式 顺序分布 哈希分布
数据分散度 分布倾斜 分布散列
顺序访问 支持 不支持

顺序分布保障了数据的有序性,但是离散性低,可能导致某个分区的数据热度高,其他分区数据的热度低,分区访问不均衡。

哈希分布也分为多种分布方式,比如取余哈希分区,一致性哈希分区等。而redis cluster采用的是虚拟槽分区的方式。


虚拟槽分区

redis cluster设置有0~16383的,每个槽映射一个数据子集,通过hash函数,将数据存放在不同的槽位中,每个集群的节点保存一部分的槽。

每个key存储时,先经过哈希函数CRC16(key)得到一个整数,然后整数与16384取余,得到槽的数值,然后找到对应的节点,将数据存放入对应的槽中。


集群通信

但是寻找槽的过程并不是一次就命中的,比如上图key将要存放在14396槽中,但是并不是一下就锁定了node3节点,可能先去询问node1,然后才访问node3。

而集群中节点之间的通信,保证了最多两次就能命中对应槽所在的节点。因为在每个节点中,都保存了其他节点的信息,知道哪个槽由哪个节点负责。这样即使第一次访问没有命中槽,但是会通知客户端,该槽在哪个节点,这样访问对应节点就能精准命中。

  1. 节点A对节点B发送一个meet操作,B返回后表示A和B之间能够进行沟通。
  2. 节点A对节点C发送meet操作,C返回后,A和C之间也能进行沟通。
  3. 然后B根据对A的了解,就能找到C,B和C之间也建立了联系。
  4. 直到所有节点都能建立联系。

这样每个节点都能互相直到对方负责哪些槽。

集群伸缩

集群并不是建立之后,节点数就固定不变的,也会有新的节点加入集群或者集群中的节点下线,这就是集群的扩容和缩容。但是由于集群节点和槽息息相关,所以集群的伸缩也对应了槽和数据的迁移


集群扩容

当有新的节点准备好加入集群时,这个新的节点还是孤立节点,加入有两种方式。一个是通过集群节点执行命令来和孤立节点握手,另一个则是使用脚本来添加节点。

  1. cluster_node_ip:port: cluster meet ip port new_node_ip:port
  2. redis-trib.rb add-node new_node_ip:port cluster_node_ip:port

通常这个新的节点有两种身份,要么作为主节点,要么作为从节点:

  • 主节点:分摊槽和数据
  • 从节点:作故障转移备份

其中槽的迁移有以下步骤:


集群缩容

下线节点的流程如下:

  1. 判断该节点是否持有槽

    • 未持有槽就跳转到下一步
    • 持有槽则先迁移槽到其他节点
  2. 通知其他节点(cluster forget)忘记该下线节点
  3. 关闭下线节点的服务

需要注意的是如果先下线主节点,再下线从节点,会进行故障转移,所以要先下线从节点。

故障转移

除了手动下线节点外,也会面对突发故障。

下面提到的主要是主节点的故障,因为从节点的故障并不影响主节点工作,对应的主节点只会记住自己哪个从节点下线了,并将信息发送给其他节点。故障的从节点重连后,继续官复原职,复制主节点的数据。

只有主节点才需要进行故障转移。在之前学习主从复制时,我们需要使用redis sentinel来实现故障转移。而redis cluster则不需要redis sentinel,其自身就具备了故障转移功能。

根据前面我们了解到,节点之间是会进行通信的,节点之间通过ping/pong交互消息,所以借此就能发现故障。

集群节点发现故障同样是有主观下线客观下线

主观下线

对于每个节点有一个故障列表,故障链表维护了当前节点接受到的其他所有节点的信息。

当半数以上的持有槽的主节点都标记某个节点主观下线,就会尝试客观下线。

客观下线


故障转移

集群同样具备了自动转移故障的功能,和哨兵有些类似,在进行客观下线之后,就开始准备让故障节点的从节点“上任”了。

首先是进行资格检查,只有具备资格的从节点才能参加选举:

  • 故障节点的所有从节点检查和故障主节点之间的断线时间
  • 超过cluster-node-timeout * cluster-slave-validati-factor(默认10)则取消选举资格

然后是准备选举顺序,不同偏移量的节点,参与选举的顺位不同。

offset最大的slave节点,选举顺位最高,最优先选举。而offset较低的slave节点,要延迟选举。

当有从节点参加选举后,主节点收到信息就开始投票。偏移量最大的节点,优先参与选举就更大可能获得最多的票数,称为主节点。

当从节点走马上任变成主节点之后,就要开始进行替换主节点

  1. 让该slave节点执行slaveof no one变为master节点
  2. 将故障节点负责的槽分配给该节点
  3. 向集群中其他节点广播Pong消息,表明已完成故障转移
  4. 故障节点重启后,会成为new_master的slave节点

集群的读写分离

在集群模式下的从节点是只读连接的,也就是说集群模式中的从节点是拒绝任何读写请求的。当有命令尝试从slave节点获取数据时,slave节点会重定向命令到负责该数据所在槽的节点。

为什么说是只读连接呢?因为slave可以执行命令:readonly,这样从节点就能读取请求,但是这只是在这次连接中生效。也就是说,当客户端断开连接重启后,再次请求又变成重定向了。

集群模式下的读写分离更加复杂,需要维护不同主节点的从节点和对于槽的关系。

通常是不建议在集群模式下构建读写分离,而是添加节点来解决需求。不过考虑到节点之间信息交流带来的带宽问题,官方建议节点数不超过1000个。

单机?集群?

集群并不是最优选,而是根据不同的业务需求来判断是否搭建集群,当较小的业务利用单机redis和redis sentinel就能满足需求时,不需要强行搭建集群。

集群也有部分限制:

  • redis事务操作的key必须在一个节点上
  • 批量操作如mset、mget必须在一个槽里
  • 只有一个数据库db0
  • 有些命令无法跨节点,如scan、flush、keys
  • 更难以维护

所以集群搭建还要考虑单机redis是否已经不能满足业务的并发量,在redis sentinel同样能够满足高可用,且并发并未饱和的前提下,搭建集群反而是画蛇添足了。

初探redis:redis集群的数据分区和故障转移相关推荐

  1. rediscluster全局数据_redis迁移,从redis cluster集群迁移数据到另外一个redis cluster集群...

    redis迁移,redis集群迁移$ yum install automake libtool autoconf bzip2 -y $ git clone https://github.com/vip ...

  2. 故障转移集群服务器 重装系统,安装故障转移群集前的准备工作

    安装故障转移群集前的准备工作 08/24/2016 本文内容 适用于: SQL Server(所有支持的版本) 安装 SQL Server 故障转移群集之前,必须选择运行 SQL Server 的硬件 ...

  3. Redis Cluster集群知识学习总结

    Redis集群解决方案有两个: 1)  Twemproxy: 这是Twitter推出的解决方案,简单的说就是上层加个代理负责分发,属于client端集群方案,目前很多应用者都在采用的解决方案.Twem ...

  4. Redis 分片集群搭建

    Redis 分片集群模式 主从和哨兵可以解决高可用.高并发读的问题.但是依然有两个问题没有解决: 海量数据存储问题,单台服务的磁盘存储终究是有瓶颈: master 负责写操作,高并发写情况下,单台 m ...

  5. redis cluster 集群redis5.xj数据迁移

    集群搭建参考我上片文章 https://blog.csdn.net/sinat_36759535/article/details/106605884 现在网上大都是基于3.x和4.x的迁移方案:他们通 ...

  6. redis cluster集群模式总结

    2019独角兽企业重金招聘Python工程师标准>>> Redis集群介绍 Redis 集群是一个提供在多个Redis间节点间共享数据的程序集. Redis集群并不支持处理多个key ...

  7. redis入门——集群篇

    redis入门--集群篇 @(Redis)[服务器, 集群, 主从复制, jedis] redis入门集群篇 主从复制 基本介绍 主从配置 主redis配置 从redis配置 Redis集群 基本介绍 ...

  8. redis cluster集群模式简述

    前言 redis最开始使用主从模式做集群,若master宕机需要手动配置slave转为master:后来为了高可用提出来哨兵模式,该模式下有一个哨兵监视master和slave,若master宕机可自 ...

  9. redis mysql 集群_Redis(五)、Redis数据库集群相关

    Redis数据库集群 第1章 集群简介 Redis 集群是一个分布式(distributed).容错(fault-tolerant)的 Redis 实现, 集群可以使用的功能是普通单机 Redis 所 ...

最新文章

  1. 对于Wannacry“永恒之蓝”病毒 查看自己电脑是否安全
  2. LeetCode Rotate Image(矩阵的旋转)
  3. 在对话框中加入属性页
  4. 统计完全二叉树的节点数
  5. Dubbo系统间通信
  6. kdj超卖_一个判断股票超买超卖现象的指标——KDJ,简单明了,准确且省心
  7. suse安装php,SUSE下安装LAMP
  8. 加速你的Python
  9. less webpack 热更新_webpack---less+热更新 使用
  10. 运行Maven是报错:No goals have been specified for this build
  11. BZOJ 1619 [Usaco2008 Nov]Guarding the Farm 保卫牧场:dfs【灌水】
  12. 责任链模式(Chain of Responsibility Pattern)
  13. java io面试题_【Java面试】Java常见IO面试题!
  14. 去oracle过程,记一次Oracle数据恢复过程
  15. [转] Java之ACM速成
  16. prison break
  17. PIXI.JS一镜到底动画
  18. 笔记本计算机的功率一般多少,笔记本电脑功率是多少?
  19. 关于ASP木马提升权限
  20. iOS开发-ZFPlayer的简单使用 播放单个网络视频

热门文章

  1. 安全专家郭盛华:黑客是如何入侵手机的?
  2. 时钟周期是干什么的?底层原理是什么?
  3. Response.addHeader()和Response.setHeader()的区别,别再傻傻分不清;
  4. 关于SetCapture和GetCapture
  5. 数据产品经理修炼手册(从零基础到大数据产品实践)
  6. 异常检测(Anomaly Detection)综述
  7. Linux系统下如何复制粘贴
  8. 正定子龙大桥正式开工建设
  9. 逻辑回归中的梯度下降法
  10. cuBLAS使用(4)