redis 系列27 Cluster高可用 (2)

原文:redis 系列27 Cluster高可用 (2)

一. ASK错误

  集群上篇最后讲到,对于重新分片由redis-trib负责执行,关于该工具以后再介绍。在进行重新分片期间,源节点向目标节点迁移一个槽的过程中,可以会出现该槽中的一部分键值对保存在源节点中,另一部份键值对则保存在目标节点中。

  当客户端向源节点发送一个与数据库键有关的命令时,并且命令要处理的数据库键正好就是正在被迁移的槽时,会出现二种情况的一种:

  (1) 源节点会先在自己的数据库中查找指定的键,如果找到的话,就会直接执行客户端发送的命令。

  (2) 相反,如果在源节点找不到指定的键,那么键有可能已经被迁移到了目标节点,源节点将向客户端返回一个ASK错误,指引客户端转向正在导入槽的目标节点,并再次发送之前想要执行的命令。

  注意:和接到Moved错误时的情况一样,集群模式的redis-cli在接到ask错误时也不会打印错误,而是自动根据错误提供的ip和port进行转向(Redirected to ..)动作。

  1.1 cluster setslot importing 命令实现

    在clusterState结构的importing_slots_from数组中,记录了当前节点正在从其他节点导入的槽号。在集群进行重新分片的时候,向目标节点发送以下命令,格式为:

    cluster setslot < slot > importing <node ID>    

    slot 和 node_id是指:源节点槽号和源节点ID。比如在上一篇结尾,原属于7002节点的14042 号槽,迁移到了目标7003节点,在7003节点中内部clusterState结构的importing_slots_from数组下记录了14042号槽,并且还记录了源节点ip和端口(127.0.0.1 7002)。

  

  1.2 cluster setslot migrating命令实现

    在clusterState结构的   migrating_slots_to数组中,记录了当前节点正在迁移至其他节点的槽。在集群进行重新分片的时候,向源节点发送命令以下命令,格式为:

    cluster setslot < slot > migrating <node ID>    

    slot 和 node_id是指:目标节点槽号和目标节点ID。

    下图左边7003目标节点 importing_slots_from数组 和 右边7002源节点的migrating_slots_to数组:

  1.3 ASK错误后的引导

    如果节点收到一个关于键key的命令请求,并且键key所属的槽i正好就指派给了这个节点, 如果节点没有在自己的数据库里找到键key,那么节点会检查自己的迁移数组clusterState.migrating_slots_to[i], 看键key所属的槽i是否正在进行迁移,如果槽 i 的确在进行迁移,那么节点会向客户端发送一个ask错误,引导客户端到正在导入槽 i 的节点去查找键key。

  1.4  ASK错误和Moved错误的区别

    ASK错误和Moved错误都会导致客户端转向,它们区别在于:

    (1) Moved错误代表槽的负责权,已经从一个节点转移到了另一个节点:在客户端收到关于槽i的mvoed错误之后,客户端每次遇到关于槽i的命令请求时,都可以直接将命令请求发送到moved错误所指向的节点,因为该节点就是目前负责槽i的节点。

    (2) 与此相反,ASK错误只是两个节点在迁移槽的过程中使用的一种临时措施:在客户端收到关于槽 i 的ASK错误之后,客户端只会在接下来的一次命令请求中将关于槽 i 的命令请求发送到ASK错误所指示的节点。

