cluster为redis带来了什么呢?

  • 高达1000个节点的高性能和线性可扩展性,在多个节点间自动拆分数据集
  • 可接受的写安全度

系统尝试(尽最大努力)保留来自与大多数主节点连接的客户端的所有写操作。通常有一些小窗口,在这些窗口中可以丢失已确认的写入。当客户端位于少数分区时,丢失已确认写入的窗口会更大。

  • 一部分节点出现故障或无法与集群的其余部分通信时,继续运行的能力。

redis cluster能够在大多数主节点都可访问且每个不再可用的主节点上至少有一个可访问的从节点的分区中幸存。而且,通过使用副本迁移,不再由任何从属复制的主控将从一个由多个从属覆盖的主控接收一个主控。

当然,在发生较大故障时(例如大多数主服务器不可用时、主从同时宕机时),群集将停止运行

集群总线

每个Redis群集节点都需要打开两个TCP连接,常规的6379(默认)用于向客户端提供数据服务,集群总线端口(常规端口+10000,默认16379)用于故障检测,配置更新,故障转移授权等,集群总线端口应确保在集群中所有服务器都能访问到(打开防火墙)。所有群集节点都使用TCP总线和称为Redis群集总线的二进制协议进行连接。每个节点都使用群集总线连接到群集中的每个其他节点。群集总线还用于在用户请求时跨群集传播Pub / Sub消息,并在用户请求时安排手动故障转移(手动故障转移不是Redis Cluster故障检测器而是由系统管理员直接发起的故障转移)

客户端永远不要尝试与集群总线通信

流言协议(gossip)

redis cluster 节点之间通过流言协议传播消息,它们互相发送ping命令以确保其他客户端都在正常工作。流言协议简单说是一种“一传十、十传百”的裂变型消息传递方式,它的优点很明确:消息的传递非常快(传播速度近乎指数级的增长),容错性高(部分节点损坏不影响其他节点散播消息)、收敛一致性高(一个消息到达后,会快速传遍整个网络,系统状态不一致在短时间内收敛)、去中心化(不依赖任何一台主机为绝对中心)。不过它也有自己的缺点:消息冗余(到后面很多节点收到消息后,还在选节点发送消息)、只能达到最终一致性,实时性要求很高的场景还是有一定的延迟。

数据槽

每个键从概念上讲都是我们称为数据槽的一部分,redis集群中不管有多少个主节点和从节点,一共有16384个固定数据槽,通过哈希算法把数据存放到对应的槽里,没有数据槽就没办法存储数据,从节点没有槽,它就只能复制对应主节点的数据。

moved转向

一个 redis 客户端可以向集群中的任意节点(包括从节点)发送命令请求时, 节点会会查找这个命令所要处理的键所在的槽。如果要查找的哈希槽正好由接收到命令的节点负责处理, 那么节点就直接执行这个命令, 如果所查找的槽不是由该节点处理的话, 节点将向客户端回复一个 MOVED 错误,并返回键所在主机和槽的信息,节点重新连接键所在主机即可正确访问。

当节点需要让一个客户端长期地(permanently)将针对某个槽的命令请求发送至另一个节点时, 节点向客户端返回moved转向。

官方文档说可以在本地保存键和数据槽的映射信息,可以减少moved,提高一定的性能。但是在扩容或者删除主节点时候,数据槽是需要跟着改变的,可以酌情使用。

数据分片

将槽分配给主节点的过程就是数据分片。在添加新的主节点时,需要已有主节点把自己的槽分给新主节点一部分,它才能存储数据。反之,在删除一个主节点前也需要把它的槽先分给其他主节点。更改数据槽所属主机的过程中不需要停机或重启。

一致性

redis cluster无法保证强一致性,因为它使用异步复制(先确认再写入,为了减少延迟),所以可能丢失已确认给客户端但还没来得及写入的内容,比如客户端向主节点A写入数据,A答复客户端写成功了,然后将写操作传播给A1 A2 A3,在一个传播都没成功前,A就崩溃了,此时A1升级为了主节点,它根本不知道刚发生了啥事,这个写就丢失了。redis提供了wait命令以阻塞当前客户端(https://redis.io/commands/wait),直到之前所有的写命令都被指定数量的副本成功传输并确认或者阻塞超时为止,这在很大程度上提高了系统一致性,但是假如发生了更复杂的故障,比如A A1 A2都发生故障了,只剩下A3,它还没接收到A传来的信息就被升为新的主节点了,还是会丢数据,但是概率已经小很多。

CAP原则

任何一个分布式系统只能实现一致性Consistency)、可用性Availability)、分区容错性Partition tolerance)这三要素中的两个,不可能三者兼顾。由于分区容错性是集群的基本要求,很多时候需要在一致性和可用性之间做平衡,通常我们保证最终一致性即可。

