首页> 中国专利> 一种基于数据库中间件集群的高可用客户端负载均衡方法

一种基于数据库中间件集群的高可用客户端负载均衡方法

摘要

本发明公开了一种基于数据库中间件集群的高可用客户端负载均衡方法,其特征在于,包括步骤1:客户端的加载,获取客户端与数据库中间件集群的首次连接凭据;步骤2:以首次连接凭据生成数据源连接对象存入客户端;步骤3:从数据库中间件集群中获取所有在线的中间件实例;步骤4:待步骤3的首次连接成功后,周期性地检查数据库中间件集群中的中间件实例状态;步骤5:业务系统按照配置的负载均衡算法,获取连接中间件实例。达到实现基于JDBC协议的数据通信,自动处理与数据库中间件集群间的连接、负载、异常、熔断等问题,减少在服务端配置负载均衡硬件与软件的麻烦的效果。

著录项

  • 公开/公告号CN113032431A

    专利类型发明专利

  • 公开/公告日2021-06-25

    原文格式PDF

  • 申请/专利权人 焦点科技股份有限公司;

    申请/专利号CN202110439382.8

  • 发明设计人 张勇;乐磊;丁国洋;

    申请日2021-04-23

  • 分类号G06F16/2453(20190101);G06F16/25(20190101);G06F16/21(20190101);

  • 代理机构32249 南京瑞弘专利商标事务所(普通合伙);

  • 代理人陈建和

  • 地址 210032 江苏省南京市高新开发区星火路软件大厦A座12F

  • 入库时间 2023-06-19 11:35:49

说明书

技术领域

本发明属于数据库中间件领域,具体涉及一种基于数据库中间件集群的高可用客户端负载均衡方法。

背景技术

随着互联网行业的快速发展和业务量的不断提高,每天都会产生大量的数据并记录在数据库中。长此以往造成数据库单表数据过多,读取性能降低。同时传统关系型数据库的单点部署已经不能满足企业对应用高性能、高可用的要求。所以,近些年越来越多的企业开始转型使用分布式数据库。然而,复杂的分布式数据库环境对应用的开发人员要求更高,排查问题更难。为了解决上述问题,实现分布式数据库对应用的透明,数据库中间件系统应运而生,以用于统一管理分布式数据库以及处理应用对数据库的所有请求。作为数据库中间件系统,为保证数据库中间件系统的高性能及高可用,系统采用多实例集群部署,即在数据库中间件系统内部署多个应用实例;所述应用实例,是位于应用和操作系统之间的数据管理程序,应用对数据库中任一数据的任一操作,包括数据定义、数据查询、数据维护及数据库运行控制等等,均要通过应用实例完成。

为了保证数据库中间件集群中每个实例都能分担到一定的流量并在遇到故障时自动下线,急需一种可靠的负载均衡方案。传统的负载均衡方案一般都是在服务端部署,即在数据库中间件端部署,主要有硬件负载均衡与软件负载均衡方案,硬件负载均衡主要通过在服务器节点之间安装专门用于负载均衡的设备,软件负载均衡则是通过在服务器上安装一些用于负载均衡功能或模块等软件来完成请求分发工作,比如Nginx等,它们的优点是方案成熟可靠,经过多年的发展已经被证实可以提高服务器响应速度,解决网络拥塞问题,为用户提供完全的透明服务,避免各种单点失效。但是,部署服务端负载均衡硬件或软件往往需要专业的运维人员维护,同时数据库中间件内的任一数据库实例上线及下线需要通知运维人员修改配置,导致使用数据库中间件的应用无法根据自身实际的业务需要调整数据库访问策略。

除了服务端配置负载均衡,现在市场上也出现了客户端配置负载均衡,主要是以Netflix公司开发的Ribbon为代表,全称为Spring Cloud Ribbon,它使用TCP或HTTP协议通信,是一个基于HTTP和TCP的客户端负载均衡工具,但无法满足基于JDBC协议的数据库中间件软件的要求。

CN202010334190提供了基于JDBC协议的客户端连接数据库的方法,通过分布式数据访问层中间件获取数据库连接地址,减少了物理数据库上的连接数量,但分布式数据库访问层中间件只解决了快速连接数据库的问题,并未考虑网络拥塞、连接失败环境下的数据获取问题解决;CN201510195238提供了通过客户端获得数据库集群状态通知信息的方法,服务应用的数据操作请求根据数据库状态变化,自适应地被分发给活动的数据库实例,然而在分布式数据库环境由于处理多个数据库的关系,所有诸如服务应用通过客户端与数据库集群的连接对开发人员有更高的开发要求,可用性及并发性能都无法得到保障。

