用于集群节点缩扩的方法、设备和系统的制作方法_2

文档序号:9506185阅读:来源:国知局
二节点集群)、以及redis桥(在本文中也称为用于集群节点缩扩的设备)。
[0024]需要注意的是,虽然图1中示出集群A中包含两个节点,集群B中包含三个节点,本发明实施例也可以应用于存在其他各种数目的节点的情况下。例如,在图1中,集群A中节点的数目小于集群B中节点的数目,以进行集群扩容。然而在一些实施例中,集群A中节点的数目可大于集群B中节点的数目,以实现集群缩容。因此,虽然在下面的描述中以集群扩容为示例来进行描述,本发明实施例的方法也可同等用于集群缩容的情况。
[0025]下面根据图1所示的系统描述根据本发明实施例的集群节点缩扩方法。图2示出了根据本发明实施例的集群节点缩扩方法的流程图。
[0026]在图2的步骤210中,可以由redis桥从第一节点集群的多个第一节点接收该多个第一节点并行生成的redis数据库(rdb)快照。
[0027]在该步骤之前,可以在redis桥配置集群A和B集群的节点拓扑。
[0028]此外,redis桥还可针对集群A和集群B中的节点分别建立线程和连接。
[0029]具体地,B集群3个节点以主从关系中的从角色连接到redis桥,发起同步(sync)命令。redis桥为该3个节点的3个连接cl、c2、c3对应建立3个线程bl、b2、b3,并新建3 个同步队列(SynchronousQueue) ql、q2、q3。其中,bl、b2、b3 分别消费 ql、q2、q3。在没有数据的时候,3个连接cl、c2、c3进入阻塞状态。
[0030]此外,redis桥还可新建1个线程tl,负责进行rdb转换。tl可包含一个计数同步器(CountdownLatch)Ll。该计数同步器L1的初始值与集群A中节点的数目相同。在图1所示的示例中初始计数可取值为2。tl运行时阻塞在计数同步器L1,在L1变为0时继续执行。
[0031]redis桥还可针对集群A中的2个节点分别建立2个线程al、a2。该2个线程包含对计数同步器L1的引用。redis桥分别建立到集群A的2个节点的连接,发起sync命令;
[0032]此时集群A的2个节点并行生成rdb快照发给redis桥。
[0033]在图2的步骤220中,redis桥从第一节点接收客户端在redis数据库快照的发送之后进行的写操作。
[0034]具体地,线程al (或a2)接收rdb,并保存在本地文件系统中。针对线程al和a2 (即,针对第一节点A1和A2)的文件名分别为al.rdb、a2.rdb。按照rdb协议,结尾是FF+8字节的校验和。rdb接收完毕后,al (或a2)将计数同步器L1递减1。
[0035]接下来,在图2的步骤230中,redis桥生成与第二节点集群的多个第二节点分别对应的附加文件,并按照所建立的key到第二节点集群的映射关系,将写操作分别记录在附加文件中。
[0036]在本发明的一些具体示例中,这可通过线程al和a2来完成。在接收rdb之后,线程al、a2继续接收发自集群A的写操作,并按照新建立的key到B集群节点的映射关系,将写操作以追加方式保存在对应的bl.aof、b2.aof、b3.aof文件。
[0037]然后,在图2的步骤240中,redis按照所建立的key到第二节点集群的映射关系,分析redis数据库快照并将redis数据库快照重新组合到与第二节点集群中的多个第二节点分别对应的数据库文件中。
[0038]在本发明的一些具体示例中,当L1减少到0时,表示集群A中所有节点的rdb快照(在本示例中数目为2)都被redis桥所接收到。此时线程tl继续运行,读取并解析两个rdb文件(例如,遍历key/value),按照新的key到B集群节点的映射关系,将key/value写入到3个新的rdb文件bl.rdb、b2.rdb、b3.rdb。与现有技术中直接调用redis的命令接口进行的遍历相比,此处可使用的遍历无需使用tcp(传输控制协议)协议栈来进行调用,而是直接对数据进行操作,速度更快,且效率更高。
[0039]在rdb快照重新组合之后,在图2的步骤250中,redis桥向第二节点分别发送与其对应的数据库文件和附加文件。
[0040]例如,在本发明的一些示例中,在线程tl写完3个rdb文件后,分别往ql、q2、q3发送文件完成信号,包含对应的rdb文件名。
[0041]线程bl、b2、b3收到来自ql、q2、q3的信号后,将对应的rdb文件以sendfile机制写入各自保持的与B集群节点的连接cl、c2、c3。
[0042]线程bl从文件头开始读取bl.aof,将所有的写操作依此发送到与B集群节点的连接cl,B集群对应节点据此执行写操作。直到线程bl读取到bl.aof的文件尾,记录当前的
offsetlo
[0043]线程b2、b3同上述操作所述地读取对应的b2.aof、b3.aof,将其发送到对应的B集群节点,并记录最后的offset2、offset3o
[0044]至此,在图2的步骤260中,由配置管理系统将第二节点集群的集群节点拓扑(节点数目和编号等)发送到客户端,以使得客户端可根据第二节点集群的集群节点拓扑来进行读写操作。
[0045]具体地,在步骤250向第二节点集群中的集群节点(第二节点)分别发送与其对应的数据库文件和附加文件之后,redis桥可通过与配置管理系统的通信链路(图1中未示出)通知配置管理系统,以指示配置管理系统进行上述集群节点拓扑发送。
[0046]根据本发明实施例的集群节点缩扩方法可在步骤260处结束。然而在一些情况下,在向集群B发送对应的数据库文件和附加文件期间,客户端可能执行了一些写操作,并根据本发明的实施例存储在相应.aof文件中的offset标记之后。因此,根据本发明的另一些实施例,提供了对这种情况的一些改进。
[0047]具体地,在配置管理系统将B集群新的节点数量和编号(集群节点拓扑)发送到客户端时,可同时禁止客户端写。
[0048]然后线程bl从offsetl开始读取bl.aof,直到文件尾,将所有的写操作依此发送到连接cl,B集群对应节点依此执行。线程b2、b3同理执行。
[0049]在线程bl、b2和b3的操作都结束之后,配置管理系统可通知客户端按照B集群节点拓扑来进行读写操作,即,重新启动客户端的写操作。
[0050]由于各个.aof文件中在offset标记之后记录的写操作不会太多,因此上述附加操作不会带来延迟。这最小化了数据不一致的时间窗口,保证了数据最终一致性与业务写停顿影响的平衡
[0051]根据上述方法,可以在不修改redis存储结构和增加新的功能的前提下,利用一个实现redis的复制协议的中间件,通过复制过程中数据的拆分和重组,达到数据节点的增加(水平扩容)或减少(水平缩容)。
[0052]需要注意的是,虽然为了叙述的方便和易于读者理解在图2中使用不同的附图标记来标识各个步骤,但附图标记的大小并不表示执行相关步骤的严格顺序。例如,生成附加文件和记录写操作的步骤230可在分析redis数据库快照和重新组合redis数据库快照的步骤240之后执行,或与其同时执行。还例如,为第一节点集群和第二节点集群中的各个节点建立连接和线程的顺序可以按不同于本文所述的先后顺序进行等等。本发明不被这些顺序所限制。
[0053]在本发明的另一些实施例中,还提供了集群节点缩扩设备,例如图1中的redis桥。图3示出了该集群节点缩扩设备的简要结构框图。
[0054]如图3所示,该设备包括:接收单元310,用于从第一节点集群的多个第一节点接收该多个第一节点并行生成的redis数据库快照,以及从该多个第一节点接收客户端在redis数据库快照的发送之后进行的写操作;附加文件生成单元320,用于生成与第二节点集群的多个第二节点分别对应的附加文件,并按照所建立的key到该第二节点集群的映射关系,将接收单元310接收到的所述写操作分别记录在附加文件中;重组合单元330,用于按照所建立的key到第二节点集群的映射关系,分析接收单元310接收到的redis数据库快照并将redis数据库快照重新组合到与第二节点集群的该多个第二节点分别对应的数据库文件中;以及发送单元340,用于向该多个第二节点分别发送与其对应的数据库文件和附加文件,以及用于指示配置客户端的配置管理系统将第二节点集群的集群节点拓扑发送到客户端,以使得客户端能够根据第二节点集群的集群节点拓扑来进行读写操作。
[0055]图3中的设备还可以包括写操作禁止单元350,用于在对客户端进行配置的配置管理系统将第二节点集群的集群节点拓扑发送到客户端时,通过配置管理系统禁止客户端进行写操作。此时,发送单元340还向多个第二节点分别发送附加文件中在向该多个第二节点分别发送与其对应的数据库文件和附加文件之后记录的客户端的写操作。
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1