掌桥专利:专业的专利平台
掌桥专利
首页

一种用于实现Redis集群高可用的方法和代理中间件

文献发布时间:2023-06-19 16:04:54



技术领域

本发明涉及计算机技术领域,尤其涉及一种用于实现Redis集群高可用的方法和代理中间件。

背景技术

Redis(REmote DIctionary Server)作为当前流行的键-值存储系统,支持string,hash,set,zset,list等数据结构。开源的twemproxy为memcache以及Redis的代理中间件,用户连接访问twemproxy,由twemproxy统一对其读写请求进行转发,分发后redis-server或者memcache。

基于现有的方案,当twemproxy所代理的Redis服务器进程一旦因异常而退出,twemproxy将该异常节点剔除。然而,对于线上使用场景,特别是金融行业的方案是将Redis当做数据库持久化存储,数据并非只做缓存,所以异常的Redis服务器需要被健康的Redis服务器替代。但twemproxy并不能感知Redis服务器的切换事件,亦无法修改当前已有的redis拓扑,从而导致异常请求仍然被转发到异常的Redis服务器,导致用户请求报错。

发明内容

本发明的目的是提供一种用于实现Redis集群高可用的方法和代理中间件。

根据本申请的实施例,提供了一种用于实现Redis集群高可用的方法,其中,所述方法包括:

代理中间件生成子线程来建立与Redis集群的哨兵模块之间的长连接,从而与哨兵模块进行交互;

如果与所述哨兵模块之间的长连接断开,则代理中间件确定可用的哨兵模块,从而与新的哨兵模块建立连接并进行交互。

根据本申请的实施例,提供了一种用于实现Redis集群高可用的代理中间件,其中,所述代理中间件和哨兵模块之间建立了长连接,所述代理中间件包括:

用于生成子线程来建立与Redis集群的哨兵模块之间的长连接,从而与哨兵模块进行交互的单元;

用于如果与所述哨兵模块之间的长连接断开,则确定可用的哨兵模块,从而与新的哨兵模块建立连接并进行交互的单元。

根据本申请的实施例,提供了一种用于实现Redis集群高可用的系统,所述系统包括多个Redis节点、哨兵模块、以及如本申请实施例所述的代理中间件

根据本申请的实施例,提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现本申请实施例的方法。

根据本申请的实施例,提供了一种计算机可读的存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现本申请实施例的方法。

与现有技术相比,本申请实施例具有以下优点:根据本申请实施例的代理中间件单独派生一个子线程和Redis集群的哨兵模块进行通信,规避了代理中间件的主流程被阻塞的风险;并且,根据本申请实施例的代理中间件具有Redis服务器异常退出后发生主从切换事件的感知能力,自动更新Redis拓扑的高可用能力,以及进程异常退出能自动拉起的功能,进一步提升了Redis集群的高可用性。

附图说明

通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:

图1示出了根据本申请实施例的用于实现Redis集群高可用的方法流程图。;

图2示出了根据本申请实施例的一个实施例性的系统的结构示意图;

图3(a)示出了根据本申请实施例的示例性的Redis集群的主从切换过程的示意图;

图3(b)示出了根据本申请实施例的示例性的Redis集群的主从切换过程的示意图;

图4示出了根据本申请实施例的用于实现Redis集群高可用的代理中间件的结构示意图。

附图中相同或相似的附图标记代表相同或相似的部件。

具体实施方式

在更加详细地讨论示例性实施例之前应当提到的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各项操作描述成顺序的处理,但是其中的许多操作可以被并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理可以对应于方法、函数、规程、子例程、子程序等等。

在上下文中所称“计算机设备”,也称为“电脑”,是指可以通过运行预定程序或指令来执行数值计算和/或逻辑计算等预定处理过程的智能电子设备,其可以包括处理器与存储器,由处理器执行在存储器中预存的存续指令来执行预定处理过程,或是由ASIC、FPGA、DSP等硬件执行预定处理过程,或是由上述二者组合来实现。计算机设备包括但不限于服务器、个人电脑、笔记本电脑、平板电脑、智能手机等。

所述计算机设备包括用户设备与网络设备。其中,所述用户设备包括但不限于电脑、智能手机、PDA等;所述网络设备包括但不限于单个网络服务器、多个网络服务器组成的服务器组或基于云计算(Cloud Computing)的由大量计算机或网络服务器构成的云,其中,云计算是分布式计算的一种,由一群松散耦合的计算机集组成的一个超级虚拟计算机。其中,所述计算机设备可单独运行来实现本申请,也可接入网络并通过与网络中的其他计算机设备的交互操作来实现本申请。其中,所述计算机设备所处的网络包括但不限于互联网、广域网、城域网、局域网、VPN网络等。