发明内容

本发明的目的是,通过数据库中间件系统提供的客户端,可以让业务系统方便、快捷、均衡、高效、安全的调用数据库中间件系统。数据库中间件客户端会自动处理与多个实例间的网络连接、通信、负载、异常等问题。应用程序开发人员不再需要关注跟处理与数据库中间件系统之间的非业务问题,从而可以将工作的重心放在自身业务上。

本发明的技术方案是:一种数据库中间件集群高可用的客户端负载均衡方案,具体包括:

步骤1:客户端的加载,获取客户端与数据库中间件集群的首次连接凭据,具体为:以Java语言编制客户端的JAR包,所述客户端是数据库中间件的客户端,并将客户端的JAR包导入应用;客户端的JAR包在应用内执行注册驱动过程中,从数据库中间件集群内任意选取一个中间件实例,并配置该中间件实例的信息为初始连接参数,所述信息作为客户端与数据库中间件集群的首次连接凭据;所述初始连接参数包含:中间件实例URL、账户、密码、IP及端口号、最大连接数、最小连接数;所述最大连接数用于限定一个客户端最多与多少个中间件实例建立连接;所述最小连接数用于限定一个客户端至少保持与多少个中间实例建立连接;若当前客户端连接中间件实例的个数超过预设的最大连接数,客户端发起的连接请求需等待;所述中间件实例的状态包含上线及下线;所述中间件实例上线,表示该中间件实例可用,客户端能通过该实例与数据库中间件集群连接;所述中间件实例下线表示中间件实例不可用,客户端不能通过该实例与数据库中间件集群连接;

步骤2:以首次连接凭据生成数据源连接对象存入客户端,具体为:客户端内创建可用数据源集合与待下线数据源集合,根据步骤1获取的初始连接参数提取中间件实例的IP和端口号,生成默认的数据源连接对象存入可用数据源集合;所述数据源连接对象与中间件实例保持一一对应关系;所述可用数据源集合,用于存储从数据库中间件集群中获得的处于在线状态的中间件实例;所述待下线数据源集合,用于存储数据库中间件集群内处于下线状态的中间件实例;

步骤3:从数据库中间件集群中获取所有在线的中间件实例:客户端从可用数据源集合中获取默认的数据源连接对象,根据数据源连接对象中的IP和端口号确定预连接的中间件实例,提取初始连接参数中URL地址,以JDBC协议访问数据库中间件集群,与数据源连接对象对应的中间件实例连接;同时请求获取当前数据库中间件集群中所有处于上线状态的中间件实例及实例信息,生成各中间件实例的连接参数,在客户端创建与实例对应的数据源连接对象,并放入客户端的可用数据源集合中;

步骤4:待步骤3的首次连接成功后,周期性地检查数据库中间件集群中的中间件实例状态,根据中间件实例状态,对客户端可用数据源集合和待下线数据源集合中的数据源连接对象重新分配;

步骤5:业务系统按照配置的负载均衡算法,获取连接中间件实例:业务系统产生数据库访问请求,触发业务系统内的数据库中间件客户端根据预设负载均衡算法选择一个数据源连接对象,解析连接参数根据连接参数请求访问数据库中间件集群中对应数据源连接对象的中间件实例;在客户端与中间件实例建立连接前,确认客户端连接未达到最大连接数,若已达到,连接请求需等待后处理。

所述步骤1中,在所述客户端与中间件实例的连接过程中,实时监控中间件客户端与中间件实例的连接情况,以客户端连接数统计当前与客户端成功建立连接的中间件实例个数;当客户端通过数据源连接对象与中间件实例连接成功时,客户端连接数加“1”;当客户端与中间件实例的连接结束时,客户端连接数减“1”。

在所述步骤1中,所述客户端的加载方法包括:对于Java项目,通过将客户端的JAR包放入指定lib目录加载,对于MAVEN项目,根据MAVEN坐标在POM文件编写加载代码加载JAR包。

在所述步骤2中,初始化FDruidDataSource类,配置生成数据源连接对象,并调用FDruidDataSource对象的getConnection()方法获取数据库中间件集群中一个可用的中间件实例连接。

所述步骤4具体包含:

步骤4-1:客户端定时地从可用数据源集合中随机选择数据连接对象,提取连接参数请求访问数据库中间件集群,获取当前数据库中间件集群中处于在线状态的中间件实例,记录中间件实例名称;

