一种对数据库集群进行读写分离的方法与流程

文档序号:29084416发布日期:2022-03-02 00:59阅读:142来源:国知局
一种对数据库集群进行读写分离的方法与流程

1.本发明涉及计算机技术领域,特别是涉及一种对数据库集群进行读写分离的方法。


背景技术:

2.为了保证数据库集群数据的安全,在生产环境中往往使用一主多备的集群环境,所采用工作方式为客户端所有的读写操作均发往主节点,而在主节点数据发生变化时,备节点数据也跟着发生相应的变化,使得主和备节点的数据信息同步,从而达到主备同步的目的。为了进一步分担主节点的压力,提高备节点的利用率,于是便有人通过读写分离提出给备节点增加查询数据功能。但是现有的读写分离方案对于事务中和前序事务都没修改过的对象的查询还是有可能被分配到备机执行,这就会导致长事务中写语句后续大量的查询语句未能分派到备机,最终影响了集群数据处理的效率。


技术实现要素:

3.本发明提供了一种对数据库集群进行读写分离的方法,以解决现有技术中读写分离方案不能对sql语句进行准确路由的问题。
4.本发明提供了一种对数据库集群进行读写分离的方法,该方法包括:判断当前的sql语句是否同时发往主节点和备节点,如果是,则将所述sql语句发往主节点和备节点,如果不是,则进一步判断所述sql语句是读类型的sql语句还是写类型的sql语句;
5.对写类型的sql语句,判断该sql语句对后续的sql语句是否有影响,并将对后续sql语句有影响的sql语句记录到事务读写分流器或会话读写分流器;
6.根据所述事务读写分流器和所述会话读写分流器判断所有读语句的sql语句应发往的主节点或备节点;
7.其中,所述事务读写分流器,在开启一个事务后进行创建,以存储该事务中的写语句的预设对象,在事务结束当后,销毁该事务读写分流器;所述会话读写分流器,在建立一个会话连接时进行创建,用于存储当前会话且只在主节点使用的预设对象,并在会话结束连接后,销毁该会话读写分流器。
8.可选地,所述判断当前的sql语句是否同时发往主节点和备节点之前,所述方法还包括:
9.判断当前所处的事务状态,如果处于事务中,则设置事务标记,如果是处于非事务中,则设置非事务标记。
10.可选地,所述判断该sql语句对后续的sql语句是否有影响,并将对后续sql语句有影响的sql语句中的对象记录到事务读写分流器或会话读写分流器,包括:
11.对事务中的预设对象,记录所述预设对象到所述事务读写分流器,并标记路由到主节点,如果是非事务则仅记入缓存中。
12.对临时的预设对象,记录其到所述会话读写分流器中,并标记路由到主节点。
13.可选地,所述判断该sql语句对后续的sql语句是否有影响,并将对后续sql语句有影响的sql语句中的对象记录到事务读写分流器或会话读写分流器,包括:
14.对携带有事务标识的写类型的sql语句,且该sql语句对后续读语句无影响则只标记sql路由到主节点;
15.对携带有事务标识的写类型的sql语句,且该sql语句影响范围不确定,则标记当前sql语句和事务中后续所有sql语句皆发往主节点,直到事务结束;
16.对携带有事务标识的写类型的sql语句,且能够识别sql语句中的所有对象,则记录所识别出的对象以及它相关联的对象到对应的事务读写分流器中,并标记将该sql语句路由到主节点。
17.可选地,所述方法还包括:对于预设对象的修改存在间接的相互影响关系的sql语句,则对存在影响关系的sql语句进行记录,以此为间接被影响的sql语句提供发往主备节点依据。
18.可选地,所述方法还包括:在sql语句修改表后,基于主节点数据库和备节点数据之间的数据延迟采用时延处理机制对后续所有会话中sql语句进行处理。
19.可选地,当sql语句发往备节点时,进入时延处理机制模式,即通过检查sql中的对象是否在时延名单中,如果存在,则该sql发往主节点,如果不在,则发往备节点。
20.可选地,所述时延处理机制中的时延时间为从数据库获取流复制延迟时间加上配置文件的流复制延迟时间。
21.可选地,对非事务模式下的创建用户、继承表、视图、触发器等与其它对象有关联的sql语句执行成功后,则将其对象存储到对应的文件中,失败则直接清空缓存;
22.对事务模式下的事务整体执行成功后,将缓存中的对象存储到对应的文件中,事务失败或者回滚则清空缓存。
23.可选地,所述预设对象包括表、视图和触发器。
24.本发明有益效果如下:
25.本发明通过在数据库集群与客户端之间设置中间件,通过该中间件来对所有的sql语句进行非常细致的读写分离的逻辑处理,从而能够最大限度的准确地将客户端发送的sql语句分发到主备节点,进而极大地提高了数据库集群的整体效率。
26.上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
27.通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
28.图1是本发明实施例提供的一种对数据库集群进行读写分离的方法的流程示意图;
29.图2是本发明实施例提供的一种对数据库集群进行读写分离的结构图;
30.图3是本发明实施例提供的一种判断事务和非事务的流程示意图;
31.图4是本发明实施例提供的对事务和非事务模式的读且分离处理方法的流程示意图;
32.图5是本发明实施例提供的读写分离处理完成后的流程示意图。
具体实施方式
33.本发明实施例针对现有读写分离并不能对sql语句进行准确路由的问题,本发明通过在数据库集群与客户端之间设置中间件,通过该中间件来对所有的sql语句进行非常细致的读写分离的逻辑处理,从而能够最大限度的准确地将客户端发送的sql语句分发到主备节点,进而极大地提高了数据库集群的整体效率。以下结合附图以及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不限定本发明。
34.针对目前通常的读写分离处理逻辑是将sql分为事务和非事务两种场景进行分别处理:当会话处于非事务中时,将读语句发往备,写语句发往主,同时当遇到临时视图、临时表等情况时,后续该会话中所有语句皆发往主;当在事务中时,将读类型的sql发往备节点,直到遇到写类型的sql后,后续所有sql语句皆发往主,以此保证数据的准确性。
35.而这种方案中对于事务中和前序事务都没修改过的对象的查询,其实还是可以分配到备机执行,但现有方案机械的导致长事务中写语句后大量的查询语句未能分派到备机,而这也会降低数据库集群的整体效率。
36.也就是说,在读写分离过程中需要考虑普通的读写分离,即写sql发往主,读sql发往备,其次需要考虑临时表、临时视图、临时域等相关的sql只能发往主节点,同时还要考虑事务中写语句对于该语句之后的sql的影响,并考虑事务中一个表的修改对其它表或者视图的影响,从而考虑一个表被修改后,其影响的所有表和视图皆应该发往主节点,在当对一个表作出修改时,这张表可能会造成其他相关联的表被修改,最终导致查询出错。
37.基于上述考虑,本发明实施例提供了一种对数据库集群进行读写分离的方法,参见图1,该方法包括:
38.s101、判断当前的sql语句是否同时发往主节点和备节点,如果是,则进入s102,如果不是,则进入s103;
39.s102、将所述sql语句发往主节点和备节点;
40.s103、判断所述sql语句是读类型的sql语句还是写类型的sql语句;
41.s104、对写类型的sql语句,判断该sql语句对后续的sql语句是否有影响,并将对后续sql语句有影响的sql语句记录到事务读写分流器或会话读写分流器;
42.s105、根据所述事务读写分流器和所述会话读写分流器判断所有读语句的sql语句应发往的主节点或备节点;
43.其中,本发明实施例中所述事务读写分流器,在开启一个事务后进行创建,以存储该事务中的写语句的预设对象,在事务结束当后,销毁该事务读写分流器;所述会话读写分流器,在建立一个会话连接时进行创建,用于存储当前会话且只在主节点使用的预设对象,并在会话结束连接后,销毁该会话读写分流器。
44.如图2可知,本发明实施例是在数据库集群与客户端之间设置中间件,通过该中间件来对所有的sql语句进行非常细致的读写分离的逻辑处理,从而能够最大限度的准确地
将客户端发送的sql语句分发到主备节点,进而极大地提高了数据库集群的整体效率。
45.具体实施时,本发明实施例在步骤s101之前,所述还包括:判断当前所处的事务状态,如果处于事务中,则设置事务标记,如果是处于非事务中,则设置非事务标记。详细过程具体如图3所示。
46.本发明通过设置事务标记和非事务标记,以在后续对sql语句进行解析使用。
47.也就是说,如对于postgres数据库集群,部分语句如部分set语句、事务控制语句是需要同时发往主备数据库节点。如果仅仅只区分读或者写,容易造成主备数据库某些设置不一致等问题。而本发明实施例对于sql语句并不是简单的区分为select语句和非select语句,而是将每条sql语句解析完毕,参考sql本身的读写属性以及事务读写分流器和会话读写分流器进行具体的读写分离判断。所以本发明能够准确地将客户端发送的sql语句分发到主备节点,最终大大提升了用户体验。
48.具体实施时,本发明实施例所述步骤s104具体包括:
49.对事务中的预设对象,记录所述预设对象到所述事务读写分流器,并标记路由到主节点,如果是非事务则仅记入缓存中,而对临时的预设对象,记录其到所述会话读写分流器中,并标记路由到主节点。
50.需要说明的是,本发明实施例所述的预设对象是表、视图和触发器等等,具体本领域技术人员可以根据实际需要进行设定,本发明对此不作具体限定。
51.本发明实施例对于读写分离,首先是对每条sql进行解析,并判断当前sql本身的读写属性。然后再根据实际情况如事务、非事务、会话读写分流器、事务读写分流器等步骤进行进一步读写判断。
52.具体来说,本发明实施例对携带有事务标识的写类型的sql语句,且该sql语句对后续读语句无影响则只标记sql路由到主节点;对携带有事务标识的写类型的sql语句,且该sql语句影响范围不确定,则标记当前sql语句和事务中后续所有sql语句皆发往主节点,直到事务结束;对携带有事务标识的写类型的sql语句,且能够识别sql语句中的所有对象,则记录所识别出的对象以及它相关联的对象到对应的事务读写分流器中,并标记将该sql语句路由到主节点。
53.如图4所示,在具体实施时,本发明实施例是首先判断当前sql是否应该同时发往主备节点(如部分set类型sql、事务控制语句需要发往主备节点)。如果是,则直接将sql同时发送至主、备节点;
54.如果判断为读语句,且当前处于事务中,则需要判断事务读写分流器和会话读写分流器是否存在该sql的对象,如果存在则标记发往主节点,否则发往备节点。
55.如果判断为写语句,则需要执行以下的处理:
56.如果是继承表、视图、触发器等且处于事务中,则记录其对象至事务读写分流器,并标记路由到主节点;如果是非事务中则只记录到缓存中;
57.如果是创建临时表、临时视图等则记录其对象到会话读写分流器中,并标记路由到主节点;
58.事务中如果为写语句,且对后续读语句无影响则只标记sql路由到主节点;
59.事务中如果为写语句,且影响范围暂时不确定,则标记当前sql和事务中后续所有sql皆发往主节点,直到事务结束;
60.事务中如果为写语句,且可以识别sql中的所有对象,需要记录对象以及它相关联的对象(表、视图等)到事务读写分流器中,并标记sql路由到主节点。
61.可见,本发明分析并记录事务中的写sql修改的相关表、视图等对象信息,同时可以判断出该对象影响的继承表、视图和通过触发器影响的对象等,并将对象存储于事务读写分流器,为后续sql提供读写依据。
62.本发明实施例所述方法还包括:对于预设对象的修改存在间接的相互影响关系的sql语句,则对存在影响关系的sql语句进行记录,以此为间接被影响的sql语句提供发往主备节点依据。
63.具体来说,本发明实施例对于表的修改存在间接的相互影响关系,如继承表、视图、触发器等对象,需要记录其相互间的依赖关系。以此为间接被影响的sql语句提供发往主备节点依据。
64.对于继承表,本发明实施例在启动时获取到所有继承表相互间的关系,并且以key:value的数据结构保存下来,当解析出某sql是修改表值时,即可从继承表的数据结构中查到被间接修改的表。当通过中间件创建继承表时,则解析出子表与父表(包括父表依赖的父表)关系并保存。
65.对于视图、触发器,针对同样视图与触发器采用与继承表类似的处理方式,以key:value格式保存视图、触发器与表的依赖关系。当有表被修改时,可以及时从该依赖关系中检索到被影响的视图、表,从而为精确判断后续被影响的sql语句提供依据。
66.由于数据库主备之间存在及短时间的数据延迟。在此短时间内,在备节点查询信息,可能会查询到一个错误的结果,因此本发明采用时延处理机制对sql主备进行判断。
67.本发明实施例所述方法还包括:在sql语句修改表后,基于主节点数据库和备节点数据之间的数据延迟采用时延处理机制对后续所有会话中sql语句进行处理。其中,所述时延处理机制中的时延时间为从数据库获取流复制延迟时间加上配置文件的流复制延迟时间。
68.当sql语句发往备节点时,进入时延处理机制模式,即通过检查sql中的对象是否在时延名单中,如果存在,则该sql发往主节点,如果不在,则发往备节点。
69.具体来说,本发明实施例的时延处理机制包括:
70.启动时从配置文件获取最小流复制延迟时间,并定时从数据库获取流复制延迟时间。
71.计算流复制延迟时间为从数据库获取的流复制延迟时间加上配置文件时间。
72.当sql发往备节点时,进入时延处理机制模式,即通过检查sql对象是否在时延名单中,如果存在,则该sql发往主节点,如果不在,则发往备节点。
73.本发明通过采用时延处理机制处理主备间流复制导致数据短时间不一致的问题,在一定程度上进一步提升了用户体验。
74.如图5所示,在具体实施时,本发明实施例对非事务模式下的创建用户、继承表、视图、触发器等与其它对象有关联的sql语句执行成功后,则将其对象存储到对应的文件中,失败则直接清空缓存;对事务模式下的事务整体执行成功后,将缓存中的对象存储到对应的文件中,事务失败或者回滚则清空缓存。
75.总体来说,本发明通过设置事务读写分流器和会话读写分流器来具体判断sql发
往主或备节点,对于短时间内主备间数据不一致性问题,采用时延机制进行处理,判断并记录创建临时表、临时视图、临时域等,同时分析并记录事务中的写sql修改的相关表、视图等对象信息,同时可以判断出该对象影响的继承表、视图和通过触发器影响的对象等,并将对象存储于事务读写分流器,为后续sql提供读写依据,通过上述处理能够最大限度的准确地将客户端发送的sql语句分发到主备节点,进而极大地提高了数据库集群的整体效率。
76.下面将结合图3-图5通过一个具体的例子来对本发明所述的方法进行详细的解释和说明:
77.本发明实施例中读写分离所要解决的问题是:在读写分离过程中需要考虑普通的读写分离,即dml类型语句需要让写类型语句发往主,读类型语句发往备,其它ddl类型语句、事务控制语句等需要根据实际情况判断其发往主或者是备节点甚至是主、备同时发送;考虑无论是否在事务中,都需要对每条sql语句进行解析和处理,不能简单将sql区分为select和非select语句处理。因为部分sql是需要所有节点同时发送的;由于主备一致性问题可能导致查询数据出错,需要考虑每条sql对其它会话造成的影响;其次需要考虑临时表、临时视图、临时域等相关的sql只能发往主节点;考虑在事务中使用ddl语句、事务控制语句、写语句对于事务中该语句之后的sql的影响;考虑事务中一个表的修改对其它表或者视图的影响,从而考虑一个表被修改后,其影响的所有表和视图皆应该发往主节点;当对一个表作出修改时,这张表可能会造成其他相关联的表被修改,导致查询出错。
78.为解决上述问题中至少一种问题,本发明所采用的方案是:
79.步骤一:判断当前所处的事务状态,如果处于事务中,则设置事务标记,则走事务处理模式;非事务中则设置非事务标记,进入非事务处理模式,具体如图3所示;
80.步骤二:对于读写分离,需要首先对每条sql进行解析,并判断当前sql本身的读写属性,然后再根据实际情况如事务、非事务、会话读写分流器、事务读写分流器等步骤进行进一步读写判断,具体如图4所示;
81.先判断当前sql是否应该同时发往主备节点(如部分set类型sql、事务控制语句需要发往主备节点)。如果是,则直接将sql同时发送至主、备节点;
82.如果判断为读语句,且当前处于事务中,则需要判断事务读写分流器和会话读写分流器是否存在该sql的对象,如果存在则标记发往主节点,否则发往备节点;
83.如果判断为写语句,则需要进行以下步骤的详细处理;
84.如果是继承表、视图、触发器等且处于事务中,则记录其对象至事务读写分流器,并标记路由到主节点;如果是非事务中则只计入缓存中;
85.如果是创建临时表、临时视图等则记录其对象到会话读写分流器中,并标记路由到主节点;
86.事务中如果为写语句,且对后续读语句无影响则只标记sql路由到主节点;
87.事务中如果为写语句,且影响范围暂时不确定,则标记当前sql和事务中后续所有sql皆发往主节点,直到事务结束;
88.事务中如果为写语句,且可以识别sql中的所有对象,需要记录对象以及它相关联的对象(表、视图等)到事务读写分流器中,并标记sql路由到主节点;
89.步骤三:对于表的修改存在间接的相互影响关系,如继承表、视图、触发器等对象,我们需要记录其相互间的依赖关系。以此为间接被影响的sql语句提供发往主备节点依据。
90.继承表:在启动时获取到所有继承表相互间的关系,并且以key:value的数据结构保存下来,当解析出某sql是修改表值时,即可从继承表的数据结构中查到被间接修改的表。当通过中间件创建继承表时,则解析出子表与父表(包括父表依赖的父表)关系并保存。
91.视图、触发器:同样视图与触发器采用与继承表类似的处理方式,以key:value格式保存视图、触发器与表的依赖关系。当有表被修改时,可以及时从该依赖关系中检索到被影响的视图、表,从而为精确判断后续被影响的sql语句提供依据。
92.步骤四:采用时延机制处理在sql修改表后,对一定时间内后续所有会话中sql语句的影响;
93.由于数据库主备之间存在及短时间的数据延迟。在此短时间内,在备节点查询信息,可能会查询到一个错误的结果,因此需要采用时延处理机制对sql主备进行判断。
94.时延处理机制:启动时从配置文件获取最小流复制延迟时间,并定时从数据库获取流复制延迟时间。计算流复制延迟时间为从数据库获取的流复制延迟时间加上配置文件时间。
95.当sql发往备节点时,进入时延处理机制模式,即通过检查sql对象是否在时延名单中,如果存在,则该sql发往主节点,如果不在,则发往备节点;
96.步骤五:非事务模式下,创建用户、继承表、视图、触发器等sql语句执行成功,则将其对象存储到对应的文件中,失败则直接清空缓存;事务模式下,当事务整体执行成功时将待缓存中的对象存储到对应的文件中,事务失败或者回滚则清空缓存,具体如图5所示。
97.相较于现有读写分离的方案,本发明实施例由于采用了更为详细和合理的读写分离处理逻辑,使得无论在事务中还是在非事务中,读写分离模块都能非常准确的判断出指定的sql语句是否为读,且能细致的判断出该读语句所查询的表信息是否受到了前面sql语句的影响,从而确定出该sql发往哪个节点。经过读写分离模块的处理,可以明显提高数据库集群中备节点的压力,降低主节点的压力,从而明显的提高了数据库集群整体的效率。
98.尽管为示例目的,已经公开了本发明的优选实施例,本领域的技术人员将意识到各种改进、增加和取代也是可能的,因此,本发明的范围应当不限于上述实施例。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1