基于Qconf的消息队列高可用系统及方法与流程

文档序号:12863619阅读:291来源:国知局
基于Qconf的消息队列高可用系统及方法与流程

本发明属于计算机技术领域,主要应用于消息队列服务高可用场景,用于提升消息队列服务可用性和灵活性。



背景技术:

对于互联网公司而言,随着业务需求越来越复杂,为了降低服务之间的耦合度,提升服务模块化,消息队列使用越来越广泛,消息队列服务的可用性也显得越来越重要。传统消息队列使用方法具有如下缺点:

(1)可用性低:一旦某个消息队列服务故障,应用程序就无法访问消息队列服务。

(2)维护成本高:采用了比较复杂的架构提高消息队列可用性,运维成本高。

(3)引入新的隐患:由于采用的高可用架构本身存在隐患,导致整个高可用架构可用性不高。

(4)易用性差:虽然实现了高可用,但是不方便使用,导致可操作性低下。



技术实现要素:

本发明针对现有技术的不足,提供一种基于qconf的消息队列高可用系统及方法,基于qconf可以注册消息队列zk服务节点,不但可以实现消息队列服务高可用,同时可以实现负载均衡,该系统可以支持大规模消息队列高可用和负载均衡。

本发明的目的是通过以下技术方案来实现的:一种基于qconf的消息队列高可用系统,该系统包括应用程序端、qconf客户端、qconf服务端、qconf管理端、qconf监控节点和消息队列服务端:

应用程序端:运行应用程序的服务器,应用程序调用对应的qconf扩展接口,解析传入的参数:zk服务节点,得到消息队列的ip和端口,然后应用程序和所述消息队列建立连接,进而和所述消息队列交互读写请求;

qconf客户端:包括qconfagent服务、应用程序对应的qconf扩展;qconf客户端和应用程序同机部署,用于和qconf服务端交互,获取最新的消息队列zk服务节点信息;

qconf服务端:部署zookeeper集群,存储消息队列zk服务节点信息;

qconf管理端:通过调用qconf服务端接口,对消息队列zk服务节点进行添加、删除、更新和获取操作,qconf管理端部署qconf管理扩展,用于管理人员管理zk服务节点;

qconf监控节点:部署qconf监控服务,监控消息队列zk服务节点存活,能够实现所述消息队列zk服务节点上下线;在一台服务器上部署qconf监控节点,可以监控qconf服务端所有的消息队列zk服务节点;

消息队列服务端:是部署消息队列的服务器,采用集群形式部署消息队列,不同的消息队列集群,采用端口号唯一标识;所有消息队列集群的ip和端口信息,保存在消息队列元信息中。

进一步地,所述消息队列服务端包括消息队列服务管理模块:采用一个磁盘节点和两个内存节点形式部署消息队列;一个消息队列集群中所有成员的端口保持一致,不同的消息队列集群,端口不同,采用端口唯一标识所述消息队列集群。

进一步地,所述qconf管理端包括管理zk服务节点模块,需要传入的参数:zk服务节点、消息队列的ip以及端口和zookeeper连接字符串;zookeeper连接字符串表示zookeeper集群所有成员的ip和端口组成的字符串;

通过扫描消息队列元信息,获取消息队列ip和端口,所述端口是指zk服务节点对应的消息队列集群的端口,每个zk服务节点表示一个消息队列集群;所述zk服务节点的值是该端口对应的消息队列集群所有成员的ip和端口;对zk服务节点的操作包括:添加zk服务节点:调用qconf管理端接口,进行添加zk服务节点、为zk服务节点新增值、为zk服务节点删除值、zk服务节点上下线、获取zk服务节点的所有成员。

进一步地,所述qconf客户端包括qconf客户端管理模块,需要传入的参数:zookeeper连接字符串;按照qconf部署要求,部署qconf客户端服务,qconf客户端配置文件需要设置zookeeper连接字符串,然后启动qconf客户端服务;查看qconf客户端进程是否启动;如果修改了qconf客户端配置文件,需要重启qconf客户端服务;部署qconf客户端服务后,按照qconf扩展部署要求在应用程序端部署应用程序相应的qconf扩展。

进一步地,所述应用程序端包括解析服务节点模块和应用程序访问模块;

所述解析服务节点模块需要传入的参数:zk服务节点;在应用程序端部署qconf客户端服务后,应用程序调用相应的qconf扩展接口解析zk服务节点,得到消息队列集群成员;

所述应用程序访问模块需要传入的参数:消息队列的ip和端口;解析服务节点模块执行结束后,得到某个消息队列的ip和端口,应用程序根据所述消息队列ip和端口,和所述消息队列建立连接,应用程序可以发送读写请求,消息队列处理这些读写请求。