强一致性、弱一致性、最终一致性:强一致性要求更新过的数据能被后续的访问都能看到,如果能容忍后续的部分或者全部访问不到,则是弱一致性。如果经过一段时间后要求能访问到更新后的数据,则是最终一致性

节点超时

主节点在一段时间内一直无法联络后,会被标记下线,它的从节点之一会上线,此时客户端发给旧主节点的数据就丢失了。(这个时候客户端并没有收到旧节点的ack,还比较好办,可以直接重试)

分区限制

cluster不支持多数据库,每个节点只有数据库0,不支持select(切换数据库)。

分区后,涉及多个槽的操作会失败。比如本例中集合class_1落在5003中某个槽,clss_2落在5002的7311,sdiff就直接报错了...redis cluster实现了一个称为哈希标签{}的概念,可用于强制将某些密钥存储在同一哈希槽中。但是,在手动重新分片期间,多键操作可能会在一段时间内变得不可用,而单键操作始终可用。

节点与槽在线重配置

cluster addslots slot1 [slot2] ... [slotN]:向节点增加槽

cluster delslots slot1 [slot2] ... [slotN]:从节点移除槽

cluster setslot slot node node :将指定的槽 slot 指派给节点 node

cluster setslot slot  migrating  node:将指定的槽 slot移出节点

当一个槽被设置为 migrating 状态时, 只有命令所处理的键已经存在于该节点时, 原来的节点才会处理这个命令请求, 否则节点将向客户端返回一个 -ASK 转向(redirection)错误, 告知客户端将命令请求发送到槽要迁移到的新节点,即:旧节点不在此槽上创建新键了,此槽上已有的键此节点还在处理。

当客户端在旧节点中没找到某个键时, 它应该转向到新节点中去寻找, 但是这种转向应该仅仅影响一次命令查询, 而不是让客户端每次都直接去查找新节点 : 在旧节点所持有的属于槽的键没有全部被迁移到新节点之前, 客户端应该先访问旧节点, 然后再访问新节点。

(错误回复第一个字节是 "-" , 状态回复的第一个字节是 "+" 。)

cluster setslot slot importing node:将指定的槽 slot导入节点

如果我们要在查找节点 A 之后, 继续查找新节点, 那么客户端在向新节点发送命令请求之前, 应该先发送一个 asking命令, 否则这个针对带有importing 状态的槽的命令请求将被节点 B 拒绝执行。

当一个槽被设置为 importing 状态时, 节点仅在接收到 asking 命令之后, 才会接受关于这个槽的命令请求。 如果客户端没有向节点发送 asking 命令, 那么节点会使用 -MOVED 转向错误将命令请求转向至真正负责处理这个槽的节点。

此状态下新增键将由新节点处理。

在某个时间点上, 键要么存在于旧节点, 要么存在于新节点 , 但不会同时存在于新旧两个节点 。

例:一个数据槽1967原本存在M1,需要转到M2,那它需要先向M2发送cluster setslot 1967 importing M1,再向M1发送cluster setslot 1967  migrating M2,此时转移开始,在转移过程中,如果有客户端访问1967上已有的key,M1会继续处理,但此时很可能此key已经被转移,当此key被转移后,M1向客户端发送一个ASK转向,客户端拿到后向M2请求此key的值,如果在转移过程中有客户端向1967写入新的key,由M2直接处理而无需经过M1。

ASK 转向

当节点需要让客户端仅仅在下一个命令请求中转向至另一个节点时, 节点向客户端返回 ASK 转向。

参考:

https://redis.io/topics/cluster-tutorial

https://redis.io/topics/cluster-spec

http://redisdoc.com/topic/cluster-spec.html#id2

