什么是redis的集群

按我个人的理解,redis集群就是实现多个redis节点之间进行数据的共享。

集群有什么好处:

  • 将数据自动split到多个节点进行存储。
  • 当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求。

redis集群的数据共享

redis集群采用的是数据分片,即sharding,而并不是一致性哈希(consistency hash)。

一个redis集群包含16834个哈希槽(hash slot)数据库中的每个键都属于这 16384 个哈希槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 keyCRC16 校验和

集群中的每个节点负责处理一部分哈希槽。 举个例子, 一个集群可以有三个哈希槽, 其中:

  • 节点 A 负责处理 0 号至 5500 号哈希槽。
  • 节点 B 负责处理 5501 号至 11000 号哈希槽。
  • 节点 C 负责处理 11001 号至 16384 号哈希槽。

这种将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点。 比如说:

  • 如果用户将新节点 D 添加到集群中, 那么集群只需要将节点 A 、B 、 C 中的某些槽移动到节点 D 就可以了。
  • 与此类似, 如果用户要从集群中移除节点 A , 那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C , 然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。

因为将一个哈希槽从一个节点移动到另一个节点不会造成节点阻塞, 所以无论是添加新节点还是移除已存在节点, 又或者改变某个节点包含的哈希槽数量, 都不会造成集群下线。

Redis 集群中的主从复制

为了使得集群在一部分节点下线或者无法与集群的大多数(majority)节点进行通讯的情况下, 仍然可以正常运作, Redis 集群对节点使用了主从复制功能: 集群中的每个节点都有 1 个至 N 个复制品(replica), 其中一个复制品为主节点(master), 而其余的 N-1 个复制品为从节点(slave)。

在之前列举的节点 A 、B 、C 的例子中, 如果节点 B 下线了, 那么集群将无法正常运行, 因为集群找不到节点来处理 5501 号至 11000 号的哈希槽。

另一方面, 假如在创建集群的时候(或者至少在节点 B 下线之前), 我们为主节点 B 添加了从节点 B1 , 那么当主节点 B 下线的时候, 集群就会将 B1 设置为新的主节点, 并让它代替下线的主节点 B , 继续处理 5501 号至 11000 号的哈希槽, 这样集群就不会因为主节点 B 的下线而无法正常运作了。

不过如果节点 B 和 B1 都下线的话, Redis 集群还是会停止运作。

Redis 集群的一致性保证(guarantee)

Redis 集群不保证数据的强一致性(strong consistency): 在特定条件下, Redis 集群可能会丢失已经被执行过的写命令。

使用异步复制(asynchronous replication)是 Redis 集群可能会丢失写命令的其中一个原因。 考虑以下这个写命令的例子:

  • 客户端向主节点 B 发送一条写命令。
  • 主节点 B 执行写命令,并向客户端返回命令回复。
  • 主节点 B 将刚刚执行的写命令复制给它的从节点 B1 、 B2 和 B3 。

如你所见, 主节点对命令的复制工作发生在返回命令回复之后, 因为如果每次处理命令请求都需要等待复制操作完成的话, 那么主节点处理命令请求的速度将极大地降低 —— 我们必须在性能和一致性之间做出权衡。

如果真的有必要的话, Redis 集群可能会在将来提供同步地(synchronou)执行写命令的方法。

Redis 集群另外一种可能会丢失命令的情况是, 集群出现网络分裂(network partition), 并且一个客户端与至少包括一个主节点在内的少数(minority)实例被孤立。

举个例子, 假设集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六个节点, 其中 A 、B 、C 为主节点, 而 A1 、B1 、C1 分别为三个主节点的从节点, 另外还有一个客户端 Z1 。

假设集群中发生网络分裂, 那么集群可能会分裂为两方, 大多数(majority)的一方包含节点 A 、C 、A1 、B1 和 C1 , 而少数(minority)的一方则包含节点 B 和客户端 Z1 。

在网络分裂期间, 主节点 B 仍然会接受 Z1 发送的写命令:

  • 如果网络分裂出现的时间很短, 那么集群会继续正常运行;
  • 但是, 如果网络分裂出现的时间足够长, 使得大多数一方将从节点 B1 设置为新的主节点, 并使用 B1 来代替原来的主节点 B , 那么 Z1 发送给主节点 B 的写命令将丢失。

注意, 在网络分裂出现期间, 客户端 Z1 可以向主节点 B 发送写命令的最大时间是有限制的, 这一时间限制称为节点超时时间(node timeout), 是 Redis 集群的一个重要的配置选项:

  • 对于大多数一方来说, 如果一个主节点未能在节点超时时间所设定的时限内重新联系上集群, 那么集群会将这个主节点视为下线, 并使用从节点来代替这个主节点继续工作。
  • 对于少数一方, 如果一个主节点未能在节点超时时间所设定的时限内重新联系上集群, 那么它将停止处理写命令, 并向客户端报告错误。

转载于:https://www.cnblogs.com/codingcloud/p/5262361.html