需要说明的是,所述用户设备、网络设备和网络等仅为举例,其他现有的或今后可能出现的计算机设备或网络如可适用于本申请,也应包含在本申请保护范围以内,并以引用方式包含于此。

后面所讨论的方法(其中一些通过流程图示出)可以通过硬件、软件、固件、中间件、微代码、硬件描述语言或者其任意组合来实施。当用软件、固件、中间件或微代码来实施时,用以实施必要任务的程序代码或代码段可以被存储在机器或计算机可读介质(比如存储介质)中。(一个或多个)处理器可以实施必要的任务。

这里所公开的具体结构和功能细节仅仅是代表性的,并且是用于描述本申请的示例性实施例的目的。但是本申请可以通过许多替换形式来具体实现,并且不应当被解释成仅仅受限于这里所阐述的实施例。

应当理解的是,虽然在这里可能使用了术语“第一”、“第二”等等来描述各个单元,但是这些单元不应当受这些术语限制。使用这些术语仅仅是为了将一个单元与另一个单元进行区分。举例来说,在不背离示例性实施例的范围的情况下,第一单元可以被称为第二单元,并且类似地第二单元可以被称为第一单元。这里所使用的术语“和/或”包括其中一个或更多所列出的相关联项目的任意和所有组合。

应当理解的是,当一个单元被称为“连接”或“耦合”到另一单元时,其可以直接连接或耦合到所述另一单元,或者可以存在中间单元。与此相对,当一个单元被称为“直接连接”或“直接耦合”到另一单元时,则不存在中间单元。应当按照类似的方式来解释被用于描述单元之间的关系的其他词语(例如“处于...之间”相比于“直接处于...之间”,“与...邻近”相比于“与...直接邻近”等等)。

这里所使用的术语仅仅是为了描述具体实施例而不意图限制示例性实施例。除非上下文明确地另有所指,否则这里所使用的单数形式“一个”、“一项”还意图包括复数。还应当理解的是,这里所使用的术语“包括”和/或“包含”规定所陈述的特征、整数、步骤、操作、单元和/或组件的存在,而不排除存在或添加一个或更多其他特征、整数、步骤、操作、单元、组件和/或其组合。

还应当提到的是,在一些替换实现方式中,所提到的功能/动作可以按照不同于附图中标示的顺序发生。举例来说,取决于所涉及的功能/动作,相继示出的两幅图实际上可以基本上同时执行或者有时可以按照相反的顺序来执行。

下面结合附图对本发明作进一步详细描述。

图1示出了根据本申请实施例的用于用于实现Redis集群高可用的方法流程图。所述方法包括步骤S1、步骤S2和步骤S3。

参照图1,在步骤S1中,代理中间件生成子线程来建立与Redis集群的哨兵模块之间的长连接,从而与哨兵模块进行交互。

在步骤S2中,如果与所述哨兵模块之间的长连接断开,则代理中间件确定可用的哨兵模块,从而与新的哨兵模块建立连接并进行交互。

根据一个实施例,所述代理中间件为Twemproxy,所述哨兵模块为Redis集群的Sentinel。并且,根据本实施例的Redis集群所在的系统如图2所示,参照图2,该系统的Redis集群包括3个Redis分片(表示为Shard-1至Shard-3)、3个哨兵模块Sentinel、以及3个代理中间件twemproxy。其中,每个Redis分片包括一个主节点(表示为M-Redis)和至少一个从节点(表示为S-Redis)。

基于该系统,上游业务Client通过domain来访问Redis集群,其域名后面实际映射的是Redis服务器代理层的3个twemproxy。在Redis实例的主从切换场景中,如果有M-Redis异常退出,Sentinel会感知到并将S-Redis提升为主节点。

在如图2所示的系统中,为了防止阻塞Twemproxy的主流程,Twemproxy在步骤S1中解析访问Sentinels集群所对应的域名,生成子线程来建立与Sentinels集群中的一个Sentinels模块的长连接,从而与所选择的Sentinel进行交互。如果Twemproxy和Sentinel之间的连接断开,则Twemproxy在步骤S2中采用轮询(round-robin)的方式获取下一个可用的Sentinel的IP,从而与新的Sentinel建立连接并进行交互。

根据一个实施例,代理中间件通过开启一个线程,在内部维护一个状态机。其中,所述状态机采用多个字段来指示哨兵模块的不同状态。

例如,在如图2所示的系统中,Twemproxy单独开启一个线程,内部维护一个状态机,该状态机的字段包括但不限于:

