CN115098573A - 实现数据库读写分离的方法 - Google Patents
实现数据库读写分离的方法 Download PDFInfo
- Publication number
- CN115098573A CN115098573A CN202210699612.9A CN202210699612A CN115098573A CN 115098573 A CN115098573 A CN 115098573A CN 202210699612 A CN202210699612 A CN 202210699612A CN 115098573 A CN115098573 A CN 115098573A
- Authority
- CN
- China
- Prior art keywords
- read
- connection
- database
- write separation
- session
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000926 separation method Methods 0.000 title claims abstract description 90
- 238000000034 method Methods 0.000 title claims abstract description 37
- 230000003993 interaction Effects 0.000 claims abstract description 5
- 238000007781 pre-processing Methods 0.000 claims description 11
- 239000000284 extract Substances 0.000 claims description 5
- 238000009964 serging Methods 0.000 claims description 2
- 230000008859 change Effects 0.000 description 3
- 241000224489 Amoeba Species 0.000 description 1
- 230000004075 alteration Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 230000008569 process Effects 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/28—Databases characterised by their database models, e.g. relational or object models
- G06F16/284—Relational databases
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种实现数据库读写分离的方法,包括:读写分离中间件分别和主数据库和从数据库建立连接池;读写分离中间件和客户端建立连接,并接收客户端的SQL请求;通过数据库和客户端交互协议提取并保存SQL请求的属性、读写分离中间件和客户端的会话状态、以及SQL请求对会话状态的影响;根据属性、会话状态以及对会话状态的影响转发到与主数据库的连接或与从数据库的连接;其中,当进入特定会话状态时,固定当前会话的连接;当连接更新时,读写分离中间件根据会话状态设置新的连接,以使得新的连接和当前会话的连接相同。本发明可以更为准确地将客户端的请求转化到对应的连接,在更改会话状态时,仍然可以执行读写分离并且得到正确的结果。
Description
技术领域
本发明涉及数据库领域,尤其是涉及一种实现数据库读写分离的方法。
背景技术
MySQL作为一种主流的关系型数据库,在互联网行业广泛应用,在面对数据量大、业务复杂和响应延时要求高等问题时,通过使用数据库集群可以使读写分离,提高数据库的系统性能。数据库集群通常包括一个主数据库和至少一个从数据库,其中主数据库负责数据的写入,从数据库负责数据的读取,从数据库从主数据库备份数据。而数据库的读写需要读写分离中间件系统。
现有的数据库读写分离中间件系统,例如Amoeba等,只是单纯的根据客户端请求的属性,转发到主数据库或从数据库的连接上。其中典型的流程是:读写分离中间件和后端主从数据库建立连接池;读写分离中间件和客户端建立连接;读写分离中间件收到客户端SQL请求;根据SQL请求的属性,选择合适的后端连接(与主数据库的连接或与从数据库的连接),并转发请求;收到后端数据库执行完毕返回的结果后,将结果转发到客户端。例如:现有读写分离中间件X连接一组主从数据库,主数据库DB1负责处理写入请求,从数据库DB2负责处理读取请求。读写分离中间件X收到的来自客户端的SQL请求1,解析处理其中的SQL语句,本次为读语句,则从连接池中获取一根DB2的连接,转发请求1。DB2执行完成后,将执行结果发送给X,X再将结果转发给客户端。最后将DB2连接放回连接池。X收到的来自客户端的SQL请求2,本次为写语句,则从连接池中获取一根DB1的连接,并执行如上的后续操作。
然而,这种单纯地判断SQL语句属性,并转发的方法,存在以下缺点:1、当存在特殊的会话状态,如:临时表、事务或只读事务时,仅凭SQL语句属性并不能得出正确的转发方向。例如临时表只在主库连接上存在,涉及临时表的读取,应当转发主库;2、SQL请求可能会改变会话状态,当读写分离中间件前后使用不同的连接时,会话状态会丢失。读写分离中间件无法支持依赖会话状态的SQL请求,将拒绝执行,或虽然执行但无法得到正确的结果。
发明内容
本发明的目的在于提供一种实现数据库读写分离的方法,在转发客户端的SQL请求时,将会话状态考虑到其中,从而可以更为准确地将客户端的请求转化到对应的连接,并且在更改会话状态时,仍然可以执行读写分离并且得到正确的结果。
为了达到上述目的,本发明提供了一种实现数据库读写分离的方法,包括:
读写分离中间件分别和主数据库和从数据库建立连接池;
读写分离中间件和客户端建立连接,并从所述客户端获取SQL请求;
通过数据库和客户端交互协议,读写分离中间件提取并保存所述SQL请求的属性、读写分离中间件和客户端的会话状态以及对所述会话状态的影响;
根据所述属性、会话状态以及对所述会话状态的影响将所述SQL请求转发到与主数据库的连接或与从数据库的连接;以及
其中,当所述读写分离中间件和客户端进入特定会话状态时,固定当前会话的连接;当与所述主数据库或者与所述从数据库的连接更新时,所述读写分离中间件根据所述会话状态设置新的连接,以使得所述新的连接和当前会话的连接相同。
可选的,在所述的实现数据库读写分离的方法中,所述读写分离中间件和主数据库的连接池包括若干个连接。
可选的,在所述的实现数据库读写分离的方法中,所述读写分离中间件和从数据库的连接池包括若干个连接。
可选的,在所述的实现数据库读写分离的方法中,所述读写分离中间件和客户端的会话状态包括:
会话是否在事务或只读事务中;
会话是否使用了自动提交模式;以及
默认数据库、用户变量和系统变量的变更内容。
可选的,在所述的实现数据库读写分离的方法中,所述会话状态包括:
是否创建或删除了临时表;
是否创建、调用或删除了预处理语句;以及
是否执行上锁或解锁操作。
可选的,在所述的实现数据库读写分离的方法中,所述特定会话状态包括:
会话处于事务或只读事务中;
会话拥有临时表;和/或
会话执行过上锁操作,处于上锁状态。
可选的,在所述的实现数据库读写分离的方法中,固定当前会话的连接后,SQL请求都转发到当前连接执行,直到会话从所述特定会话状态解除。
可选的,在所述的实现数据库读写分离的方法中,所述读写分离中间件根据所述会话状态设置新的连接的方法包括:
在新的连接上设置默认数据库、用户变量、系统变量和预处理语句。
可选的,在所述的实现数据库读写分离的方法中,根据所述属性、会话状态以及对所述会话状态的影响将所述SQL请求转发到与主数据库的连接或与从数据库的连接之后,还包括:在连接使用完毕后,读写分离中间件清空连接上的会话状态。
在本发明提供的实现数据库读写分离的方法中,将会话状态考虑到了其中,从而更为准确地将客户端的请求转化到了对应的连接,并且在更改会话状态时,仍然执行了读写分离并且得到了正确的结果。
附图说明
图1是本发明实施例的实现数据库读写分离的方法的流程图。
具体实施方式
下面将结合示意图对本发明的具体实施方式进行更详细的描述。根据下列描述,本发明的优点和特征将更清楚。需说明的是,附图均采用非常简化的形式且均使用非精准的比例,仅用以方便、明晰地辅助说明本发明实施例的目的。
在下文中,术语“第一”“第二”等用于在类似要素之间进行区分,且未必是用于描述特定次序或时间顺序。要理解,在适当情况下,如此使用的这些术语可替换。类似的,如果本文所述的方法包括一系列步骤,且本文所呈现的这些步骤的顺序并非必须是可执行这些步骤的唯一顺序,且一些所述的步骤可被省略和/或一些本文未描述的其他步骤可被添加到该方法。
请参照图1,本发明提供了一种实现数据库读写分离的方法,包括:
S11:读写分离中间件分别和主数据库和从数据库建立连接池;
S12:读写分离中间件和客户端建立连接,并从客户端获取SQL请求;
S13:通过数据库和客户端交互协议,读写分离中间件提取并保存SQL请求的属性、读写分离中间件和客户端的会话状态以及对会话状态的影响;
S14:根据属性、会话状态以及对会话状态的影响将SQL请求转发到与主数据库的连接或与从数据库的连接;
其中,当读写分离中间件和客户端进入特定会话状态时,固定当前会话的连接;当与主数据库或者与从数据库的连接更新时,读写分离中间件根据会话状态设置新的连接,以使得新的连接和当前会话的连接相同。
优选的,读写分离中间件和主数据库的连接池包括若干个连接。读写分离中间件和从数据库的连接池包括若干个连接。之后就可以根据属性、会话状态以及对会话状态的影响在若干个与主数据库的连接或若干个与从数据库的连接中选择一个连接,并且将SQL请求转发到该连接上。
优选的,SQL请求的属性为读或写。读写分离中间件和客户端的会话状态包括:会话是否在只读事务中;会话是否使用了自动提交模式;以及,默认数据库、用户变量和系统变量的变更内容。其中,默认数据库、用户变量和系统变量的变更内容的提取的具体方法是,打开MySQL的session_track系列参数后,中间件依照MySQL交互协议解析执行结果中额外提供的session_track内容,提取并保存状态。对会话状态的影响包括:是否创建或删除了临时表;是否创建、调用或删除了预处理语句;以及,是否执行上锁或解锁操作;是否创建、调用或删除了预处理语句。根据属性、会话状态以及对会话状态的影响决定转发连接。决定原则为:若会话连接固定,则转发到固定连接。否则根据语句读写属性转发。读属性的语句,根据自动提交模式转发。预处理语句的创建、调用和删除,根据预处理语句的读写属性转发。
优选的,当读写分离中间件和客户端进入特定会话状态时,固定当前会话的连接,所述特定会话状态:会话处于事务中;会话拥有临时表;和/或会话处于锁表状态,也就是说当处于会话处于事务中;会话拥有临时表;以及会话处于锁表状态的任一状态,就是特定会话状态。如果上述会话状态解除,则对当前连接解除固定。客户端之后的SQL请求按需转发,即根据根据属性、会话状态以及对会话状态的影响转发,会话状态的内容不同,转发就不同,例如,如果会话处于事务中、会话拥有临时表和会话处于锁表状态与会话不是处于事务中、会话拥有临时表和会话没有处于锁表状态的转发不同。
优选的,如果一个SQL请求执行后,会话进入如下状态,则固定当前连接。固定当前会话的连接后,SQL请求都转发到当前连接执行。
优选的,当与主数据库或者与从数据库的连接更新时,即当与主数据库和与从数据库之间的连接发生切换时,读写分离中间件根据会话状态设置新的连接的方法包括:在新的连接上设置系统变量、默认数据库,但是,当SQL请求涉及某些预处理语句或用户变量时,优先设置预处理语句或用户变量。
优选的,根据属性、会话状态以及对会话状态的影响将SQL请求转发到与主数据库的连接或与从数据库的连接之后,实现数据库读写分离的方法还包括:在与主数据库的连接或与从数据库的连接使用完毕后,读写分离中间件使用MySQL提供的机制快速清空连接上的会话状态,避免旧状态对新客户端请求的执行造成影响。
接下来,通过实施例进行举例,同样有读写分离中间件Y连接一组主数据库DB1和从数据库DB2,主数据库DB1负责处理写入请求,从数据库DB2负责处理读取请求。
S21:客户端发送SQL请求1,SQL请求1为:创建“读”类型的预处理语句PS1;
S22:属性为读,所以读写分离中间件从与从数据库的连接池中获取一根从数据库连接,将SQL请求1转发到该连接执行,并将预处理语句PS1添加到会话状态中;
S23:客户端发送SQL请求2,SQL请求2为:设置用户变量A=1(该值可以任意设置);
S24:该请求无读写特征,转发到上次使用的数据库连接(若存在)或获取从数据库连接。即使用步骤S22的从数据库连接,转发执行SQL请求2,并将用户变量A=1添加到会话状态中;
S25:客户端发送SQL请求3,SQL请求3为:开启事务;
S26:读写分离中间件从与主数据库的连接池中获取一根主数据库连接,将SQL请求3转发到该连接执行。由于会话状态进入事务,读写分离中间件将锁定该主数据库连接。事务结束前的所有请求都将在该连接上执行。其他客户端无法使用该主数据库连接;
S27:客户端发送SQL请求4,SQL请求4为:调用预处理语句PS1,参数为用户变量A;
S28:读写分离中间件在当前主数据库连接上创建记录的调用预处理语句PS1,设置用户变量A=42,然后转发执行SQL请求4;
S29:客户端发送SQL请求5,SQL请求5为:提交事务;
S30:读写分离中间件向当前连接转发SQL请求5,执行完毕后,会话状态退出事务。
以上的举例中,读写分离中间件通过事务这一会话状态,正确判断了SQL请求4和SQL请求5的执行目标。通过对预处理语句和用户变量的记录和回放,确保在执行连接由从数据库切换为主数据库时,依然能正确转发执行请求。
综上,在本发明实施例提供的实现数据库读写分离的方法中,读写分离中间件分别和主数据库和从数据库建立连接池;读写分离中间件和客户端建立连接,并从客户端获取SQL请求;读写分离中间件提取并保存SQL请求的属性、读写分离中间件和客户端的会话状态以及对会话状态的影响;根据属性、会话状态以及对会话状态的影响将SQL请求转发到与主数据库的连接或与从数据库的连接;其中,当读写分离中间件和客户端切换到下一会话时,固定当前会话的连接;当与主数据库或者与从数据库的连接更新时,读写分离中间件根据会话状态设置新的连接,以使得新的连接和当前会话的连接相同。本发明实施例在转发客户端的SQL请求时,将会话状态考虑到了其中,从而更为准确地将客户端的请求转化到了对应的连接,并且在更改会话状态时,仍然执行了读写分离并且得到了正确的结果。
上述仅为本发明的优选实施例而已,并不对本发明起到任何限制作用。任何所属技术领域的技术人员,在不脱离本发明的技术方案的范围内,对本发明揭露的技术方案和技术内容做任何形式的等同替换或修改等变动,均属未脱离本发明的技术方案的内容,仍属于本发明的保护范围之内。
Claims (9)
1.一种实现数据库读写分离的方法,其特征在于,包括:
读写分离中间件分别和主数据库和从数据库建立连接池;
读写分离中间件和客户端建立连接,并从所述客户端获取SQL请求;
通过数据库和客户端交互协议,读写分离中间件提取并保存所述SQL请求的属性、读写分离中间件和客户端的会话状态以及对所述会话状态的影响;
根据所述属性、会话状态以及对所述会话状态的影响将所述SQL请求转发到与主数据库的连接或与从数据库的连接;以及
其中,当所述读写分离中间件和客户端进入特定会话状态时,固定当前会话的连接;当与所述主数据库或者与所述从数据库的连接更新时,所述读写分离中间件根据所述会话状态设置新的连接,以使得所述新的连接和当前会话的连接相同。
2.如权利要求1所述的实现数据库读写分离的方法,其特征在于,所述读写分离中间件和主数据库的连接池包括若干个连接。
3.如权利要求1所述的实现数据库读写分离的方法,其特征在于,所述读写分离中间件和从数据库的连接池包括若干个连接。
4.如权利要求1所述的实现数据库读写分离的方法,其特征在于,所述读写分离中间件和客户端的会话状态包括:
会话是否在事务或只读事务中;
会话是否使用了自动提交模式;以及
默认数据库、用户变量和系统变量的变更内容。
5.如权利要求1所述的实现数据库读写分离的方法,其特征在于,所述会话状态包括:
是否创建或删除了临时表;
是否创建、调用或删除了预处理语句;以及
是否执行上锁或解锁操作。
6.如权利要求1所述的实现数据库读写分离的方法,其特征在于,所述特定会话状态包括:
会话于事务或只读事务中;
会话拥有临时表;和/或
会话执行过上锁操作,处于上锁状态。
7.如权利要求6所述的实现数据库读写分离的方法,其特征在于,固定当前会话的连接后,SQL请求都转发到当前连接执行,直到会话从所述特定会话状态解除。
8.如权利要求1所述的实现数据库读写分离的方法,其特征在于,所述读写分离中间件根据所述会话状态设置新的连接的方法包括:
在新的连接上设置默认数据库、用户变量、系统变量和预处理语句。
9.如权利要求1所述的实现数据库读写分离的方法,其特征在于,根据所述属性、会话状态以及对所述会话状态的影响将所述SQL请求转发到与主数据库的连接或与从数据库的连接之后,还包括:在连接使用完毕后,读写分离中间件清空连接上的会话状态。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210699612.9A CN115098573A (zh) | 2022-06-20 | 2022-06-20 | 实现数据库读写分离的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210699612.9A CN115098573A (zh) | 2022-06-20 | 2022-06-20 | 实现数据库读写分离的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115098573A true CN115098573A (zh) | 2022-09-23 |
Family
ID=83292677
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210699612.9A Pending CN115098573A (zh) | 2022-06-20 | 2022-06-20 | 实现数据库读写分离的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115098573A (zh) |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106341454A (zh) * | 2016-08-23 | 2017-01-18 | 世纪龙信息网络有限责任公司 | 跨机房多活分布式数据库管理系统和方法 |
CN107066575A (zh) * | 2017-04-11 | 2017-08-18 | 广东亿迅科技有限公司 | 用于实现数据库读写负载均衡的方法及其系统 |
CN108052664A (zh) * | 2017-12-29 | 2018-05-18 | 北京小度信息科技有限公司 | 数据库存储集群的数据迁移方法和装置 |
CN109547512A (zh) * | 2017-09-22 | 2019-03-29 | 中国移动通信集团浙江有限公司 | 一种基于NoSQL的分布式Session管理的方法及装置 |
CN110175089A (zh) * | 2019-05-17 | 2019-08-27 | 国电南瑞科技股份有限公司 | 一种具有读写分离功能的双活灾备系统 |
CN111061801A (zh) * | 2019-12-25 | 2020-04-24 | 天津南大通用数据技术股份有限公司 | 一种事务型数据库读写分离实现方法 |
CN114116768A (zh) * | 2021-11-29 | 2022-03-01 | 瀚高基础软件股份有限公司 | 一种对数据库集群进行读写分离的方法 |
-
2022
- 2022-06-20 CN CN202210699612.9A patent/CN115098573A/zh active Pending
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106341454A (zh) * | 2016-08-23 | 2017-01-18 | 世纪龙信息网络有限责任公司 | 跨机房多活分布式数据库管理系统和方法 |
CN107066575A (zh) * | 2017-04-11 | 2017-08-18 | 广东亿迅科技有限公司 | 用于实现数据库读写负载均衡的方法及其系统 |
CN109547512A (zh) * | 2017-09-22 | 2019-03-29 | 中国移动通信集团浙江有限公司 | 一种基于NoSQL的分布式Session管理的方法及装置 |
CN108052664A (zh) * | 2017-12-29 | 2018-05-18 | 北京小度信息科技有限公司 | 数据库存储集群的数据迁移方法和装置 |
CN110175089A (zh) * | 2019-05-17 | 2019-08-27 | 国电南瑞科技股份有限公司 | 一种具有读写分离功能的双活灾备系统 |
CN111061801A (zh) * | 2019-12-25 | 2020-04-24 | 天津南大通用数据技术股份有限公司 | 一种事务型数据库读写分离实现方法 |
CN114116768A (zh) * | 2021-11-29 | 2022-03-01 | 瀚高基础软件股份有限公司 | 一种对数据库集群进行读写分离的方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104657382B (zh) | 用于MySQL主从服务器数据一致性检测的方法和装置 | |
JP4598821B2 (ja) | データベース復旧中のスナップショットクエリのためのシステムおよび方法 | |
US6407753B1 (en) | System and method for integrating entities via user-interactive rule-based matching and difference reconciliation | |
KR101171501B1 (ko) | 트랜잭션 프로세싱 쓰루풋을 증가시키기 위한 트랜잭션 취합 | |
US9626394B2 (en) | Method for mass-deleting data records of a database system | |
US6490590B1 (en) | Method of generating a logical data model, physical data model, extraction routines and load routines | |
US7567989B2 (en) | Method and system for data processing with data replication for the same | |
EP1465085A2 (en) | Transactionally consistent change tracking for databases | |
US6567823B1 (en) | Change propagation method using DBMS log files | |
US20080033977A1 (en) | Script generating system and method | |
JP2022531867A (ja) | データ読み取り方法、装置、コンピュータ装置及びコンピュータプログラム | |
EP3772691A1 (en) | Database server device, server system and request processing method | |
JP2002538546A (ja) | Abapコードコンバータの仕様 | |
WO2017107811A1 (zh) | 数据库操作方法及装置 | |
CN113391885A (zh) | 一种分布式事务处理系统 | |
CN113032421A (zh) | 基于MongoDB的分布式事务处理系统及方法 | |
CN112231321A (zh) | 一种Oracle二级索引及索引实时同步方法 | |
JP2002108681A (ja) | レプリケーションシステム | |
CN112783927B (zh) | 一种数据库查询方法及系统 | |
CN115098573A (zh) | 实现数据库读写分离的方法 | |
CN106503027B (zh) | 数据库操作方法及装置 | |
CN114238339A (zh) | 基于无中心架构分布式数据库的内存表查询方法及系统 | |
JP2000047919A (ja) | 仮想データベースレプリケーションシステム | |
CN114116768A (zh) | 一种对数据库集群进行读写分离的方法 | |
CN117931382B (zh) | 一种面向服务器无感知计算的事务保障方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20220923 |