步骤4-2:根据已记录的中间件实例名称,与客户端可用数据源集合的数据源连接对象比对,筛选出指定类型的中间件实例,所述指定类型的中间件实例包含未录入可用数据源集合的在线实例,和已录入可用数据源集合的下线实例;

步骤4-3:针对未录入可用数据源集合的在线实例,获取中间件实例的信息,生成中间件实例的连接参数,基于连接参数创建数据连接对象存入可用数据源集合;针对已录入可用数据源集合的下线实例,将中间件实例对应的数据连接对象移出可用数据源集合,转入待下线数据源集合;

步骤4-4:跟踪新进入待下线数据源集合中的数据源连接对象,检查在数据库中间件客户端与中间件实例的连接中是否还存在进行中的数据请求任务;若存在,数据请求任务执行完毕后,关闭数据库中间件客户端与中间件实例的连接;若不存在,直接关闭数据库中间件客户端与中间件实例的连接。

在所述步骤5中,客户端请求连接中间件实例之前,比较客户端连接数和最大连接数的大小;当客户连接数等于最大连接数时,与中间件实例的连接需要等待至其他连接结束;当客户端连接数小于最大连接数时,向对应的中间件实例发连接请求。

在所述步骤5中的,若业务系统通过客户端连接中间件实例频繁失败,且连续次数达到预设阈值,客户端将该中间件实例对应的数据源连接对象从可用数据源集合中移出,并移入待下线数据源集合;数据库中间件客户端将再次按照配置的负载均衡算法重新分配一个新数据源连接对象给业务系统,以建立与中间件实例新的连接,请求访问数据库。

在所述步骤5中,所述客户端使用的负载均衡算法包括轮询法、随机法、加权轮询法、加权随机法、源地址哈希法、最小连接法。

所述步骤5中的负载均衡算法优选最小连接算法,获取在线的中间件实例,计算每个中间件实例与客户端的连接数,按连接数从小到大顺序获取前5个中间件实例;计算上述5个中间件实例的平均响应时间,选取平均响应时间最短的中间件实例作为优选的中间件实例;所述平均响应时间取中间件实例处理业务请求的时间均值。

本发明所达到的有益效果:

(1)本发明通过在业务应用中引入数据库中间件集群的客户端JAR包,配置监控中间件实例可用状态的可用数据源集合和待下线数据源集合,实现基于JDBC协议的数据通信,能自动处理与数据库中间件集群间的连接、负载、异常、熔断等问题,减少了在服务端配置负载均衡硬件与软件的麻烦;

(2)本发明通过周期性地将数据库中间件集群中各中间件实例与可用数据源集合内的中间件实例进行比对,及时剔除以已下线或存在异常的中间件实例,将新的或恢复上线的实例重新加入,提高数据源连接的效率,并能有效应对中间件实例下线时未完成业务请求的处理问题。

附图说明

图1为本发明实施例中基于数据库中间件集群的客户端负载均衡方法流程图;

图2为本发明实施例中基于数据库中间件集群的客户端负载均衡系统结构示意图;

图3为本发明实施例中业务系统与中间件实例连接示意图;

图4为本发明实施例中数据库中间件客户端启动及请求处理的时序示意图;

图5为本发明实施例中基于数据库中间件客户端的中间件实例维护的结构示意图。

具体实施方式

为了使本发明的目的、技术方案和优点更加清楚,下面详细介绍下客户端初始化过程以及对数据库中间件集群实例的维护以及选取。

图1为本发明实施例中基于数据库中间件集群的高可用客户端负载均衡方法流程图,具体包括:

步骤1:获取客户端与数据库中间件集群的首次连接凭据:以Java语言编制数据库中间件的客户端JAR包,并将客户端JAR包导入应用;客户端JAR包在应用内执行注册驱动过程中,从数据库中间件集群内任意选取一个中间件实例,并抽取该中间件实例信息配置为初始连接参数,作为客户端与数据库中间件集群的首次连接凭据;

所述连接参数包含中间件实例URL地址、账户、密码、IP和端口号、最大连接数、最小连接数;所述最大连接数用于限定客户端最多与多少个中间件实例建立连接;最小连接数用于限定客户端最少与多少个中间件实例维持连接;所述中间件实例的状态包含上线及下线;所述中间件实例上线,表示该中间件实例可用,客户端能通过该实例与数据库中间件集群连接;所述中间件实例下线表示中间件实例不可用,客户端不能通过该实例与数据库中间件集群连接;