redis-集群(cluster)扫盲篇(一)相关推荐

  1. Redis集群Cluster部署

    这篇Redis 集群部署笔记参考的书籍资料是: <Redis入门指南>第二版,作者:李子骅 第8章 <Redis开发与运维> 作者:付磊 第10章 以下是学习笔记,记录了Red ...

  2. 分布式Redis集群--Cluster架构

    Cluster架构 Redis哨兵与Cluster集群模式对比 1. 哨兵模式 Redis3.0之前一般是通过哨兵工具来监测master节点的状态,若master节点宕机,则哨兵集群会进行主从切换,从 ...

  3. Redis集群cluster环境(快速搭建过程10分钟)

    安装环境CentOS Linux release 7.5.1804 (Core) 如果服务器没有连接网络,请按步骤自行百度其离线方式 话不多说,开整!!! 一.安装redis #下载至/home/in ...

  4. [ Redis10篇] 集群Cluster相关灵魂16问

    1.哨兵与集群 1).Redis 哨兵 着眼于高可用,在 master 宕机时会自动将 slave 提升为master,继续提供服务. 2).Redis 集群(Cluster)着眼于扩展性,在单个 r ...

  5. 【Redis】集群(cluster)

    文章目录 Redis集群(cluster) 定义 官网 作用 集群算法(分片->槽位) 分片(每台Redis实例) 槽位 slot槽位映射 哈希取余分区 一致性哈希算法分区 哈希槽分区 搭建三主 ...

  6. 你了解Redis集群中的秘密吗?

    ​前言 今天早上北京地铁,看见一个正在学习Redis的小姐姐,很优秀 在之前的Redis系列文章中,介绍了Redis的持久化.主从复制以及哨兵机制,主从复制+哨兵机制,既可以解决主master和从sl ...

  7. CentOS7.X安装Redis-4.0.8以及Redis集群搭建

    安装redis 安装前的准备 yum install \ vim \ wget \ make \ gcc \ gcc-c++ \ automake \ autoconf \ -y \ 下载解压并安装 ...

  8. Python 检测系统时间,k8s版本,redis集群,etcd,mysql,ceph,kafka

    一.概述 线上有一套k8s集群,部署了很多应用.现在需要对一些基础服务做一些常规检测,比如: 系统时间,要求:k8s的每一个节点的时间,差值上下不超过2秒 k8s版本,要求:k8s的每一个节点的版本必 ...

  9. 高性能网站架构设计之缓存篇(5)- Redis 集群(上)

    2019独角兽企业重金招聘Python工程师标准>>> 集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应 ...

  10. 高性能网站架构设计之缓存篇(6)- Redis 集群(中)

    昨天晚上钓鱼回来,大发神经,写了篇概括程序员生活现状的文章,没想到招来众多人的口诛笔伐,大有上升到政治层面的趋势. 我也许不会再发表任何冲击心灵的文章,我希望给大家带来更多的正能量,所以那篇文章已被我 ...

最新文章

  1. python字典教程:添加与删除
  2. memcpy函数实现_等比例缩放c++ opencv 实现
  3. 关于获取oracle中数据变更的时间戳的探索(待更新)
  4. zabbix模板_基于zabbix网页配置自定义tomcat监控模板--监控项、触发器
  5. apache2.4.18中启用h2c
  6. MacOSX 下.app支持同时运行多个实例
  7. Downie 4 for Mac(视频下载)
  8. 飞桨2.0高层api教程——使用BERT实现自动写诗
  9. (投影:Projector)Unity5 使用Projector实现纹理投射
  10. 关于子IP地址子网划分和子网汇总
  11. python——字符串练习:句子反转(小米笔试题)
  12. 应用计算机怎么弹ink,Win7系统打开计算机管理提示computer management.Ink的解决方法教程[多图]...
  13. 数据结构与算法(C++) -- adjacency matrix
  14. 看漫画学python下载_Python爬虫实现漫画下载 - 『编程语言区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn...
  15. 电气火灾监控探测器安装在哪里?
  16. bootstrap图片上传
  17. 带答案APP测试面试题分享,助攻你的面试!面试官都惊呆了..
  18. [分享]程序员技术练级攻略
  19. Redis-简单介绍及基本数据类型【随笔一】
  20. 推荐一款免费的SQLsever的备份软件sqlBackupAndFtp

热门文章

  1. java treeset排序_java TreeSet的排序之自然排序
  2. 开发板移植mysql_数据库移植到gpu
  3. 系统学习NLP(六)--语义分析
  4. linux输出变量的类型名称,Python 变量类型
  5. JS事件流(事件冒泡 事件委托)
  6. php7数组写法,数组运算符 - PHP 7 中文文档
  7. java 方法绑定_java 方法调用绑定
  8. PAT (Basic Level) Practice1009 说反话
  9. TinyML与Tensor Flow Lite的关系
  10. Android 使用 Gradle 打包 - 签名配置