进一步地,所述qconf监控节点包括监控服务节点模块:

需要传入参数:zookeeper集群所有成员ip和端口;

在qconf监控节点部署qconf监控服务,修改qconf监控配置文件中zookeeper参数值为所述zookeeper集群所有成员ip和端口,然后启动qconf监控服务;查看启动进程;qconf监控服务启动后,如果所述消息队列某个成员故障,所述消息队列集群对应的zk服务节点下线所述消息队列集群的故障成员,这样,应用程序每次获取到的消息队列服务都是状态存活的。

进一步地,所述qconf监控节点还包括服务节点web管理模块:在qconf监控节点部署web管理页面,对所述zk服务节点进行添加、删除、更新和查看操作。

一种基于qconf的消息队列高可用方法,该方法包括以下步骤:

(1)在多台服务器上部署消息队列集群,在消息队列元信息中记录消息队列集群所有成员的ip和端口;

(2)在qconf服务端部署zookeeper集群,zookeeper集群所有成员的ip和端口记为zookeeper连接字符串;zookeeper集群存储zk服务节点信息,包括zk服务节点名称和zk服务节点值;在qconf管理端部署qconf管理扩展,调用qconf管理扩展接口,对zk服务节点进行添加、删除、新增和获取操作;

(3)qconf监控节点调用qconf服务端接口,获取到qconf服务端所有的zk服务节点以及zk服务节点值,检测端口存活进行对相应的zk服务节点上下线操作;

(4)在qconf客户端部署qconf客户端服务,qconf客户端自动和qconf服务端建立连接,从qconf客户端可以获取到qconf服务端最新的zk服务节点;

(5)应用程序端的应用程序访问模块传入zk服务节点给解析服务节点模块,解析服务节点模块调用qconf客户端服务获取到zk服务节点对应的消息队列的ip和端口,然后返回给应用程序访问模块。

本发明的有益效果是:

(1)可用性高:当消息队列集群某个成员故障时,不会影响应用程序访问消息队列集群,大大提升了消息队列服务可用性。

(2)易用性好:应用程序只需要一行代码,就可以获得所述消息队列ip和端口,对于应用程序开发者而言,使用方便简洁。

(3)维护成本低:整个系统简单稳定,便于管理人员维护。

(4)稳定性强大:目前qconf技术成熟,zookeeper集群本身具有高可用,整体稳定性比较好,不会引入新的隐患。

(5)降低服务耦合度:通过qconf,应用程序和消息队列解耦,调整消息队列服务,应用程序不需要修改配置,大大降低了服务耦合度。

附图说明

图1是本发明基于qconf的消息队列高可用方法总体架构图;

图2是本发明基于qconf的消息队列高可用系统各个模块流程图。

具体实施方式

下面结合附图和具体实施例对本发明作进一步详细说明。

如图1所示,本发明提供的一种基于qconf的消息队列高可用系统,该系统包括应用程序端、qconf客户端、qconf服务端、qconf管理端、qconf监控节点和消息队列服务端六个单元:

(1)应用程序端

应用程序端是运行应用程序的linux服务器,应用程序调用对应的qconf扩展接口,解析传入的参数:zk(zookeeper)服务节点,得到消息队列的ip和端口,然后应用程序和所述消息队列建立连接,进而和所述消息队列交互读写请求。

(2)qconf客户端

包括qconfagent服务、应用程序对应的qconf扩展,统称为qconf客户端。要求和应用程序同机部署,主要功能是和qconf服务端交互,获取最新的消息队列zk服务节点信息。

(3)qconf服务端

qconf服务端主要是指zookeeper集群,功能是存储消息队列zk服务节点信息。zookeeper集群本身具有高可用和分布式特性,保证了qconf服务端的可用性和可扩展性。同时,zookeeper集群具有通知机制,一旦消息队列zk服务节点发生修改,zookeeper可以实时通知所述qconf客户端,从而保证所述应用程序可以获取最新的消息队列zk服务节点。

(4)qconf管理端

通过调用qconf服务端接口,对消息队列zk服务节点进行添加、删除、更新和获取操作,需要在qconf管理端部署qconf管理扩展,以便管理人员管理zk服务节点。可以采用php语言编写管理代码来管理zk服务节点,也可以在web页面上实现zk服务节点添加、删除、更新和获取功能,方便管理人员操作。

(5)qconf监控节点

