本发明涉及数据库负载均衡的技术领域,更具体地说是指用于实现数据库读写负载均衡的方法及其系统。
背景技术:
一般情况下,业界部署数据库的时候都会对做一主多从备份或者多节点共享存储,以保证数据安全。但是,用于数据库备份的从节点不对应用提供服务,白白浪费了数据库资源,通过读写分离功能,能够将数据库的从节点暴露给应用系统,一是能提高数据库的利用率,再是可以提升应用系统访问数据库的性能。
采用读写分离要求应用系统进行改造,需要应用系统能够链接到集群内的所有节点,并且要求能区分读写sql类型和数据库集群内主从节点状态,这导致应用开发与数据库偶合,增加了应用开发难度,同时数据库主从节点故障切换及动态扩缩节点难度大大提升,需要应用感知并且需要协调多个应用同步操作。
中国专利cn201110457793.6公开了一种数据读写分离机制的实现方法和装置。在读操作的sql访问请求中设置hint信息,该hint信息指示读写分离策略,包括对接收到的sql访问请求进行解析,判断当前的操作类型;若当前的操作类型为写操作,建立与主数据库的连接,向主数据库中写入数据;若当前的操作类型为读操作,根据sql访问请求中的hint信息获取当前的读写分离策略,并获取从数据库相对于主数据库的同步延时信息,以及,根据当前的读写分离策略和同步延时信息执行读操作。上述的方案能够在从库出现延时的情况下读取到所需的可信任数据,且较好地兼容了现有的系统资源,提高了资源的利用率。
上述的专利解决数据库集群内主从节点读写分离代理访问的问题,该方法仍需要应用改造sql,并且设置时延要求,未能解决应用与数据库偶合的问题;同时缺乏根据节点中间件性能进行权重控制,及未解决会话事务控制问题。
因此,有必要设计一种用于实现数据库读写均衡方法,实现极大简化应用系统开发难度,通过读写负载提升数据库的访问能力,支持根据节点权重进行负载均衡以及支持数据库集群动态增删节点,实现及时会话事务控制问题。
技术实现要素:
本发明的目的在于克服现有技术的缺陷,提供用于实现数据库读写负载均衡的方法及其系统。
为实现上述目的,本发明采用以下技术方案:用于实现数据库读写负载均衡的方法,所述方法包括:
获取mysql报文;
对所述mysql报文进行解析,获取具体的sql语句;
判断sql语句是否携带hint信息;
若sql语句携带hint信息,则对sql语句的平衡值的判断,获取sql语句的读写属性,并进入最后一步骤;
若sql语句不携带hint信息,则解析sql逻辑,根据解析的结果获取sql语句的读写属性,并进入最后一步骤;
当读写属性为读时,根据从节点的权重读取数据,当读写属性为写时,向写节点写入数据。
其进一步技术方案为:若sql语句携带hint信息,则根据sql语句内的控制语句进行读写分配的步骤,包括以下具体步骤:
获取sql语句内的平衡值;
根据所述平衡值判断所述sql语句是否发往数据库写节点;
若是发往数据库写节点,则sql语句的属性为写属性;
若不是发往数据库写节点,则sql语句的属性为读属性。
其进一步技术方案为:若sql语句不携带hint信息,则解析sql逻辑,根据解析的结果获取sql语句的读写属性的步骤,包括以下具体步骤:
获取sql语句的sql文本;
解析所述sql文本,判断所述sql文本是否是读语句;
若是读语句,则发往数据库读节点,sql语句的读写属性为读属性;
若不是读语句,则发往数据库写节点,sql语句的读写属性为写属性。
其进一步技术方案为:当读写属性为读时,根据从节点的权重读取数据的步骤,包括以下具体步骤:
获取各从节点的权重比例;
根据所述权重比例,获取从节点链接;
向所述从节点查询数据,并反馈查询的结果。
其进一步技术方案为:当读写属性为写时,向写节点写入数据的步骤,包括以下具体步骤:
根据会话情况获取写节点链接;
向所述写节点写入数据,并返回结果。
其进一步技术方案为:所述方法还包括:
主从节点关系发生变化,由已完成同步的从节点提升为主节点;
通过sql语句检测到数据库状态的变化后,重新初始化后端的链接。
其进一步技术方案为:所述方法还包括:
从节点数量发生变化时,通过sql语句检测从节点的数量以及从节点的链接信息,重新初始化后端从节点的链接。
本发明还提供了用于实现数据库读写负载均衡的系统,包括获取单元、解析获取单元、判断单元、hint处理单元、sql逻辑解析单元以及读写处理单元;
所述获取单元,用于获取mysql报文;
所述解析获取单元,用于对所述mysql报文进行解析,获取具体的sql语句;
所述判断单元,用于判断sql语句是否携带hint信息;
所述hint处理单元,用于若sql语句携带hint信息,则对sql语句的平衡值的判断,获取sql语句的读写属性;
所述sql逻辑解析单元,用于若sql语句不携带hint信息,则解析sql逻辑,根据解析的结果获取sql语句的读写属性;
所述读写处理单元,用于当读写属性为读时,根据从节点的权重读取数据,当读写属性为写时,向写节点写入数据。
其进一步技术方案为:所述hint处理单元更包括平衡值获取模块以及平衡值判断模块;
所述平衡值获取模块,用于获取sql语句内的平衡值;
所述平衡值判断模块,用于根据所述平衡值判断所述sql语句是否发往数据库写节点;若是发往数据库写节点,则sql语句的属性为写属性;若不是发往数据库写节点,则sql语句的属性为读属性。
其进一步技术方案为:所述sql逻辑解析单元包括文本获取模块以及解析文本模块;
所述文本获取模块,用于获取sql语句的sql文本;
所述解析文本模块,用于解析所述sql文本,判断所述sql文本是否是读语句;若是读语句,则发往数据库读节点,sql语句的读写属性为读属性;若不是读语句,则发往数据库写节点,sql语句的读写属性为写属性。
本发明与现有技术相比的有益效果是:本发明的用于实现数据库读写负载均衡的方法,通过对mysql报文解析获取sql语句,对sql语句进行判断,根据判断结果进行读写分配,读取数据时,按照权重比例读取数据,达到数据库读写负载均衡的效果,应用无需关系数据库读写节点地址和端口,实现极大简化应用系统开发难度,通过读写负载提升数据库的访问能力,支持根据节点权重进行负载均衡以及支持数据库集群动态增删节点,实现及时会话事务控制问题。
下面结合附图和具体实施例对本发明作进一步描述。
附图说明
图1为本发明具体实施例提供的用于实现数据库读写负载均衡的方法的流程图;
图2为本发明具体实施例提供的根据sql语句内的控制语句进行读写分配的具体流程图;
图3为本发明具体实施例提供的解析sql逻辑并根据解析的结果获取sql语句的读写属性的具体流程图;
图4为本发明具体实施例提供的当读写属性为读时根据从节点的权重读取数据的具体流程图;
图5为本发明具体实施例提供的当读写属性为写时向写节点写入数据的具体流程图;
图6为本发明具体实施例提供的用于实现数据库读写负载均衡的系统的结构框图;
图7为本发明具体实施例提供的hint处理单元的结构框图;
图8为本发明具体实施例提供的sql逻辑解析单元的结构框图;
图9为本发明具体实施例提供的读写处理单元的结构框图。
具体实施方式
为了更充分理解本发明的技术内容,下面结合具体实施例对本发明的技术方案进一步介绍和说明,但不局限于此。
如图1~9所示的具体实施例,本实施例提供的用于实现数据库读写负载均衡的方法,可以运用在数据库的写入数据或者查询读取数据的过程中,实现极大简化应用系统开发难度,通过读写负载提升数据库的访问能力,支持根据节点权重进行负载均衡以及支持数据库集群动态增删节点,实现及时会话事务控制问题。
本方法具体是基于nio实现数据库读写负载均衡,nio是newio的简称,在jdk1.4里提供的新api。sun官方标榜的特性如下:为所有的原始类型提供(buffer)缓存支持。字符集编码解码解决方案。channel:一个新的原始i/o抽象。支持锁和内存映射文件的文件访问接口。提供多路(non-bloking)非阻塞式的高伸缩性网络i/o。
如图1所示,是本实施例提供的用于实现数据库读写负载均衡的方法,该方法包括:
s1、获取mysql报文;
s2、对所述mysql报文进行解析,获取具体的sql语句;
s3、判断sql语句是否携带hint信息;
s4、若sql语句携带hint信息,则对sql语句的平衡值的判断,获取sql语句的读写属性,并进入s6步骤;
s5、若sql语句不携带hint信息,则解析sql逻辑,根据解析的结果获取sql语句的读写属性,并进入s6步骤;
s6、当读写属性为读时,根据从节点的权重读取数据,当读写属性为写时,向写节点写入数据。
上述的用于实现数据库读写负载均衡的方法可以支持应用透明读写分离和应用级读写分离方案,可根据业务需要灵活调整,有效提高读写性能,支持数据库集群动态增删节点。
其中,应用透明读写负载:在数据库代理层上设置读写负载策略,默认无事务写sql在写节点执行,读sql在读节点执行;事务内读写sql都在写节点执行。
应用级读写负载:由应用在编写的sql语句前面加上hint信息,/*!hint({"balance":"w"})*/sql表示该语句发往写节点;/*!hint({"balance":"r"})*/sql表示该语句发往读节点;若sql前面有hint信息,则由hint内容控制读写负载策略,忽略应用透明读写负载的策略。
对于s1步骤,具体是获取mysql的二进制流报文。
更进一步的,对于s2步骤,具体是代理层获取mysql报文后,根据mysql规定的报文协议进行解析,获取具体的sql语句。
s3步骤,判断sql语句是否携带hint信息,主要是为了区分应用透明读写分离和应用级读写分离方案,根据不同的方案进行读写分离,另外,此过程应用无需关心数据库读写节点地址和端口,极大简化应用系统开发难度,同时通过读写负载提升数据库的访问能力。
对于s4步骤,若sql语句携带hint信息,则根据sql语句内的控制语句进行读写分配的步骤,包括以下具体步骤:
s41、获取sql语句内的平衡值;
s42、根据所述平衡值判断所述sql语句是否发往数据库写节点;
s43、若是发往数据库写节点,则sql语句的属性为写属性;
s44、若不是发往数据库写节点,则sql语句的属性为读属性。
上述的s41步骤,当sql语句携带hint信息,则该负载为应用级读写负载:sql语句为/*!hint({"balance":"w"})*/sql,或者/*!hint({"balance":"r"})*/sql,获取上述sql语句的balance值。
上述的s42步骤,当sql语句为/*!hint({"balance":"w"})*/sql,表示该语句发往写节点;sql语句为/*!hint({"balance":"r"})*/sql表示该语句发往读节点。
对于s5步骤,若sql语句不携带hint信息,则解析sql逻辑,根据解析的结果获取sql语句的读写属性的步骤,包括以下具体步骤:
s51、获取sql语句的sql文本;
s52、解析所述sql文本,判断所述sql文本是否是读语句;
s53、若是读语句,则发往数据库读节点,sql语句的读写属性为读属性;
s54、若不是读语句,则发往数据库写节点,sql语句的读写属性为写属性。
对于上述的s51步骤至s54步骤,数据库代理层上设置读写负载策略,默认无事务写sql语句在写节点执行,读sql语句在读节点执行;事务内读写sql语句都在写节点执行。
对于s6步骤中的当读写属性为读时,根据从节点的权重读取数据的步骤,包括以下具体步骤:
s61、获取各从节点的权重比例;
s62、根据所述权重比例,获取从节点链接;
s63、向所述从节点查询数据,并反馈查询的结果。
对于s61步骤,mysql数据库在部署的时候一般会采用一主多从的部署模式,通过为每个从节点配置权重,可以为读写分离的读语句提供负载均衡,例如一组数据库集群有一主三从,为三个从节点分别配置负载均衡权重为100、200、300。
s62步骤,具体的,代理层获取到从节点权重信息后,每次需要执行查询语句时会根据权重比例:100:200:300的情况随机获取一个从节点链接,并执行具体的语句。
对于s6步骤中的当读写属性为写时,向写节点写入数据的步骤,包括以下具体步骤:
s64、根据会话情况获取写节点链接;
s65、向所述写节点写入数据,并返回结果。
由于写入数据时只有一个节点,因此,无需权重控制,减少写入数据的时间,提高写入的速率。
更进一步的,上述的用于实现数据库读写负载均衡的方法还包括:
主从节点关系发生变化,由已完成同步的从节点提升为主节点;
通过sql语句检测到数据库状态的变化后,重新初始化后端的链接。
另外,上述的用于实现数据库读写负载均衡的方法还包括:从节点数量发生变化时,通过sql语句检测从节点的数量以及从节点的链接信息,重新初始化后端从节点的链接。
上述的主从节点关系发生变化的步骤以及从节点数量发生变化的步骤均可以单独使用,作为支持数据库集群动态增删节点的方法。
上述的用于实现数据库读写负载均衡的方法,通过对mysql报文解析获取sql语句,对sql语句进行判断,根据判断结果进行读写分配,读取数据时,按照权重比例读取数据,达到数据库读写负载均衡的效果,应用无需关系数据库读写节点地址和端口,实现极大简化应用系统开发难度,通过读写负载提升数据库的访问能力,支持根据节点权重进行负载均衡以及支持数据库集群动态增删节点,实现及时会话事务控制问题。
如图6所示,本实施例还提供了用于实现数据库读写负载均衡的系统,包括获取单元10、解析获取单元20、判断单元30、hint处理单元40、sql逻辑解析单元50以及读写处理单元60。
获取单元10,用于获取mysql报文。
解析获取单元20,用于对所述mysql报文进行解析,获取具体的sql语句。
判断单元30,用于判断sql语句是否携带hint信息。
hint处理单元40,用于若sql语句携带hint信息,则对sql语句的平衡值的判断,获取sql语句的读写属性。
sql逻辑解析单元50,用于若sql语句不携带hint信息,则解析sql逻辑,根据解析的结果获取sql语句的读写属性。
读写处理单元60,用于当读写属性为读时,根据从节点的权重读取数据,当读写属性为写时,向写节点写入数据。
上述的系统可以支持应用透明读写分离和应用级读写分离方案,可根据业务需要灵活调整,有效提高读写性能,支持数据库集群动态增删节点。
其中,应用透明读写负载:在数据库代理层上设置读写负载策略,默认无事务写sql在写节点执行,读sql在读节点执行;事务内读写sql都在写节点执行。
应用级读写负载:由应用在编写的sql语句前面加上hint信息,/*!hint({"balance":"w"})*/sql表示该语句发往写节点;/*!hint({"balance":"r"})*/sql表示该语句发往读节点;若sql前面有hint信息,则由hint内容控制读写负载策略,忽略应用透明读写负载的策略。
对于获取单元10,具体是获取mysql的二进制流报文。
对于解析获取单元20,具体是代理层获取mysql报文后,根据mysql规定的报文协议进行解析,获取具体的sql语句。
判断单元30主要是为了区分应用透明读写分离和应用级读写分离方案,根据不同的方案进行读写分离,另外,此过程应用无需关心数据库读写节点地址和端口,极大简化应用系统开发难度,同时通过读写负载提升数据库的访问能力。
上述的hint处理单元40更包括平衡值获取模块41以及平衡值判断模块42。
平衡值获取模块41,用于获取sql语句内的平衡值。
平衡值判断模块42,用于根据所述平衡值判断所述sql语句是否发往数据库写节点;若是发往数据库写节点,则sql语句的属性为写属性;若不是发往数据库写节点,则sql语句的属性为读属性。
当sql语句携带hint信息,则该负载为应用级读写负载:sql语句为/*!hint({"balance":"w"})*/sql,或者/*!hint({"balance":"r"})*/sql,平衡值获取模块41获取上述sql语句的balance值。
平衡值判断模块42判断的结果如下:
当sql语句为/*!hint({"balance":"w"})*/sql,表示该语句发往写节点;sql语句为/*!hint({"balance":"r"})*/sql表示该语句发往读节点。
更进一步的,sql逻辑解析单元50包括文本获取模块51以及解析文本模块52。
文本获取模块51,用于获取sql语句的sql文本。
解析文本模块52,用于解析所述sql文本,判断所述sql文本是否是读语句;若是读语句,则发往数据库读节点,sql语句的读写属性为读属性;若不是读语句,则发往数据库写节点,sql语句的读写属性为写属性。
上述的文本获取模块51以及解析文本模块52,数据库代理层上设置读写负载策略,默认无事务写sql语句在写节点执行,读sql语句在读节点执行;事务内读写sql语句都在写节点执行。
另外,上述的读写处理单元60包括获取权重模块61、从节点链接获取模块62、读取模块63、写节点链接获取模块64以及写入模块65。
获取权重模块61,用于获取各从节点的权重比例。
从节点链接获取模块62,用于根据所述权重比例,获取从节点链接。
读取模块63,用于向所述从节点查询数据,并反馈查询的结果。
写节点链接获取模块64,用于根据会话情况获取写节点链接。
写入模块65,用于向所述写节点写入数据,并返回结果。
对于获取权重模块61,mysql数据库在部署的时候一般会采用一主多从的部署模式,通过为每个从节点配置权重,可以为读写分离的读语句提供负载均衡,例如一组数据库集群有一主三从,为三个从节点分别配置负载均衡权重为100、200、300。
对于从节点链接获取模块62而言,具体的,代理层获取到从节点权重信息后,每次需要执行查询语句时会根据权重比例:100:200:300的情况随机获取一个从节点链接,并执行具体的语句。
由于写入数据时只有一个节点,因此,写节点链接获取模块64无需权重控制,减少写入数据的时间,提高写入的速率。
更进一步的,上述的用于实现数据库读写负载均衡的系统还包括:从节点提升单元70以及初始化单元80。
从节点提升单元70,用于主从节点关系发生变化,由已完成同步的从节点提升为主节点。
初始化单元80,用于通过sql语句检测到数据库状态的变化后,重新初始化后端的链接。
另外,上述的用于实现数据库读写负载均衡的系统还包括检测重置单元90。
检测重置单元90,用于从节点数量发生变化时,通过sql语句检测从节点的数量以及从节点的链接信息,重新初始化后端从节点的链接。
上述的从节点提升单元70、初始化单元80以及检测重置单元90均可以单独使用,作为支持数据库集群动态增删节点的方法。
上述的用于实现数据库读写负载均衡的系统,通过获取单元10对mysql报文解析获取sql语句,判断单元30对sql语句进行判断,根据判断结果进行读写分配,读取数据时,按照权重比例读取数据,达到数据库读写负载均衡的效果,应用无需关系数据库读写节点地址和端口,实现极大简化应用系统开发难度,通过读写负载提升数据库的访问能力,支持根据节点权重进行负载均衡以及支持数据库集群动态增删节点,实现及时会话事务控制问题。
上述仅以实施例来进一步说明本发明的技术内容,以便于读者更容易理解,但不代表本发明的实施方式仅限于此,任何依本发明所做的技术延伸或再创造,均受本发明的保护。本发明的保护范围以权利要求书为准。