【redis】cluster相关知识点整理相关推荐

  1. Unity 之 解决包体过大问题记录和纹理相关知识点整理

    Unity 之 解决包体过大问题记录和纹理相关知识点整理 一,发现问题: 二,分析问题: 三,解决问题 3.1 问题分析 3.2 解决方案一 3.3 解决方案二 四,相关知识: 4.1 纹理导入: 4 ...

  2. JS事件相关知识点整理

    JS事件相关知识点整理 JS事件的驱动机制 常见JS事件 点击事件---onclick 焦点事件 获取焦点事件---onfocus 失去焦点事件----onblur 域内容改变事件---onchang ...

  3. 计算机相关知识点整理

    计算机相关必须要知道的知识点 持续更新中 一致性HASH算法 https://www.cnblogs.com/lpfuture/p/5796398.html 一致性哈希将整个哈希值空间组织成一个虚拟的 ...

  4. Keras相关知识点整理(tensorflow2.4)

     具体的一些知识点还是从官方文档获取, 博主只列举几个常用的.毕竟17年的时候就曾用keras落地过实际项目,后来被集成到tensorflow2.x里了,对此框架还是有一定的了解. 应用 Applic ...

  5. python求正方体体积_「高中数学」简单几何体的面积与体积相关知识点整理+例题...

    一.知识要点 (一)圆柱.圆锥.圆台的侧面积 将侧面沿母线展开在平面上,则其侧面展开图的面积即为侧面面积. 1.圆柱的侧面展开图--矩形 圆柱的侧面积 2.圆锥的侧面展开图--扇形 圆锥的侧面积 3. ...

  6. 进程、线程相关知识点整理

    什么是进程 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体. 进程是一个"执行中的程序".程序是一个没有生 ...

  7. mysql相关知识点_mysql相关知识点整理

    一.安装 1.查看系统中是否已安装mysql [root@master ~]# yum list installed mysql* 已加载插件:fastestmirror, product-id, s ...

  8. Sentinel 相关知识点整理

    1.Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案.      它以流量为切入点, 从流量控制.熔断降级.系统负载保护等多个维度来保护服务的稳定性. 2.使 ...

  9. 微信小程序调试webview_微信小程序内嵌webview相关知识点整理

    前言 随着微信小程序的广泛应用,越来越多的商家选择将营销阵营选择迁移到了小程序中,但受其小程序体积限制的影响,不能够完全满足商户的要求,应运而生的web-view组件很好的解决的这一问题.一方面内嵌w ...

最新文章

  1. 用keil仿真程序,出现 EVALUATION MODE Running with Code Size Limit:2K
  2. Navisworks API 简单二次开发 (自定义工具条)
  3. MapReduce的优点
  4. User-Agent-Switcher和fiddler
  5. 3D打印材料PLA,ABS对比
  6. object.prototype.call
  7. pcl通过积分图来进行法线预测
  8. zabbix监控系统时间的问题
  9. [raspberry pi3] aarch64 mongodb 编译和安装
  10. hive jdbc驱动_Hive的安装方式
  11. doc.project java_GitHub - kanghaimeng/idoc: Generate doc for java maven project.(java 项目自动生成文档)...
  12. C语言中的宏之#define
  13. JDK的Proxy技术实现AOP,InvocationHandler和Proxy详解——Spring AOP(三)
  14. JavaScript入门篇(红宝书第四版+犀牛书权威指南)一
  15. java常用工具下载
  16. psf点扩散函数matlab,点扩散函数(PSF)调制
  17. 品优购06——运营商后台(商品管理)
  18. 烟雾检测模块ADPD188BI介绍与应用(一)
  19. mysql frm 修复_使用mysqlfrm恢复frm表结构
  20. PySide6 Widgets基本小部件类--QWidget

热门文章

  1. Cadence 16.6安装配置教程
  2. 运用RUP4+1视图方法进行软件架构设计
  3. VB6.0编写的程序,安装时系统提示:安装程序无法创建以下文件夹:%CommonFiles%\Microsoft Shared\DAO...
  4. flutter学习--手势
  5. 碳基集成电路技术研究进展与展望
  6. CAR路里大学堂-车身设计高级特训班
  7. js逆向-喜马拉雅登陆参数分析
  8. 多彩卡通手抄报自我介绍Word模板分享
  9. 一阶差分(First Difference)
  10. c语言字符串strchr,C语言 strchr 函数用法