通过qconf管理端在qconf服务端注册消息队列zk服务节点后,在qconf监控节点上部署qconf监控服务,监控所述消息队列zk服务节点存活,可以实现所述消息队列zk服务节点上下线,从而实现消息队列高可用。qconf监控节点不仅可以监控所述消息队列zk服务节点存活,还可以获取qconf服务端所有zk服务节点信息,从而可以在web页面展示qconf服务端所有zk服务节点信息。

在一台服务器上部署qconf监控节点,可以监控qconf服务端所有的消息队列zk服务节点。

(6)消息队列服务端

主要是部署消息队列的服务器,一般情况下,采用集群形式部署消息队列,以便实现消息队列自身的高可用。不同的消息队列集群,采用端口号唯一标识。所有消息队列集群的ip和端口信息,保存在消息队列元信息中。所述消息队列可以是rabbitmq消息队列,也可以是其他类型的消息队列。

如图2所示,每个单元具体包括的模块如下:

(1)消息队列服务管理模块

在消息队列服务端,为了提高消息队列的可用性,采用集群形式在多台服务器上部署消息队列,本发明采用一个磁盘节点和两个内存节点形式部署消息队列。

一个消息队列集群中所有成员的端口保持一致,不同的消息队列集群,端口不同,采用端口唯一标识所述消息队列集群,便于维护和管理。

所有的消息队列集群的ip和端口,保存在消息队列元信息中,便于管理zk服务节点模块调用。

(2)管理zk服务节点模块

需要传入的参数:zk服务节点、消息队列的ip以及端口和zookeeper连接字符串;

zookeeper连接字符串表示zookeeper集群所有成员的ip和端口组成的字符串,如下所示:

zk_ip1:zk_port1,zk_ip2:zk_port1,zk_ip3:zk_port1

zk_port1是zookeeper集群的端口号,zk_ip1、zk_ip2、zk_ip3分别表示zookeeper集群成员的ip。

在qconf管理端,通过扫描所述消息队列元信息,获取到所述消息队列ip和端口,zk服务节点采用如下形式:

/db/mq/mq_端口

说明:这里的端口是指所述zk服务节点对应的消息队列集群的端口。每个zk服务节点表示一个消息队列集群;

所述zk服务节点的值是该端口对应的消息队列集群所有成员的ip和端口,如下所示:

ip1:port1,ip2:port1:ip3:port1

说明:ip1、ip2和ip3分别代表所述消息队列集群所有成员的ip,port1是所述消息队列集群的端口。

本模块主要包括:

a)添加zk服务节点:

调用qconf管理端接口,进行添加zk服务节点,如下所示:

$qzk=newqconfzk("zookeeper连接字符串");

$service_path="/db/mq/mq_port1";

$services_input=array("ip1:port1"=>qconf_status_up,"ip2:port1"=>qconf_status_up,"ip3:port1"=>qconf_status_up);

$qzk->servicesset($service_path,$services_input);

说明:port1表示所述消息队列集群的端口号,所述消息队列集群中所有成员的端口号均为port1,所述成员的ip分别为ip1、ip2和ip3。

b)为zk服务节点新增值

当某个消息队列集群需要扩容或者调整服务器时,需要为对应的zk服务节点新增值,操作如下:

$qzk=newqconfzk("zookeeper连接字符串");

$service_path="/db/mq/mq_port1";

$qzk->serviceadd($service_path,"ip4:port1",qconf_status_up);

说明:ip4是新增成员的服务器ip

c)为zk服务节点删除值

当某个消息队列集群调整或者服务器调整,需要下线某个成员时,操作如下:

$qzk=newqconfzk("zookeeper连接字符串");

$service_path="/db/mq/mq_port1";

$qzk->servicedelete($service_path,"ip3:port1");

说明:假设ip3服务器上的消息队列需要从对应的消息队列集群中去掉,本示例将ip3:port1对应的消息队列成员从所述zk服务节点中去掉,这样,应用程序将无法访问到ip3:port1所对应的消息队列,保证了消息队列服务高可用。

d)zk服务节点上下线

如果zk服务节点中成员ip1:port1需要下线,可以如下操作:

$qzk=newqconfzk("zookeeper连接字符串");

$service_path="/db/mq/mq_port1";

$qzk->serviceoffline($service_path,"ip1:port1");

上线ip1:port1操作如下:

$service_path="/db/mq/mq_port1";

$qzk->serviceup($service_path,"ip1:port1");

e)获取zk服务节点的所有成员

可以通过如下方式获取到某个zk服务节点对应的所有所述消息队列集群成员:

$qzk=newqconfzk("zookeeper连接字符串");

$service_path="/db/mq/mq_port1";

$services_list=$qzk->servicesget($service_path);

