发明内容
本发明的目的在于:提供一种基于Redis的双宿主系统的高可用方法。该新的Redis服务模式,即双宿主模式,可在两台物理机上组建缓存高可用系统。
为实现上述目的,本发明提供如下技术方案:一种基于Redis的双宿主系统的高可用方法,包括客户端、基于Redis模式的一台物理机A、一台物理机B;所述客户端、物理机A、物理机B三者之间两两相连通信,所述客户端将待写入数据写入物理机A的Master服务器中,物理机B的slave服务器从物理机A的Master服务器中读取并缓存该待写入数据更新后反馈给客户端;所述物理机A包括一个Sentinel节点1、物理机B包括一个Sentinel节点2,所述Sentinel节点1和Sentinel节点2分别监控物理机A和物理机B的工作状态,通过执行步骤W1至步骤W3对物理机A进行状态监控,并在物理机A发生故障时,判断物理机A的故障类型I或故障类型II;
针对物理机A的故障类型I:暂时下线;物理机A的故障类型II:物理机A已经下线;
之后针对物理机A的故障类型I,通过调用物理机B的缓冲服务器,将来自客户端的待写入数据写入物理机B的缓冲服务器,并实时监测物理机A,在其恢复时重新启用;
针对物理机A故障类型II,通过调用物理机B的缓冲服务器和物理机B的slave服务器,并实时监测物理机A,在其恢复时重新启用;实现待写入数据与物理机B反馈给客户端数据的正确性;
步骤W1:物理机B通过Sentinel节点2、物理机A通过Sentinel节点1分别周期性地发送ping命令至物理机A的Master服务器,并在预设第一时长周期内判断物理机A的Sentinel节点1或物理机B的Sentinel节点2是否接收到来自物理机A的Master服务器反馈该ping命令对应的正确pong命令,是则执行步骤W3;否则,则执行步骤W2;
步骤W2:物理机B的Sentinel节点2、物理机A的Sentinel节点1分别在预设第二时长内判断物理机A的Sentinel节点1或物理机B的Sentinel节点2是否接收到来自物理机A的Master服务器反馈该ping命令对应的正确pong命令,是则判定物理机A的故障类型为I:物理机A暂时下线,同时根据收到反馈命令的Sentinel节点,获得判断物理机A暂时下线的物理机;否则在预设第二时长周期内均未接收到正确pong命令、或接收到错误pong命令,即判定物理机A的故障类型为II:物理机A已经下线,同时根据收到反馈命令的Sentinel节点获得判断物理机A已经下线的物理机;
步骤W3:返回步骤W1。
进一步地,前述的针对物理机A的故障类型I,通过调用物理机B的缓冲服务器,将待写入数据写入物理机B,并实时监测物理机A,在其恢复时重新启用,包括如下步骤S1至步骤S7;
步骤S1:判断物理机A发生故障暂时下线的物理机通知客户端,将待写入的数据写入至物理机B的缓冲服务器中,物理机B的缓冲服务器缓存该待写入的数据,并更新保存为数据M;物理机B的Slave读取物理机B的缓冲服务器的数据M,客户端自动识别并连接物理机B的Slave服务器,并读取数据M;随后执行步骤S2;
步骤S2:基于Sentinel节点1和Sentinel节点2分别监控物理机A和物理机B的工作状态,并判断物理机A发生故障暂时下线是否恢复,是则根据Sentinel节点的位置,获得判断物理机A恢复的物理机,进入步骤S3;否则执行步骤S7;
步骤S3:判断物理机A发生故障暂时下线恢复的物理机通知客户端物理机A暂时下线已恢复,命令客户端将待写入数据写入物理机A的Master服务器中;随后进入步骤S4;
步骤S4:判断物理机A发生故障暂时下线恢复的物理机通知物理机B,将物理机B的缓冲服务器中数据M全部缓存至物理机A的Master服务器中,随后执行步骤S5;
步骤S5:物理机B的缓冲服务器判断该数据M是否成功缓存至物理机A的Master服务器中;是则进入步骤S6;否则进入步骤S4;
步骤S6:物理机B的缓冲服务器清空其缓存服务器中的数据M;
步骤S7:执行步骤S1。
进一步地,前述的针对故障类型II,通过调用物理机B的缓冲服务器和物理机B的slave服务器,并实时监测物理机A,在其恢复时重新启用,包括如下步骤Q1至步骤Q9;
步骤Q1:触发故障转移机制:判断物理机A发生故障已经下线的物理机命令客户端将待写入数据写入物理机B的缓冲服务器中,物理机B的缓冲服务器缓存该待写入的数据,更新并保存为数据N;并定义客户端将待写入数据写入物理机B的缓冲服务器的时间点为t0判断物理机A发生故障已经下线的物理机命令客户端将时间点t0之后的待写入数据写入物理机B的Slave服务器中,随后进入步骤Q2;
步骤Q2:判断客户端在时间点t0之后是否将待写入数据写入物理机B的Slave服务器中;是则故障转移机制完成,进入步骤Q3;否则执行步骤Q9;
步骤Q3:基于Sentinel节点1和Sentinel节点2分别监控物理机A和物理机B的工作状态,判断物理机A发生故障已经下线的物理机通知物理机B将物理机B的缓冲服务器中数据N全部缓存至物理机B的Slave服务器中;随后进入步骤Q4;
步骤Q4:客户端读取物理机B的slave服务器中的数据,物理机B的缓冲服务器清空其缓存服务器中的数据N;随后进入步骤Q5;
步骤Q5:物理机A的Sentinel节点1,物理机B的Sentinel节点2分别判断物理机A发生故障已经下线是否恢复,是则进入步骤Q6,同时获得判断物理机A已经下线恢复的物理机,否则进入步骤Q8;
步骤Q6:判断物理机A已经下线恢复的物理机通知客户端物理机A已经下线已恢复,命令客户端将待写入数据写入物理机A的MASTER服务器中;并命令物理机A的Master服务器读取并缓存物理机B的Slave服务器中缓存的数据;随后进入步骤Q7;
步骤Q7:客户端从物理机A的Master服务器中读取数据;
步骤Q8:返回步骤Q5;
步骤Q9:返回步骤Q2。
进一步地,前述的物理机A的缓冲服务器在收到Sentinel节点1或Sentinel节点2的命令后与物理机B的Slave服务器相连;所述物理机A的缓冲服务器用于与物理机B的Slave服务器传输数据,所述物理机B的缓冲服务器用于与物理机A的Master服务器传输数据。
进一步地,前述的所述物理机A的Sentinel节点1、物理机B的Sentinel节点2均通过心跳检测机制监测所述物理机A、物理机B工作状态。
进一步地,前述的步骤W1中,物理机B通过Sentinel节点2、物理机A通过Sentinel节点1分别周期性地发送ping命令至物理机A的Master服务器,并在0.5秒内判断物理机A的Sentinel节点1或物理机B的Sentinel节点2是否接收到来自物理机A的Master服务器反馈该ping命令对应的正确pong命令。
进一步地,前述的步骤W2中,物理机B通过Sentinel节点2、物理机A通过Sentinel节点1分别在大于0.5秒的时间判断物理机A的Sentinel节点1或物理机B的Sentinel节点2是否接收到来自物理机A的Master服务器反馈该ping命令对应的正确pong命令。
通过新增添的双宿主模式,在出现断电、网络中断、服务器磁盘损坏、服务器故障,用户会访问不了,导致页面刷不出数据的青情况下,实现了在两台物理机上的故障转移,其中的缓冲服务器在Redis服务不可用的情况下,起到临时保存数据的作用,能自动在短时间内恢复服务,避免了数据的丢失,提高了系统服务的可用性。基于Redis提供的高可用服务,尤其是对微型企业来说,从至少三台物理机减少到两台,节约了运营成本。
具体实施方式
为了更了解本发明的技术内容,特举具体实施例并配合所附图式说明如下。
在本发明中参照附图来描述本发明的各方面,附图中示出了许多说明性实施例。本发明的实施例不局限于附图所述。应当理解,本发明通过上面介绍的多种构思和实施例,以及下面详细描述的构思和实施方式中的任意一种来实现,这是因为本发明所公开的构思和实施例并不限于任何实施方式。另外,本发明公开的一些方面可以单独使用,或者与本发明公开的其他方面的任何适当组合来使用。
本申请实例可通过对Redis数据库源码进行修改实现,使之能够在两台物理主机的情况下,提供Redis的高可用服务。
如图2所示,铁路售票系统作为客户端,物理机A和物理机B提供Redis的高可用服务。Redis里存储的数据是K1102这趟车各个站的名字、各个站点的到时和发时,余票信息等,这些数据用户访问会比较频繁,Redis性能很高,非常适合缓存这些访问频繁的数据。客户端、物理机A、物理机B三者之间两两相连通信,客户端将待写入数据写入物理机A的Master服务器中,物理机B的slave服务器从物理机A的Master服务器中读取并缓存该待写入数据更新后反馈给客户端;物理机A包括一个Sentinel节点1、物理机B包括一个Sentinel节点2。物理机A的Sentinel节点1、物理机B的Sentinel节点2均使用心跳检测机制监测所述物理机A、物理机B工作状态。
如图1所示,步骤W1:物理机B通过Sentinel节点2、物理机A通过Sentinel节点1分别周期性地发送ping命令至物理机A的Master服务器,并在0.5秒内判断物理机A的Sentinel节点1或物理机B的Sentinel节点2是否接收到来自物理机A的Master服务器反馈该ping命令对应的正确pong命令,是则继续执行该周期性的监测指令。
如果物理机B通过Sentinel节点2、物理机A通过Sentinel节点1未能在0.5秒内收到来自物理机A的Master服务器反馈该ping命令对应的正确pong命令,则物理机B的Sentinel节点2、物理机A的Sentinel节点1分别在1秒内长内判断物理机A的Sentinel节点1或物理机B的Sentinel节点2是否接收到来自物理机A的Master服务器反馈该ping命令对应的正确pong命令,是则判定物理机A的故障类型为I:物理机A暂时下线,同时根据收到反馈命令的Sentinel节点,获得判断物理机A暂时下线的物理机;如果超过1秒未接收到来自物理机A的Master服务器反馈该ping命令对应的正确pong命令,或者接收到错误pong命令,即判定物理机A的故障类型为II:物理机A已经下线,同时根据收到反馈命令的Sentinel节点获得判断物理机A已经下线的物理机。
针对故障类型I:当Sentinel节点2判定Master服务器暂时下线时,Sentinel节点2通知客户端将待写入数据写入物理机B的缓冲服务器中,物理机B的缓冲服务器缓存代写入数据,并更新保存。Sentinel节点1和Sentinel节点2分别监控物理机A和物理机B的工作状态,并判断物理机A发生故障暂时下线是否恢复,是则根据Sentinel节点的位置,获得判断物理机A恢复的物理机,该物理机通知客户端物理机A暂时下线已恢复,命令客户端将待写入数据写入物理机A的Master服务器中,并且通知物理机B,将物理机B的缓冲服务器中数据全部缓存至物理机A的Master服务器中数据同步完成后,物理机B的缓冲服务器清空。
针对故障类型II:触发故障转移机制:判断物理机A发生故障已经下线的物理机向客户端订阅的频道发布switch-master的消息,告知客户端Redis服务正在进行物理机A的Master和物理机B的Slave服务器的切换,客户端根据IP地址和端口号将待写入数据写入物理机B的缓冲服务器中,物理机B的缓冲服务器缓存该待写入的数据,更新并保存为数据N;并定义客户端将待写入数据写入物理机B的缓冲服务器的时间点为t0判断物理机A发生故障已经下线的物理机命令客户端将时间点t0之后的待写入数据写入物理机B的Slave服务器中。
判断客户端在时间点t0之后是否将待写入数据写入物理机B的Slave服务器中;是则故障转移机制完成,判断物理机A发生故障已经下线的物理机通知物理机B将物理机B的缓冲服务器中数据N全部缓存至物理机B的Slave服务器中;客户端读取物理机B的slave服务器中的数据,物理机B的缓冲服务器清空其缓存服务器中的数据N;判断客户端在时间点t0之后是否将待写入数据写入物理机B的Slave服务器中;是则故障转移机制完成,否则继续执行判断故障转移是否完成的指令;如果故障转移完成,那么基于Sentinel节点1和Sentinel节点2分别监控物理机A和物理机B的工作状态,判断物理机A发生故障已经下线的物理机通知物理机B将物理机B的缓冲服务器中数据N全部缓存至物理机B的Slave服务器中;随后客户端读取物理机B的slave服务器中的数据,物理机B的缓冲服务器清空其缓存服务器中的数据N;随后,物理机A的Sentinel节点1,物理机B的Sentinel节点2分别判断物理机A发生故障已经下线是否恢复,如果故障已下线恢复,判断物理机A已经下线恢复的物理机通知客户端物理机A已经下线已恢复,命令客户端将待写入数据写入物理机A的MASTER服务器中;并命令物理机A的Master服务器读取并缓存物理机B的Slave服务器中缓存的数据;之后客户端即可从物理机A的Master服务器中读取数据;如果故障下线没有恢复,那么就继续执行判断故障下线是否恢复的指令。
当客户端写入缓存数据时,如果物理机A突然宕机,物理机B将自身的IP地址和要写入的端口号发送给客户端,客户端根据IP地址和端口号将缓存数据写入物理机B中,物理机B中的Slave服务器自动更新成为逻辑上的Master服务器,期间通过缓冲服务器依然保持整个系统的服务可用状态,客户端自动识别并连接Master服务器,实现服务高可用。
缓冲服务器拥有发布与订阅功能(pub/sub),通过将信息发送给频道(channel)来实现与其他Redis进程通信。在缓冲服务器初始化时,Sentinel节点通过Master服务器和Slave服务器上的__sentinel__:hello频道使用info命令获得缓冲服务器的身份信息,包括IP地址、端口号和运行ID(runid),来更新网络拓扑结构。
缓冲服务器拥有自己的TCP端口号,使用Socket与Master服务器和Salve服务器建立联系,传输缓存数据,并且使用AOF文件形式实现缓存数据持久化。
通过新增添的双宿主模式,在出现断电、网络中断、服务器磁盘损坏、服务器故障,用户会访问不了,导致页面刷不出数据的青情况下,实现了在两台物理机上的故障转移,其中的缓冲服务器在Redis服务不可用的情况下,起到临时保存数据的作用,能自动在短时间内恢复服务,避免了数据的丢失,提高了系统服务的可用性。基于Redis提供的高可用服务,尤其是对微型企业来说,从至少三台物理机减少到两台,节约了运营成本。
虽然本发明已以较佳实施例阐述如上,然其并非用以限定本发明。本发明所属技术领域中具有通常知识者,在不脱离本发明的精神和范围内,当可作各种的更动与润饰。因此,本发明的保护范围当视权利要求书所界定者为准。