1)SENTINEL_INIT_CONN:用于表示状态机的初始状态,Sentinel连接初始化;

2)SENTINEL_CONN_SEND_REQ:用于表示Sentinel初始化完毕后的下一个阶段,当路由服务器向Sentinel发出info sentinel以及订阅+switch-master频道这两个命令后,便进入此状态;

3)SENTINEL_CONN_ACK_INFO:Twemproxy向Sentinel发出info sentinel后,变会进入到此状态;

4)SENTINEL_CONN_ACK_REDIRECT_SUB:用于表示SENTINEL_CONN_ACK_INFO的下一个状态,以下所示的三种情况会触发此状态机:

a)Twemproxy对Sentinel的探活结果返回;

b)接收到Sentinel的推送消息(接收到redis-server主从切换的信息);

c)完成判断Sentinel是否处于网络分区的流程结束;

5)SENTINEL_CONN_DISCONNECTED:用于表示Twemproxy和Sentinel的通信处于连接断开的状态。

根据一个实施例,所述方法包括主从切换机制,主从切换机制的流程包括步骤S3(图未示)至步骤S5(图未示)。

在步骤S3中,代理中间件通过与哨兵模块之间的发布订阅机制,检测Redis集群中是否发生了主从切换事件。

在步骤S4,如果检测到发生主从切换事件,则代理中间件更新自身存储的Redis拓扑信息。

具体地,后端Redis服务器完成主从切换后,代理中间件接收Redis服务器推送的拓扑信息,以基于该拓扑信息更新自身存储的拓扑信息。

在步骤S5中,代理中间件在相应的配置信息中热更新Redis拓扑信息。

图3(a)图3(b)分别示出了根据本申请实施例的示例性的Redis集群的主从切换过程的示意图。

参照图3(a),Twemproxy代理配置的Redis节点(后端redis-server)包括一个主节点和一个从节点,分别表示为M-redis和S-redis,其IP地址分别表示为IP-1和IP-2。虚线框的部分表示Twemproxy的Redis集群拓扑配置(表示为Map),包括该主节点的IP(master:IP-1)和从节点各自的IP(salve:IP-2)。并且,Twemproxy通过domain方式连接了哨兵模块集群Sentinel。Sentinel间歇性地向Redis节点发送心跳包。如图3(a)所示,当Redis主节点M-redis异常时,Sentinel可实时感知到该异常。

参照图3(b),Sentinel感知到该异常,把健康的Redis从节点S-redis提升为主节点,并相应地将原先的Redis主节点标记为从节点。后端redis-server切换完成后,Sentinel将主从切换完成后的最新的Redis拓扑信息推送给Twemproxy,以供Twemproxy将此拓扑信息同步更新内存中。Twemproxy更新完内存中的拓扑之后,会热更新对应配置(Map)中的redis拓扑信息,并将其持久化。

并且,图3(a)和3图(b)的Twemproxy订阅了Sentinel的+switch-master频道,使得在以下情况触发事件推送:

i)Twemproxy所连接的Sentinel主动产生了切换任务;

ii)Twemproxy所连接的Sentinel被动得知由其他Sentinel发生了主从切换事件。

通过该+switch-master频道收到的事件推送,后端Redis服务器完成主从切换后,Twemproxy接收Redis服务器推送的Redis拓扑信息,以基于该拓扑信息更新自身存储的Redis拓扑信息。

根据一个实施例,所述方法包括进程保活机制,进程保活机制的流程包括步骤S6(图未示)至步骤S7(图未示)。

在步骤S6中,启动后,代理中间件启动master进程,并在master进程中生成worker进程。

在步骤S7中,如果所述worker进程发生异常,则master进程生成新的worker进程。

根据一个实施例,在如图2所示的系统中,Twemproxy先启动加载配置,接着将自身的进程名称修改为twemproxy_master,再派生出worker进程,将worker进程的名字修改为twemproxy_worker。master进程负责监听worker进程的存活状态,由worker进程来执行用户请求转发。如果master进程检测到worker进程异常退出,则在master进程中再派生出新的worker进程来接替原先的worker进程的工作。

根据一个实施例,所述方法包括探活及版本号监测机制,探活及版本号监测机制的流程包括步骤S8(图未示)至步骤S10(图未示)。

在步骤S8中,代理中间件周期性地向所连接的哨兵模块发出命令,用于获取哨兵模块返回的epoch数值。

在步骤S9中,基于接收到返回的epoch数值的时间,确定与哨兵模块的长连接的状态。