(3)qconf客户端管理模块

需要传入的参数:zookeeper连接字符串

在qconf客户端,按照qconf部署要求,需要部署qconf客户端服务,所述qconf客户端配置文件需要设置所述zookeeper连接字符串,然后启动qconf客户端服务:

#cd/usr/local/qconf/bin&&shagent-cmd.sh.shstart

查看qconf客户端进程是否启动,如下:

#ps–ef|egrepqconf_agent|grep–vgrep

如果修改了qconf客户端配置文件,需要重启qconf客户端服务:

#cd/usr/local/qconf/bin&&shagent-cmd.shrestart

部署qconf客户端服务后,需要按照qconf扩展部署要求在应用程序端部署应用程序相应的qconf扩展。

(4)解析服务节点模块

需要传入的参数:zk服务节点

在应用程序端,部署qconf客户端服务后,应用程序调用相应的qconf扩展接口解析所述zk服务节点,得到所述消息队列集群成员,如下所示:

$mq_host=qconf::gethost("db/mq/mq_port1");

说明:port1是某个消息队列集群的标识,db/mq/mq_port1标识port1对应的消息队列集群的qconfzk服务节点,通过如上操作,可以得到port1对应的消息队列集群的一个成员。每次调用如上qconf扩展接口,得到不同的所述成员,从而实现所述消息队列负载均衡。

(5)应用程序访问模块

需要传入的参数:消息队列的ip和端口;

解析服务节点模块执行结束后,得到某个消息队列的ip和端口,然后,所述应用程序根据所述消息队列ip和端口,和所述消息队列建立连接,接下来,应用程序可以发送读写请求,消息队列处理这些读写请求。

(6)监控服务节点模块

需要传入参数:zookeeper集群所有成员ip和端口

在qconf监控节点部署qconf监控服务,修改qconf监控配置文件中zookeeper参数值为所述zookeeper集群所有成员ip和端口,然后启动qconf监控服务:

#cd/usr/local/qconf/monitor&&shbin/monitor-cmd.shstart

通过如下操作查看启动进程:

#ps-ef|grepqconf_monitor|grep-vgrep

所述qconf监控服务启动后,如果所述消息队列某个成员故障,所述消息队列集群对应的zk服务节点下线所述消息队列集群的故障成员,这样,应用程序每次获取到的消息队列服务,都是状态存活的,从而提高了消息队列服务可用性。

(7)服务节点web管理模块

本模块可选。在qconf监控节点,部署web管理页面,方便对所述zk服务节点进行添加、删除、更新和查看操作。采用web管理页面形式,简化了zk服务节点管理,从而降低了维护成本。

一种基于qconf的消息队列高可用方法,该方法包括:

(1)调用消息队列服务管理模块,在多台服务器上部署消息队列集群,在消息队列元信息中记录消息队列集群所有成员的ip和端口;

(2)调用管理zk服务节点模块,在qconf服务端部署zookeeper集群,zookeeper集群所有成员的ip和端口,记为zookeeper连接字符串。zookeeper集群存储zk服务节点信息,包括zk服务节点名称和zk服务节点值,zk服务节点值格式为“ip1:port1”,如果存在多个ip和端口,以逗号分隔。在qconf管理端部署qconf管理扩展,调用qconf管理扩展接口,对zk服务节点进行添加、删除、新增和获取操作。

(3)启动监控服务节点模块,监控服务节点模块调用qconf服务端接口,获取到qconf服务端所有的zk服务节点以及zk服务节点值,zk服务节点值是以ip:端口形式存在,监控服务节点模块检测所述端口存活进行对相应的zk服务节点上线下操作。

服务节点web管理模块调用管理zk服务节点模块,在web页面,对zk服务节点进行添加、删除、新增操作,服务节点web管理模块调用监控服务节点模块,在web页面上对zk服务节点进行上下线和查看操作,简化zk服务节点管理工作。

(4)调用qconf客户端管理模块,在qconf客户端部署qconf客户端服务,qconf客户端自动和qconf服务端建立连接,从qconf客户端可以获取到qconf服务端最新的zk服务节点。

(5)应用程序访问模块传入zk服务节点给解析服务节点模块,解析服务节点模块调用qconf客户端服务获取到zk服务节点对应的消息队列的ip和端口,然后返回给应用程序访问模块。

上述实施例只是本发明的举例,尽管为说明目的公开了本发明的最佳实例和附图,但是本领域的技术人员可以理解:在不脱离本发明及所附的权利要求的精神和范围内,各种替换、变化和修改都是可能的。因此,本发明不应局限于最佳实施例和附图所公开的内容。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1