在本发明实施例中,通过将客户端JAR包放入指定lib目录加载,或根据MAVEN坐标在POM文件编写如下代码加载;

步骤2:以首次连接凭据生成数据源连接对象存入客户端:客户端内创建可用数据源集合与待下线数据源集合,从步骤1的初始连接参数中提取中间件实例的IP和端口号,生成默认的数据源连接对象,并以中间件实例名称命名数据源连接对象,存入可用数据源集合;所述数据源连接对象与中间件实例保持一一对应关系;在本发明实施例中,通过初始化FDruidDataSource类,配置生成数据源连接对象,并调用FDruidDataSource对象的getConnection()方法获取拿到数据库中间件集群中一个可用的中间件实例连接。代码参考如下

FDruidDataSource druidDataSource=new FDruidDataSource();

druidDataSource.setClientName("");

druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");

druidDataSource.setUrl(“”);

druidDataSource.setUsername(“”);

druidDataSource.setPassword(“”);

druidDataSource.setInitialSize(5);

druidDataSource.setMaxWait(5000);

druidDataSource.setMaxActive(100);

druidDataSource.setValidationQuery("select 1from dual");

步骤3:从数据库中间件集群中获取所有在线的中间件实例:客户端从可用数据源集合中获取默认的数据源连接对象,根据数据源连接对象中的IP和端口号确定预连接的中间件实例,提取初始连接参数中URL地址,以JDBC协议访问数据库中间件集群,与数据源连接对象对应的中间件实例连接;监控到客户端与中间件实例连接成功,客户端连接数加“1”;同时请求获取当前数据库中间件集群中所有处于上线状态的中间件实例及实例信息,生成各中间件实例的连接参数,在客户端创建与实例对应的数据源连接对象,并放入客户端的可用数据源集合中;

步骤4:待步骤3的首次连接成功后,周期性地检查数据库中间件集群中的中间件实例状态,根据中间件实例状态,对客户端可用数据源集合和待下线数据源集合中的数据源连接对象重新分配;具体步骤为:

步骤4-1:客户端定时地从可用数据源集合中随机选择数据连接对象,提取连接参数请求访问数据库中间件集群,获取当前数据库中间件集群中处于在线状态的中间件实例,记录中间件实例名称;

步骤4-2:根据已记录的中间件实例名称,与客户端可用数据源集合的数据源连接对象比对,筛选出2类中间件实例,包含(1)未录入可用数据源集合的在线实例;(2)已录入可用数据源集合的下线实例;

步骤4-3:针对未录入可用数据源集合的在线实例,获取中间件实例的信息,按照步骤1生成中间件实例的连接参数,基于连接参数创建数据连接对象存入可用数据源集合;针对已录入可用数据源集合的下线实例,将中间件实例对应的数据连接对象移出可用数据源集合,转入待下线数据源集合;

步骤4-4:跟踪新进入待下线数据源集合中的数据源连接对象,检查在数据库中间件客户端与中间件实例的连接中是否还存在进行中的数据请求任务;若存在,数据请求任务执行完毕后,关闭数据库中间件客户端与中间件实例的连接;若不存在,直接关闭数据库中间件客户端与中间件实例的连接;待监控到客户端与中间件实例连接关闭后,客户端连接数减“1”,并从待下线数据源集合中清除所述数据源连接对象。

步骤5:应用系统利用负载均衡算法获取数据源连接对象,连接中间件实例发送业务请求,具体流程包含:

步骤5-1:应用系统产生数据库访问请求,已安装在应用系统内的数据库中间件客户端根据轮询法,按照中间件实例进入可用数据源集合的先后顺序,获取数据源连接对象中的IP和端口号;

步骤5-2:从连接参数中解析连接中间件实例的URL地址、最大连接数;检查当前的客户端连接数是否达到最大连接数,若等于最大连接数,本次连接请求进入等待队列,直至客户端连接数小于最大连接数,再请求连接中间件实例;若小于最大连接数,继续执行步骤5-3;

步骤5-3:根据URL地址访问数据库中间件集群,按照IP和端口号请求与中间件实例的连接;若连接成功,由中间件实例根据业务请求,从数据库集群中获取数据并返回至客户端;若连接失败,继续请求连接,同步统计连接失败次数;

步骤5-4:若连续请求都失败,且失败次数达到预设阈值,数据库中间件客户端将该中间件实例对应的数据源连接对象从可用数据源集合中移出,并移入待下线数据源集合;客户端继续按照中间件实例进入可用数据源集合的先后顺序,选取下一个数据源连接对象给业务系统,按照步骤5-2-步骤5-4继续发起连接数据库中间件集群的连接请求,直至请求被处理。