具体地,可基于预定的判断标准,根据接收到返回的epoch数值的时间长短,超时接收epoch数值的次数等条件,来确定长连接相应的健康状态。如果确定与哨兵模块的长连接是不健康的,则代理中间件确定可用的哨兵模块,从而与新的哨兵模块建立连接并进行交互。

在步骤S10中,通过将返回的epoch数值和自身存储的epoch数值进行比较,确定是否需要更新Redis拓扑信息。

根据一个实施例,在如图2所示的系统中,Twemproxy和Sentinel之间有探活机制,以确保和Sentinel的socket长连接是健康的。具体地,在步骤S8中,Twemproxy每三秒向所连接的Sentinel发出getepoch命令,用于获取当前Redis集群拓扑的版本号。其中,Redis集群每发生一次主从切换事件,则Sentinel都会对Redis集群拓扑的版本号进行加一操作。

Sentinel正常返回的结果是Sentinel当前的epoch数值。在步骤S9中,如果该结果在5秒内返回,则心跳符合预期,Twemproxy确定socket长连接是健康的;如果超过5秒返回,则Twemproxy在内存计数器当中记录一次超时并打印日志关键字样“sentinelcommunication timeout…”。如果连续四个周期均超时,则Twemproxy确定socket长连接是不健康的,并主动关闭连接,并通过round-robin的方式获取新的可用的Sentinel,从而与新的Sentinel建立长连接。

在步骤S10中,Twemproxy将Sentinel返回的epoch数值和自身存储的epoch数值进行比较,如果二者相等,则无需更新Redis拓扑信息;如果自身存储的epoch数值小于Sentinel返回的epoch数值,则Twemproxy当前维护的是旧版本的Redis拓扑信息,需要从Sentinel获取最新的Redis拓扑信息来进行更新。

根据一个实施例,所述方法包括网络区分检测机制,网络区分检测机制的流程包括步骤S11(图未示)至步骤S13(图未示)。

在步骤S11中,代理中间件周期性地向所连接的哨兵模块发出命令,用于检测该哨兵模块是否处于网络区分状态。

其中,对于一个由N个节点构成的网络,如果节点之间两两互通则说明网络没问题,但如果因为网络异常导致切分成多个组,组内网络互通,但是组间网络不通,则为网络分区状态。

在步骤S12中,响应于该命令,哨兵模块基于哨兵模块之间的通信状况,检测该哨兵模块是否处于网络区分状态。

优选地,哨兵模块通过轮询所有分片的quorum,检测该哨兵模块是否处于网络区分状态。其中,所述quorum用于表示互通的哨兵模块的个数与哨兵模块个数的比值。例如,对于3个哨兵模块,如果该3个哨兵模块均互通,则相应的quorum为3/3,如果有一个哨兵模块不通,则quorum为2/3。

在步骤S13中,如果该哨兵模块处于网络区分状态,则代理中间件确定可用的哨兵模块,从而与新的哨兵模块建立连接并进行交互。

根据一个实施例,在如图2所示的系统中,Twemproxy每分钟向所连接的Sentinel发出checksentinelstatus命令,来检测该Sentinel是否处于网络分区状态。响应于该命令,Sentinel自动轮询所有分片的quorum,如果任一分片的quorum少于半数,则该Sentinel处于网络区分状态,Twemproxy通过round-robin的方式获取新的可用的Sentinel,从而与新的Sentinel建立长连接。

根据一个实施例,所述方法包括配置回写机制,基于配置回写机制,代理中间件生成临时文件,将内存中原有的配置选型和更新后的Redis拓扑信息格式化后写入到临时文件。并且,对临时文件进行格式校验,校验通过后基于临时文件替换旧的配置文件。

根据本申请实施例的方法,代理中间件单独派生一个子线程和Redis集群的哨兵模块进行通信,规避了代理中间件的主流程被阻塞的风险;并且,根据本申请实施例的代理中间件具有Redis服务器异常退出后发生主从切换事件的感知能力,自动更新Redis拓扑的高可用能力,以及进程异常退出能自动拉起的功能,进一步提升了Redis集群的高可用性。

图4示出了根据本申请实施例的用于实现Redis集群高可用的代理中间件的结构示意图。

所述代理中间件包括:用于生成子线程来建立与Redis集群的哨兵模块之间的长连接,从而与哨兵模块进行交互的单元(以下简称“连接创建单元1”),用于如果与所述哨兵模块之间的长连接断开,则确定可用的哨兵模块,从而与新的哨兵模块建立连接并进行交互的单元(以下简称“可用确定单元2”)。