二. 复制与故障转移

  集群中的节点分为主节点和从节点,主节点用于处理槽,而从节点则用于复制某个主节点,当主节点下线时,从节点代替主节点继续处理命令请求。

    复制设置从节点:在主节点将设置 node_id (node_id为从节点),脚本如下:

    CLUSTER REPLICATE <node_id> 

  

  2.1 节点故障检测

    集群中的每个节点都会定期向群集中的其他节点发送ping消息,以此来检测对方是否在线,如果接收ping消息的节点没有在规定的时间内返回pong消息,那么发送节点就会将接收节点标记为疑似下线pfail(probable fail)。

    集群中的各个节点会通过互相发送消息的方式来交换集群中各个节点的状态信息,来判断节点是处于在线、疑似下线还是下线(fail) 状态。

    在集群中,负责处理槽的节点在半数以上都将某个主节点x 报告为疑似下线状态时,那么这个主节点x将标记为已下线 fail。 将主节点x标记为已下线的节点会向集群广播一条关于主节点x的fail消息。 

  2.2 故障转移实现步骤

    当一个从节点发现自己正在复制的主节点进入已下线状态时,从节点将开始对下线主节点进行故障转移,步骤如下:

    (1) 复制下线主节点的所有从节点,会有一个从节点被选中。

    (2) 被选中的从节点会执行slaveof  no  one 命令,成为新的主节点。

    (3) 新的主节点会撤消所有对已下线主节点的槽指派,并将这些槽指派给自己。

    (4) 新的主节点向集群广播一条pong消息,这条pong消息可以让集群中的其他节点立即知道这个节点已经由从节点变成了主节点,并且接管了原本已下线的节点负责处理的槽。

    (5) 新的主节点开始接收和自己负责处理的槽有关的命令请求,故障转移完成。

  2.3 节点之间的通信

    集群中的各个节点通过发送和接收消息来进行通信,节点发送的消息主要以5种:

    (1) meet消息: 发送者向接收者发送meet消息,请求接收者加入到发送者当前所处的集群中。

    (2) ping消息:集群中每个节点默认每隔1秒就会从已知节点列表随机选出5个节点,然后对这5个节点中最长时间没有发送过ping消息的节点发送ping消息,以此来检测被选中的节点是否在线。

    (3) pong消息:当接收者收到meet或ping消息时,会向发送者返回一条pong消息,以此表明自己(接收者)节点是正常的。另外一个节点也可以通过向集群广播自己的pong消息来让集群中的其他节点刷新关于这个节点的认识。

    (4) Fail消息: 当一个主节点A判断另一个主节点B已经进入Fall状态时,节点A会向集群广播一条关于节点B的Fall消息,所有收到这条消息的节点都会立即将节点B标记为已下线。

    (5) publish消息: 当节点接收到一个publish命令时,节点会执行这个命令,并向集群广播一条publish消息,所有接收到这条publish消息的节点都会执行相同的publish命令。

三. 集群知识点总结

  (1) 节点通过握手来将其他节点添加到自己所处的集群当中。

  (2) 集群中的16384个槽可以分别指派给集群中的各个节点,通过cluster nodes命令可以看到节点的槽分布。

  (3) 节点在接到一个命令请求时,先检查这个命令请求要处理的键所在的槽是否由自己负责,如果不是,节点向客户端返回一个moved错误,moved错误携带的信息可以指引客户端转向至正在负责相关槽的节点继续来处理。

  (4)对Redis集群的重新分片工作是由redis-trib负责执行的,重新分片是将属于某个槽的所有键值对从一个节点转移至另一个节点。

  (5)如果节点A正在迁移槽 i 到节点B,当节点A没能在自己的数据库中找到命令指定的键时,节点A向客户端返回一个ASK错误,指引客户端到节点B继续查找指定键。

  (6) Moved错误代表槽的负责权已经从一个节点转移到了另一个节点,而ASK错误只是两个节点在迁移槽的过程中使用的一种临时措施。

  (7) 集群中的从节点用于复制主节点,并在主节点下线时,代替主节点继续处理命令请求。

  (8) 集群中的节点通过发送和接收消息来进行通信,常见的消息包括meet;ping ;pong;publish;fail五种。

 

原文地址:https://www.cnblogs.com/lonelyxmas/p/10230806.html

时间: 2024-10-01 03:26:44

redis 系列27 Cluster高可用 (2)的相关文章

redis 系列26 Cluster高可用 (1)

原文:redis 系列26 Cluster高可用 (1) 一.概述 Redis集群提供了分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能.在大数据量方面的高可用方案,cluster集群比Sentinel有优势.但Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.学习集群同样先了解一些原理方面包括:节点.槽指派.命令执行.重新分片,转向.故障转移.消息.后面再操作集群演示.

Redis系列(四)-低成本高可用方案设计