图2为本发明实施例中基于数据库中间件集群的高可用客户端负载均衡系统结构示意图,包含依次相连的业务系统、数据库中间件集群和数据库集群。

在业务系统中配置客户端,用于控制与数据库中间件集群内中间件实例的连接;所述业务系统通过客户端连接数据库中间件集群,所述数据库集群由不少于2个数据库组成;所述数据库中间件集群由不少于2个的中间件实例组成,每个中间件实例的状态包含上线状态及下线状态;

所述客户端内设有可用数据源集合和待下线数据源集合,所述可用数据源集合,用于存储从数据库中间件集群中获得的处于在线状态的中间件实例;所述待下线数据源集合,用于存储数据库中间件集群内处于下线状态的中间件实例;当用户在业务系统内产生数据请求时,通过调用可用数据源集合中的任一数据源连接对象,连接数据库中间件集群中对应的中间件实例。

如图3所示,用户通过客户端获得实例A数据源,连接数据库中间件集群中对应的中间件实例A;通过客户端实例C数据源,连接数据库中间件集群中对应的中间件实例C。

图4为本发明实施例中数据库集群中间件客户端启动及请求数据库集群的时序流程图,具体步骤包括:

步骤401:获取集群实例,并返回实例集合:本发明实施例以中间件实例A和中间件实例B为列,在客户端初始化时,根据配置生成默认的实例A数据源,通过JDBC协议访问数据库中间件集群中的实例A,若此时数据库中间件集群中实例A和实例B同时在线,则同时获取实例A与实例B,创建实例B数据源并放入正常数据源队列中,如图5;

步骤402:启动定时任务,维护正常数据源队列:如图5,客户端会选取一个实例的数据源连接,获取数据库中间件集群中最新的在线实例。此时有实例A、实例C在线,故客户端会维持实例A的数据源不变,将实例B的数据源移入待下线数据源队列,创建实例C的数据源并放入正常数据源队列中,如果客户端选取的实例本身存在问题已经无法正常获取信息,客户端会在失败次数达到预设值后,将该实例的数据源移入待下线数据源队列并重新选取一个新实例,再继续执行步骤402;

步骤403:启动定时任务,维护待下线数据源队列,客户端在检查实例B数据源没有请求任务后后,将实例B的数据源资源关闭并移除,如图5所示;

步骤404:业务系统根据算法获取一个中间件实例的数据源连接;本发明实施例中以中间件实例C为例,用户借助业务系统,通过客户端获取到一个可用的中间件实例C的数据源连接,与数据库中间件集群通信,如果业务系统使用该连接通信连续失败多次并达到熔断条件后,客户端会将该实例的数据源移入待下线数据源队列,并重新分配一个新的实例的数据源连接给业务系统。

步骤405:发送业务请求,从数据库集群中获取业务数据:如图5所示,客户在业务系统内产生业务请求,经客户端将业务请求发送至数据库中间件集群,并通过数据库中间件集群内的中间件实例C,访问数据库集群获取数据;数据库集群返回的数据经中间件实例C,返回至客户端。

本发明通过JDBC协议得到中间件集群的状态信息,有别于现有类似技术中的数据库集群,通过中间件获取数据库信息后直连数据库,是对中间件集群做负载、路由,由于现有技术中对该方法配置的最大连接数与最小连接数并没有最优的设置,因此根据实际机器配置、业务流量等情况,并在运行一段时间后,根据检测到的数据动态调整,最终获得了效果卓越的参数配置方案。

本发明所达到的有益效果:

(1)本发明通过在业务应用中引入数据库中间件集群的客户端JAR包,配置监控中间件实例可用状态的可用数据源集合和待下线数据源集合,实现基于JDBC协议的数据通信,能自动处理与数据库中间件集群间的连接、负载、异常、熔断等问题,减少了在服务端配置负载均衡硬件与软件的麻烦;

(2)本发明通过周期性地将数据库中间件集群中各中间件实例与可用数据源集合内的中间件实例进行比对,及时剔除以已下线或存在异常的中间件实例,将新的或恢复上线的实例重新加入,提高数据源连接的效率,并能有效应对中间件实例下线时未完成业务请求的处理问题。

以上实施例不以任何方式限定本发明,凡是对以上实施例以等效变换方式做出的其它改进与应用,都属于本发明的保护范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号