参照图4,连接创建单元1生成子线程来建立与Redis集群的哨兵模块之间的长连接,从而与哨兵模块进行交互。

如果与所述哨兵模块之间的长连接断开,则可用确定单元2确定可用的哨兵模块,从而与新的哨兵模块建立连接并进行交互。

根据一个实施例,代理中间件通过开启一个线程,在内部维护一个状态机。其中,所述状态机采用多个字段来指示哨兵模块的不同状态。

根据一个实施例,所述代理中间件执行的操作包括主从切换机制,所述代理中间件包括切换检测单元(图未示)、拓扑更新单元(图未示)和配置更新单元(图未示)。

切换检测单元通过与哨兵模块之间的发布订阅机制,检测Redis集群中是否发生了主从切换事件。

如果检测到发生主从切换事件,则拓扑更新单元更新自身存储的Redis拓扑信息。

具体地,后端Redis服务器完成主从切换后,代理中间件接收Redis服务器推送的拓扑信息,以供拓扑更新单元基于该拓扑信息更新自身存储的拓扑信息。

接着,配置更新单元在相应的配置信息中热更新Redis拓扑信息。

根据一个实施例,所述代理中间件执行的操作包括进程保活机制,所述代理中间件包括进程启动单元(图未示)和进程生成单元(图未示)。

启动后,进程启动单元启动master进程,并在master进程中生成worker进程。

如果所述worker进程发生异常,则进程生成单元生成新的worker进程。

根据一个实施例,所述代理中间件执行的操作包括探活及版本号监测机制,所述代理中间件包括第一发送单元(图未示)、状态确定单元(图未示)和比较单元(图未示)。

第一发送单元周期性地向所连接的哨兵模块发出命令,用于获取哨兵模块返回的epoch数值。

状态确定单元基于接收到返回的epoch数值的时间,确定与哨兵模块的长连接的状态。

具体地,可基于预定的判断标准,根据接收到返回的epoch数值的时间长短,超时接收epoch数值的次数等条件,来确定长连接相应的健康状态。如果确定与哨兵模块的长连接是不健康的,则状态确定单元确定可用的哨兵模块,从而与新的哨兵模块建立连接并进行交互。

比较单元通过将返回的epoch数值和自身存储的epoch数值进行比较,确定是否需要更新Redis拓扑信息。

根据一个实施例,所述代理中间件执行的操作包括网络区分检测机制,所述代理中间件包括第二发送单元(图未示)和区分确定单元(图未示),所述哨兵模块包括状态检测单元(图未示)。

第二发送单元周期性地向所连接的哨兵模块发出命令,用于检测该哨兵模块是否处于网络区分状态。

其中,对于一个由N个节点构成的网络,如果节点之间两两互通则说明网络没问题,但如果因为网络异常导致切分成多个组,组内网络互通,但是组间网络不通,则为网络分区状态。

响应于该命令,状态检测单元基于哨兵模块之间的通信状况,检测该哨兵模块是否处于网络区分状态。

优选地,状态检测单元通过轮询所有分片的quorum,检测该哨兵模块是否处于网络区分状态。其中,所述quorum用于表示互通的哨兵模块的个数与哨兵模块个数的比值。例如,对于3个哨兵模块,如果该3个哨兵模块均互通,则相应的quorum为3/3,如果有一个哨兵模块不通,则quorum为2/3。

如果该哨兵模块处于网络区分状态,则区分确定单元确定可用的哨兵模块,从而与新的哨兵模块建立连接并进行交互。

根据一个实施例,所述代理中间件执行的操作包括配置回写机制,基于配置回写机制,代理中间件生成临时文件,将内存中原有的配置选型和更新后的Redis拓扑信息格式化后写入到临时文件。并且,对临时文件进行格式校验,校验通过后基于临时文件替换旧的配置文件。

根据本申请实施例的装置,代理中间件单独派生一个子线程和Redis集群的哨兵模块进行通信,规避了代理中间件的主流程被阻塞的风险;并且,根据本申请实施例的代理中间件具有Redis服务器异常退出后发生主从切换事件的感知能力,自动更新Redis拓扑的高可用能力,以及进程异常退出能自动拉起的功能,进一步提升了Redis集群的高可用性。

本发明的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本发明的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本发明的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个功能或步骤的电路。

另外,本发明的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本发明的方法和/或技术方案。而调用本发明的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。在此,根据本发明的一个实施例包括一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述根据本发明的多个实施例的方法和/或技术方案。

对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。系统权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。

相关技术
  • 一种用于实现Redis集群高可用的方法和代理中间件
  • 一种实现Redis集群高可用的方法及系统
技术分类

06120114696406