关于Redis高可用方案,看到较多的是keepalived.zookeeper方案. keepalived是主备模式,意味着总有一台浪费着.zookeeper工作量成本偏高. 本文主要介绍下使用官方sentinel做redis高可用方案的设计. 阅读目录: Redis Sentinel 故障转移消息接收的3种方式 整体流程图 总结 Redis Sentinel Sentinel介绍 Sentinel是Redis官方为集群提供的高可用解决方案. 在实际项目中可以使用sentinel去做redis自

alwaysOn+SQL群集+cluster 高可用方案测试

在SQL2012以前,高可用自动切换方案就是SQL群集了,优点就是切换完全自动,缺点也有很多, 然后2012出现了alwaysOn特性,在高可用上有了很大的提升,今天这个测试是将2个特性结合在一起做一个高可用的方案. 这个方案的优点就是数据上,主数据只有一份,而且不受alwaysOn节点数限制,缺点就是切换时间比alwaysOn本身的要长一些. 准备很简单,AD1台 测试足够. 然后先准备2台服务器,做cluster,注意第3台要做alwaysOn副本的机器千万不要现在加入cluster, 然后

redis专题之redis cluster高可用集群

1.redis cluster集群是什么? redis cluster集群是一个由多个主从节点群组成的分布式服务器群,它具有复制.高可用和分片特性.Redis cluster集群不需要sentinel哨兵也能完成节点移除和故障转移的功能. 需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到1000节点. redis cluster集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单 2.redis cluster集群搭建 redis clu

Redis集群的高可用测试(含Jedis客户端的使用)

Redis集群的使用测试(Jedis客户端的使用) 1.  Jedis客户端建议升级到最新版(当前为2.7.3),这样对3.0.x集群有比较好的支持. https://github.com/xetorthio/jedis http://mvnrepository.com/artifact/redis.clients/jedis 2.  直接在Java代码中链接Redis集群: // 数据库链接池配置 JedisPoolConfig config = new JedisPoolConfig();

Redis从入门到高可用分布式布局实战教程

第1章 Redis初识 带领听众进入Redis的世界,了解它的前世今生.众多特性.应用场景.安装配置.简单使用,可以让听众对Redis有一个全面的认识. 第2章 API的理解和使用 全面介绍了Redis提供的5种数据结构字符串(string).哈希(hash).列表(list).集合(set).有序集合(zset)的数据模型.常用命令.典型应用场景.同时本章还会对Redis的单线程处理机制.键值管理做一个全面介绍,通过对这些原理的理解,听众可以在合适的应用场景选择合适的数据结构. ... 第3章

Redis集群与高可用

Redis集群 redis cluster 是redis官方提供的分布式解决方案,在3.0版本后推出的,有效地解决了redis分布式的需求,当一个redis节点挂了可以快速的切换到另一个节点.当遇到单机内存.并发等瓶颈时,可以采用分布式方案要解决问题. 分布式redis数据库 1.分区和槽slot redis cluster中有一个16384(2^4 * 2^10)长度的槽的概念.通过哈希算法再加上取模运算可以将一个值固定地映射到某个区间,区间由连续的slot组成. redis cluster采

Redis的几种高可用集群方案

Redis的高可用方式及常用集群方式一般有: 主从模式 哨兵模式 集群模式 当然也有第三方代理模式,如codis等,这种不在这里讨论之列. 我刚好学习到这里,我就简单记录下这几种模式的配置 .老鸟及不感兴趣的,可以就此飘过. Redis的安装及单实例的启动,这里就不再赘述了,确实比较简单. 一 主从模式 这个模式就是解决单台机器的内存性能问题,可以把主实例和从实例放到不同的机器上面.从机器可以作备份使用,当master主机出现故障后,可以将某一台slave提升为master.一定程度上提高缓存的

Linux HA Cluster高可用集群之HeartBeat2

一.阐述Linux HA Cluster的使用背景: 1.1 高可用集群定义: 高可用集群全称:High Availability Cluster,简单的说,集群就是一组高可扩展.高可用性.高性价比的计算机.它们作为一个整体向用户提供一组网络资源.其中单个的计算机系统就是一个集群的节点.高可用集群软件的主要作用就是实现故障检查和业务切换的自动化,以提供不中断的服务. 1.2 集群系统的主要优点: (1)高可扩展性:  (2)高可用性HA:集群中的一个节点失效,它的任务可传递给其他节点.可以有效防