CN117251500A - 一种数据库动态读写分离的系统及方法 - Google Patents
一种数据库动态读写分离的系统及方法 Download PDFInfo
- Publication number
- CN117251500A CN117251500A CN202311544041.2A CN202311544041A CN117251500A CN 117251500 A CN117251500 A CN 117251500A CN 202311544041 A CN202311544041 A CN 202311544041A CN 117251500 A CN117251500 A CN 117251500A
- Authority
- CN
- China
- Prior art keywords
- data source
- rule
- library
- source selection
- application program
- 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.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 27
- 238000000926 separation method Methods 0.000 title claims abstract description 27
- 230000008859 change Effects 0.000 claims abstract description 17
- 230000006870 function Effects 0.000 claims description 20
- 238000012986 modification Methods 0.000 claims description 10
- 230000004048 modification Effects 0.000 claims description 9
- 238000012217 deletion Methods 0.000 claims description 5
- 230000037430 deletion Effects 0.000 claims description 5
- 238000012795 verification Methods 0.000 claims description 5
- 230000001360 synchronised effect Effects 0.000 claims description 2
- 230000000977 initiatory effect Effects 0.000 claims 1
- 230000000694 effects Effects 0.000 abstract description 10
- 230000007246 mechanism Effects 0.000 abstract description 4
- 230000009286 beneficial effect Effects 0.000 abstract description 2
- 238000010586 diagram Methods 0.000 description 4
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 238000011161 development Methods 0.000 description 3
- 230000007547 defect Effects 0.000 description 2
- 239000006185 dispersion Substances 0.000 description 2
- 230000008569 process Effects 0.000 description 2
- 238000006467 substitution reaction Methods 0.000 description 2
- 238000012549 training Methods 0.000 description 2
- 238000013459 approach Methods 0.000 description 1
- 238000001914 filtration Methods 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
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
- G06F16/252—Integrating or interfacing systems involving database management systems between a Database Management System and a front-end application
-
- 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/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24552—Database cache management
-
- 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/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24564—Applying rules; Deductive queries
-
- 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/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
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)
- Computational Linguistics (AREA)
- Computing Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种数据库动态读写分离的系统及方法,该方法包括以下步骤:建立应用程序与所述Primary主库之间读写访问的连接,同时建立应用程序与所述多个Slaver从库之间只读访问的连接;应用程序启动时,读取配置文件并对其进行解析,并依序对解析后的各条数据源选择规则进行存储;通过对外暴露接口,以接收外部调用修改数据源选择规则,并对接收的数据源选择规则进行存储,实现动态改变数据源选择规则;根据业务需求,读取动态改变后的数据源选择规则,并按规则逐条分析后选出该业务所需的数据源;本发明的有益效果是:能够支持数据库的读写分离,同时在数据库运行期间进行动态改变读写机制,且调整后立即生效。
Description
技术领域
本发明涉及数据库技术领域,更具体的说,本发明涉及一种数据库动态读写分离的系统及方法。
背景技术
现代应用系统中,作为数据存放的数据库是系统的重要支撑。应用程序(也称应用服务)需要访问数据库读取或改变数据。需要为了提升数据库灾备能力及其可靠性和可恢复性,通常同一个数据库会部署在多台服务器上,形成由多个节点组成数据库集群。
结合图1所示,通常一个数据库集群内会部署Primary主库节点一台和Slaver从库节点一台或多台。即:
Primary主库,也称为“RW读写节点”,主库节点可以被读取访问也可以被写入访问。数据库客户端或应用程序等既可以读取访问该节点,也可以写入访问该节点;Primary主库节点通常只有一个。
Slaver从库,也称为“RO只读节点”,从库节点只允许被读取访问;数据库客户端或应用程序等只能读取访问该节点,不能写入访问该节点。Slaver从库节点通常有一个或者多个。
读写访问也称为RW读写访问。包括对插入新增数据、更新数据、删除数据,也包括查询数据。只读访问也称为RO只读访问。指仅查询数据,不改变数据。
其中,从库为主库的镜像,从库实时或准实时从主库获取数据,实现从库数据与主库保持数据一致(因网络等原因数据一致性可能存在一定延时)。
数据库集群部署时,应用程序可按读写分离方式分别访问集群中不同的节点。若应用程序的某业务(例如改变客户余额)需要写入数据,则应连接Primary主库进行访问;若应用程序的某业务(例如查询客户余额)仅查询数据,则应连接Slaver从库进行访问。
在实践情形中,应用程序对数据库的访问中,查询只读类访问往往占大多数。因此可以通过读写分离实现不同的业务访问不通的库节点,达到:
由Primary主库承担写入类操作,少量或者不承担只读类操作,减轻对Primary主库负载。
由Slaver从库承担只读类操作,以减轻Primary主库访问负载;而且,可通过部署多个Slaver从库,并将只读类操作分散到不同Slaver从库,减轻每个Slaver从库节点的访问负载。
现有技术中关于数据库读写分离解决方案存在以下两方面的不足:
一方面,读写分离方式在开发阶段固定,难以在运行时动态改变。现有的读写分离解决方案无论是通过识别SQL文本中关键词识出读写;或是通过在SQL文本中增加Hint区分读写;还是通过在代码中对每支业务通过命名或其他方式区分每支业务读写等方式。这些方式都存在一个缺点,其读写分离机制在开发阶段已经固定的。应用程序部署上线后,难以在运行期间进行动态改变读写(在应用程序不重启的情况下动态改变读写分离)且实时生效。
需要动态改变读写的场景示例:对于“读取客户当前余额以判断是否足够”功能点,在开发阶段认为该功能点对数据库为RO只读访问,因此在源代码中固化使用Slaver从库作为访问数据源。但在上线运行后发现:①由于网络等因素导致Slaver从库与Primary主库的数据同步存在延时,Slaver从库与Primary主库无法保障数据强实时一致性;或者②Slaver从库节点临时故障,Primary主库正常工作。这两种情况都需要将该功能点的数据源动态从RO只读访问切换至RW读写访问。现有的读写分离解决方案难以支持动态改变,需要重新修改源代码重新部署才能部署上线。
另一方面,未考虑RO只读请求访问之间的动态分散。现有的读写分离方案虽考虑了读与写分类,但没有考虑RO只读请求如何分散。应当让数据库集群多个从节点资源均承担读请求访问负载,分散压力。而且这种分散机制应当是可动态改变的。
发明内容
为了克服现有技术的不足,本发明提供一种数据库动态读写分离的系统及方法,能够支持数据库的读写分离,同时在数据库运行期间进行动态改变读写机制,且调整后立即生效。
本发明解决其技术问题所采用的技术方案是:一种数据库动态读写分离的方法,所述数据库由Primary主库和多个Slaver从库组成,该方法包括以下步骤:
建立应用程序与所述Primary主库之间读写访问的连接,同时建立应用程序与所述多个Slaver从库之间只读访问的连接;
应用程序启动时,读取配置文件并对其进行解析,并依序对解析后的各条数据源选择规则进行存储;
通过对外暴露接口,以接收外部调用修改数据源选择规则,并对接收的数据源选择规则进行存储,实现动态改变数据源选择规则;
根据业务需求,读取动态改变后的数据源选择规则,并按规则逐条分析后选出该业务所需的数据源。
进一步的,所述的数据源选择规则为一条或多条,且当数据源选择规则为多条时,该多条数据源选择规则为有序的;
每条规则包括选库条件和选择结果,选库条件包含应用程序名、功能点、SQL中需出现的关键字、SQL中不得出现的关键字;选择结果包括库类别、库节点。
进一步的,所述通过对外暴露接口,以接收外部调用修改数据源选择规则,并对接收的数据源选择规则进行存储,实现动态改变数据源选择规则,包括:
S101、对外暴露接口;
S102、客户端按新增/修改/删除接口规范生成JOSN请求,调用对应接口;
S103、解析JOSN请求,并验证操作口令是否与预设一致、验证JOSN请求的内容是否合法;
S104、验证通过后,按根据JSON请求的内容,对数据源选择规则进行新增/修改/删除的操作,最终完成数据源选择规则的内容动态更新且立即生效。
进一步的,所述根据业务需求,读取动态改变后的数据源选择规则,并按规则逐条分析后选出该业务所需的数据源,还包括:
将从Slaver从库中查询得到的数据放入结果缓存中;
当出现相同SQL查询请求时,直接从已有的结果缓存中获取数据。
进一步的,所述根据业务需求,读取动态改变后的数据源选择规则,并按规则逐条分析后选出该业务所需的数据源,还包括:
S201、获取应用程序的当前信息;
S202、进行规则匹配,依顺序读取一条数据源选择规则的内容,并以应用程序的当前信息与选择条件进行逻辑匹配;
S203、步骤S202的匹配中,若选择条件满足,则取得该条数据源选择规则对应的选择结果;若选择条件不满足,则重复步骤S202读取下一条数据源选择规则并进行规则匹配;
S204、对得到选择结果获得库类别、库节点属性,以确定最终节点;
S205、根据库类别和最终节点,获取对应库的具体连接;
S206、若库类别为RW读写,则获得Primary主库的数据源连接,或从已有的连接池中获取连接;通过该数据源连接,执行待执行SQL,并将执行结果返回至应用程序;
S207、若库类别为RO只读,包括:
以待执行SQL语句文本整体或者以SQL语句文本的Hash散列值作为Key,从结果缓存中获取对应缓存;若从结果缓存中能获取到Value则缓存命中;否则缓存未命中;
若缓存命中,则以命中缓存的Value作为结果直接返回至应用程序,无需获取数据源连接,也无需执行SQL;该步骤中,若以序列化后的字符串作为Value则还需要反序列化;
若缓存未命中,则获得Slaver从库的数据源连接,或从已有的连接池中获取连接;通过该数据源连接,执行待执行SQL;若执行成功,将SQL执行结果保存至结果缓存中;无论SQL执行结果是否成功均将执行结果返回至应用程序。
进一步的,步骤S201中,所述当前信息包括当前应用程序名、功能点以及待执行SQL。
进一步的,步骤S204中,若库节点指定为“ANY”任意,则从该库类别下多个节点中,以随机方式或轮训的方式选其一个节点作为最终节点;
若库节点不是“ANY”任意而是具体指定的节点,则直接以其指定的节点作为最终节点。
本发明还提供了一种数据库动态读写分离的系统,其改进之处在于,所述数据库包括Primary主库和多个Slaver从库,该系统包括:
加载初始规则组件,对读取的内容进行解析,并依序将解析后的各条数据源选择规则放入规则链存储组件中;
规则链存储组件,用于实现对数据源选择规则的存储;
动态调整规则组件,该动态调整规则组件通过对外暴露接口,以接收外部调用,并将接收的数据源选择规则放入规则链存储组件内,实现动态改变数据源选择规则;
选择引擎组件,按业务需求读取规则链存储组件中的数据源选择规则,在分析后选出该业务所需的数据源;
RW数据源管理组件,通过RW数据源管理组件实现对Primary主库的数据源连接或连接池的管理;
RO数据源管理组件,通过RO数据源管理组件实现对多个Slaver从库的数据源连接或连接池的管理。
进一步的,所述动态调整规则组件与中央配置单元联动同步,实现自动从中央配置单元获取最新规则;
所述中央配置单元可为Nacos、Spring Config Server以及ZooKeeper中的任意一种。
进一步的,所述的加载初始规则组件从配置文件中读取加载规则,并在解析后形成数据源选择规则;
所述规则链存储组件在应用程序中存储数据源选择规则,当应用程序启动时,将数据源选择规则加载到应用程序的内存中。
本发明的有益效果是:本发明的一种数据库动态读写分离的方法及系统,支持读写分离方式可以在运行时动态改变,调整后立即生效;还可以灵活地在读读之间的动态调整。
附图说明
图1为现有技术中数据库集群的结构示意图。
图2为本发明中一种数据库动态读写分离的系统的原理框图。
图3为本发明中加载初始规则组件的工作流程示意图。
图4为本发明中动态调整规则组件的工作流程示意图。
具体实施方式
下面结合附图和实施例对本发明进一步说明。
以下将结合实施例和附图对本发明的构思、具体结构及产生的技术效果进行清楚、完整地描述,以充分地理解本发明的目的、特征和效果。显然,所描述的实施例只是本发明的一部分实施例,而不是全部实施例,基于本发明的实施例,本领域的技术人员在不付出创造性劳动的前提下所获得的其他实施例,均属于本发明保护的范围。另外,专利中涉及到的所有联接/连接关系,并非单指构件直接相接,而是指可根据具体实施情况,通过添加或减少联接辅件,来组成更优的联接结构。本发明创造中的各个技术特征,在不互相矛盾冲突的前提下可以交互组合。
实施例1
结合图2所示,本发明公开了一种数据库动态读写分离的系统,其中数据库包括Primary主库和多个Slaver从库,本实施例中,包括有三个Slaver从库,分别为Slaver从库01、Slaver从库02、Slaver从库03。所述数据库动态读写分离的系统包括加载初始规则组件、规则链存储组件、动态调整规则组件、选择引擎组件、RW数据源管理组件以及RO数据源管理组件。
其中,RW数据源管理组件管理RW读写访问的Primary主库的数据源连接或连接池,包括IP、端口、用户名、密码等连接配置信息,以及连接池管理等。RO数据源管理组件管理RO只读访问的Slaver从库的数据源连接或连接池,包括IP、端口、用户名、密码等连接配置信息,以及连接池管理等。可以访问多个Slaver从库,本实施例中,通过RO数据源管理组件访问三个Slaver从库。
进一步的,规则链存储组件是在应用程序中(例如内存中)存储的数据源选择规则,数据源选择规则可有一条或者多条,多条则是有序的;数据源选择规则存储在内存中可加快规则的读取效率。加载初始规则组件对读取的内容进行解析,并依序将解析后的各条数据源选择规则放入规则链存储组件中。对于所述的动态调整规则组件,该动态调整规则组件通过对外暴露接口,以接收外部调用,并将接收的数据源选择规则放入规则链存储组件内,实现动态改变数据源选择规则;例如本实施例中,动态调整规则组件对外暴露接口为HTTP协议的接口。另外,动态调整规则组件还可以与某个中央配置单元联动同步,实现自动从中央配置单元获取最新规则;本实施例中,中央配置单元为Nacos、Spring ConfigServer、ZooKeeper中的任意一个,也可以为其他配置库。
所述的选择引擎组件,按业务需求读取规则链存储组件中的数据源选择规则,在分析后选出该业务所需的数据源;对于RO数据源,还需要判断是否存在缓存,已经将从数据库查询得到的数据放入在缓存中。
本实施例中,还包括结果缓存组件,该结果缓存组件将已经从RO数据源SQL查询得到数据作为结果缓存保存在应用程序内存中,下次相同SQL查询请求,直接从已有的结果缓存中获取,无需实际访问Slaver从库,降低从库压力。因此本发明提供了结果缓存功能,可进一步降低数据库查询压力。
本发明的一种数据库动态读写分离的系统,支持读写分离方式可以在运行时动态改变,调整后立即生效。还可以灵活地在读读之间的动态调整,例如可根据数据库集群中各个Slaver从库负载压力情况或者在数据库集群结构扩容/收缩时,及时动态调整各节点请求负载。
实施例2
继续参照图2所示,本实施例中公开了一种数据库动态读写分离的系统,其中数据库包括Primary主库和多个Slaver从库,本实施例中,包括有三个Slaver从库,分别为Slaver从库01、Slaver从库02、Slaver从库03。同样的,所述数据库动态读写分离的系统包括加载初始规则组件、规则链存储组件、动态调整规则组件、选择引擎组件、RW数据源管理组件以及RO数据源管理组件。
在实施例1的基础上,对于所述的规则链存储组件、加载初始规则组件、动态调整规则组件以及选择引擎组件,提供了更为具体的实施例。
对于所述的规则链存储组件,其中的规则链即为数据源选择规则。数据源选择规则可有一条或者多条,多条是有序。应用程序启动时,会将数据源选择规则加载到内存中以加快读取规则的效率。本发明中,数据源选择规则允许动态修改,修改后立即生效。
本实施例中,数据源选择规则形式及内容示例如下(下表中的规则链即为数据源选择规则):
以上表中示例规则链说明:
规则1:若当前应用程序为AcctMgr且指定当前功能点为QueryAcctInfo时(不判断SQL语句内容),则从RO只读数据源中任选一个Slaver从库节点进行访问。
规则2:若当前应用程序为AcctMgr且指定当前功能点为QueryBalance时(不判断SQL语句内容),则从RO只读数据源中选择指定的Slaver01库节点进行访问。
规则3:若当前应用程序为AcctMgr且指定当前功能点为AddValue时(不判断SQL语句内容),则选择RW读写数据源的Primary主库节点进行访问。
规则4:若当前应用程序为AcctMgr且SQL语句包含“select”关键字且SQL语句不含“insert|update|delete”关键字中任意一个时(不判断功能点),则从RO只读数据源中任选一个Slaver从库节点进行访问。
规则5:若当前应用程序为AcctMgr且SQL语句包含“insert|update|delete” 关键字中任意一个时(不判断功能点),则选择RW读写数据源的Primary主库节点进行访问。
规则6:若当前应用程序为RptQry(不判断功能点,不判断SQL语句内容),则从RO只读数据源中任选一个Slaver从库节点进行访问。
规则7:若当前应用程序为StoreMgr且指定当前功能点为InventoryBalance时(不判断SQL语句内容),则选择RW读写数据源的Primary主库节点进行访问。
例如本实施例中,该功能点为“商品剩余库存查询”,虽然该功能点“商品剩余库存查询”对数据库仅涉及读取操作,没有数据变更操作。但考虑到对查询结果为强实时要求,因此选择RW读写数据源的Primary主库节点进行访问。避免因Slaver从库与Primary主库的数据同步存在延时而导致从Slaver从库查询结果不准的问题。
规则8:若当前应用程序为StoreMgr且SQL语句包含“select”关键字且SQL语句不含“insert|update|delete”关键字中任意一个时(不判断功能点),则从RO只读数据源中任选一个Slaver从库节点进行访问。
规则9:若当前应用程序为StoreMgr且SQL语句包含“insert|update|delete” 关键字中任意一个时(不判断功能点),则选择RW读写数据源的Primary主库节点进行访问。
结合图3所示,对于所述的加载初始规则组件,本发明提供了一个具体实施例,本实施例中,加载初始规则组件从配置文件中读取加载规则,并在解析后形成数据源选择规则。
在应用程序启动时,从配置文件中加载规则的步骤入选:
一、配置文件内容是已按约定格式存放一条或者多条选择规则(有序存放);配置文件内容可以人工进行编辑设置;也可以是上一次应用程序运行时保存的结果。
二、通常在应用程序启动时,由加载初始规则组件读取配置文件,按序解析每行的内容文本;
三、将解析得到的结果,逐条按序放入规则链存储组件中。
进一步的,结合图4所示,对于所述的动态调整规则组件,本发明中提供了一具体实施例,所述动态调整规则组件通过对外暴露接口,以接收外部调用,并将接收的数据源选择规则放入规则链存储组件内,实现动态改变数据源选择规则,包括:
S101、动态调整规则组件对外暴露接口;
如下所示,以HTTP+JSON协议为例,对外暴露接口规范示例如下:
新增规则接口URL地址:http://IP:PORT/addOneRule;新增规则接口Body内容(JSON格式):
{
"password": "操作口令(需与预设的一致,避免误操作)",
"addBeforeRuleNo": "1",
"chooseCondition": {
"applicationName": "应用程序名称(英文字母或数字)",
"FunctionName": "功能点名称(英文字母或数字)",
"sqlContainKeywords": "SQL中需出现的关键字(多个以竖线分隔)",
"sqlNotContainKeywords": "SQL中不得出现的关键字(多个以竖线分隔)"
}
"chooseResult": {
"type": "库类型(可取值:RW或RO)",
"NodeName": "库节点名(若不指定具体节点名,则填ANY标书任意)",
}
}
其中,addBeforeRuleNo字段指定将本条新规则增加在哪条规则之前。
修改规则接口URL地址:http://IP:PORT/modifyOneRule修改规则接口Body内容(JSON格式):
{
"password": "操作口令(需与预设的一致,避免误操作)",
"RuleNo": "1",
"chooseCondition": {
"applicationName": "应用程序名称(英文字母或数字)",
"FunctionName": "功能点名称(英文字母或数字)",
"sqlContainKeywords": "SQL中需出现的关键字(多个以竖线分隔)",
"sqlNotContainKeywords": "SQL中不得出现的关键字(多个以竖线分隔)"
}
"chooseResult": {
"type": "库类型(可取值:RW或RO)",
"NodeName": "库节点名(若不指定具体节点名,则填ANY标书任意)",
}
}
其中,RuleNo指定对哪条规则进行修改,JSON格式内容为新规则。
删除规则接口URL地址:http://IP:PORT/deleteOneRule删除规则接口Body内容(JSON格式):
{
"password": "操作口令(需与预设的一致,避免误操作)",
"RuleNo": "1",
}
其中,RuleNo指定对哪条规则进行删除。
S102、客户端按新增/修改/删除接口规范生成JOSN请求,调用对应接口,实现JSON请求内容传输至动态调整规则组件;
S103、动态调整规则组件接收到请求后,解析该请求,验证操作口令是否与预设一致、验证请求内容是否合法;
S104、动态调整规则组件验证通过后,按根据JSON请求内容,对在规则链存储组件中的数据源选择规则进行新增/修改/删除操作;最终完成对规则链存储组件中的数据源选择规则的内容动态更新且立即生效。
因此,通过该步骤,本发明不仅仅支持动态读写分离,还可以灵活地在读读之间的动态调整。另外,本发明侵入性低,无需各应用程序进行大量改造。本发明具有广泛通用性,不依赖于特定数据库产品,也不依赖特定程序开发语言,也不局限在特定领域的应用系统,具有广泛的推广应用价值。
对于所述的选择引擎组件,本发明提供了一具体实施例。对于商品秒杀等业务场景,一段时间内会有大量相同的查询请求,例如高频SQL查询某个秒杀商品代码、名称、详情介绍、参数规格、价格等基本信息。这些SQL查询请求,虽可以通过以上选择引擎按规则链动态的选择数据源连接,以读写分离方式实现查询请求由Slaver从库承担,但这些高频的SQL查询仍会使Slaver从库负载较大。在Slaver从库内对每一次SQL查询请求都需要进行解析SQL文本、语法词法分析、权限校验、执行计划生成、执行计划选择、IO读取磁盘数据、数据过滤、排序、表表关联等各项操作才能最终得到结果并返回至应用程序。
对此,本发明提出改进的方案,这些对于相同SQL查询请求,可在前次已从数据库查询得到数据作为结果缓存保存在应用程序内存中,下次相同SQL查询请求,直接从已有的结果缓存中获取,无需实际访问Slaver从库,降低从库压力。
本实施例中,对于结果缓存的存放结构实现:由于C、C++、Java、Python、C#、Go、JavaScript等各主流程序开发语言均支持Map结构,可使用Map结构存放结果缓存;Map结构中每条数据包括Key-Value键值对;具体形式为:
Key:以SQL语句文本整体作为Key(或者以SQL语句文本的Hash散列值作为Key);
Value:成功执行SQL语句查询结果对象作为Value(或者以查询结果对象的序列化后的字符串作为Value)。
因此,改进后的选择引擎组件处理流程如下:
S201、获取应用程序的当前信息;当前信息包括当前应用程序名、功能点以及待执行SQL;
S202、进行规则匹配,从规则链存储组件中依顺序读取一条数据源选择规则的内容,并以应用程序的当前信息与选择条件进行逻辑匹配;本实施例中的依顺序为序号从小至大;
S203、步骤S202的匹配中,若选择条件满足,则取得该条数据源选择规则对应的选择结果;若选择条件不满足,则重复步骤S202读取下一条数据源选择规则并进行规则匹配;
S204、对得到选择结果获得库类别、库节点属性,以确定最终节点;
步骤S204中,若库节点指定为“ANY”任意,则从该库类别下多个节点中,以随机方式或轮训的方式选其一个节点作为最终节点;若库节点不是“ANY”任意而是具体指定的节点,则直接以其指定的节点作为最终节点;
S205、根据库类别和最终节点,RW数据源管理或RO数据源管理获取对应库的具体连接;
S206、若库类别为RW读写,则从RW数据源管理中获得Primary主库的数据源连接,或从已有的连接池中获取连接;通过该数据源连接,执行待执行SQL,并将执行结果返回至应用程序;
S207、若库类别为RO只读,包括:
以待执行SQL语句文本整体或者以SQL语句文本的Hash散列值作为Key,从结果缓存中获取对应缓存;若从结果缓存中能获取到Value则缓存命中;否则缓存未命中;
若缓存命中,则以命中缓存的Value作为结果直接返回至应用程序,无需获取数据源连接,也无需执行SQL;该步骤中,若以序列化后的字符串作为Value则还需要反序列化;
若缓存未命中,则从RO数据源管理中获得Slaver从库的数据源连接,或从已有的连接池中获取连接;通过该数据源连接,执行待执行SQL;若执行成功,将SQL执行结果保存至结果缓存中;无论SQL执行结果是否成功均将执行结果返回至应用程序。
实施例3
本发明公开了一种数据库动态读写分离的方法,所述数据库包括Primary主库和多个Slaver从库,该方法包括以下的步骤:
S10、建立应用程序与所述Primary主库之间读写访问的连接,同时建立应用程序与所述多个Slaver从库之间只读访问的连接;
S20、应用程序启动时,读取配置文件并对其进行解析,并依序对解析后的各条数据源选择规则进行存储;
S30、通过对外暴露接口,以接收外部调用,并对接收的数据源选择规则进行存储,实现动态改变数据源选择规则;
S40、根据业务需求,读取动态改变后的数据源选择规则,并按规则逐条分析后选出该业务所需的数据源。
其中,所述步骤S10中,所述建立应用程序与所述Primary主库之间读写访问的连接,建立应用程序与所述多个Slaver从库之间只读访问的连接时,包括:对数据源连接的IP、端口、用户名以及密码的连接配置信息的管理。所述的数据源选择规则为一条或多条,且当数据源选择规则为多条时,该多条数据源选择规则为有序的。并且,所述数据源选择规则为多条时,包括多条规则,并且该规则与实施例2中相同,本实施例中不再详细说明。
进一步的,本实施例中,所述步骤S30包括:
S301、动态调整规则组件对外暴露接口;
S302、通过客户端按新增/修改/删除接口规范,调用对应接口,实现JSON请求内容传输至动态调整规则组件;
S303、动态调整规则组件接收到请求后,解析该请求,验证操作口令是否与预设一致、验证请求内容是否合法;
S304、动态调整规则组件验证通过后,按根据JSON请求内容,对在规则链存储组件中的数据源选择规则进行新增/修改/删除操作;最终完成对规则链存储组件中的数据源选择规则的内容动态更新且立即生效。
更进一步的,步骤S40中,对于RO数据源,判断是否存在缓存;将已经从RO数据源SQL查询得到的结果作为缓存进行保存,当出现相同SQL查询请求时,直接从已有的结果缓存中获取。具体的,步骤S40包括以下步骤:
S401、获取应用程序的当前信息;步骤S401中,所述当前信息包括当前应用程序名、功能点以及待执行SQL;
S402、进行规则匹配,从规则链存储组件中依顺序读取一条数据源选择规则的内容,并以应用程序的当前信息与选择条件进行逻辑匹配;
S403、步骤S402的匹配中,若选择条件满足,则取得该条数据源选择规则对应的选择结果;若选择条件不满足,则重复步骤S402读取下一条数据源选择规则并进行规则匹配;
S404、对得到选择结果获得库类别、库节点属性,以确定最终节点;步骤S404中,若库节点指定为“ANY”任意,则从该库类别下多个节点中,以随机方式或轮训的方式选其一个节点作为最终节点;若库节点不是“ANY”任意而是具体指定的节点,则直接以其指定的节点作为最终节点;
S405、根据库类别和最终节点,RW数据源管理或RO数据源管理获取对应库的具体连接;
S406、若库类别为RW读写,则从RW数据源管理中获得Primary主库的数据源连接,或从已有的连接池中获取连接;通过该数据源连接,执行待执行SQL,并将执行结果返回至应用程序;
S407、若库类别为RO只读,包括:
以待执行SQL语句文本整体或者以SQL语句文本的Hash散列值作为Key,从结果缓存中获取对应缓存;若从结果缓存中能获取到Value则缓存命中;否则缓存未命中;
若缓存命中,则以命中缓存的Value作为结果直接返回至应用程序,无需获取数据源连接,也无需执行SQL;该步骤中,若以序列化后的字符串作为Value则还需要反序列化;
若缓存未命中,则从RO数据源管理中获得Slaver从库的数据源连接,或从已有的连接池中获取连接;通过该数据源连接,执行待执行SQL;若执行成功,将SQL执行结果保存至结果缓存中;无论SQL执行结果是否成功均将执行结果返回至应用程序。
基于此,本发明揭示了一种数据库动态读写分离的系统及方法,与现有技术中实现数据库读写分离的方案相比,具有以下特点:其一、支持读写分离方式可以在运行时动态改变,调整后立即生效。其二、不仅仅支持动态读写分离,还可以灵活地在读读之间的动态调整;例如可根据数据库集群中各个Slaver从库负载压力情况或者在数据库集群结构扩容/收缩时,及时动态调整各节点请求负载。其三、本发明侵入性低,无需各应用程序进行大量改造。其四、具有广泛通用性,不依赖于特定数据库产品,也不依赖特定程序开发语言,也不局限在特定领域的应用系统;具有广泛的推广应用价值。其五、提供了结果缓存功能,可进一步降低数据库查询压力。
以上是对本发明的较佳实施进行了具体说明,但本发明创造并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做出种种的等同变形或替换,这些等同的变形或替换均包含在本申请权利要求所限定的范围内。
Claims (10)
1.一种数据库动态读写分离的方法,其特征在于,所述数据库包括Primary主库和多个Slaver从库,该方法包括以下步骤:
建立应用程序与所述Primary主库之间读写访问的连接,同时建立应用程序与所述多个Slaver从库之间只读访问的连接;
应用程序启动时,读取配置文件并对其进行解析,并依序对解析后的各条数据源选择规则进行存储;
通过对外暴露接口,以接收外部调用修改数据源选择规则,并对接收的数据源选择规则进行存储,实现动态改变数据源选择规则;
根据业务需求,读取动态改变后的数据源选择规则,并按规则逐条分析后选出该业务所需的数据源。
2.根据权利要求1所述的一种数据库动态读写分离的方法,其特征在于,所述的数据源选择规则为一条或多条,且当数据源选择规则为多条时,该多条数据源选择规则为有序的;
每条规则包括选库条件和选择结果,选库条件包含应用程序名、功能点、SQL中需出现的关键字、SQL中不得出现的关键字;选择结果包括库类别、库节点。
3.根据权利要求1所述的一种数据库动态读写分离的方法,其特征在于,所述通过对外暴露接口,以接收外部调用修改数据源选择规则,并对接收的数据源选择规则进行存储,实现动态改变数据源选择规则,包括:
S101、对外暴露接口;
S102、客户端按新增/修改/删除接口规范生成JOSN请求,调用对应接口;
S103、解析JOSN请求,并验证操作口令是否与预设一致、验证JOSN请求的内容是否合法;
S104、验证通过后,按根据JSON请求的内容,对数据源选择规则进行新增/修改/删除的操作,最终完成数据源选择规则的内容动态更新且立即生效。
4.根据权利要求1所述的一种数据库动态读写分离的方法,其特征在于,所述根据业务需求,读取动态改变后的数据源选择规则,并按规则逐条分析后选出该业务所需的数据源,还包括:
将从Slaver从库中查询得到的数据放入结果缓存中;
当出现相同SQL查询请求时,直接从已有的结果缓存中获取数据。
5.根据权利要求4所述的一种数据库动态读写分离的方法,其特征在于,所述根据业务需求,读取动态改变后的数据源选择规则,并按规则逐条分析后选出该业务所需的数据源,还包括:
S201、获取应用程序的当前信息;
S202、进行规则匹配,依顺序读取一条数据源选择规则的内容,并以应用程序的当前信息与选择条件进行逻辑匹配;
S203、步骤S202的匹配中,若选择条件满足,则取得该条数据源选择规则对应的选择结果;若选择条件不满足,则重复步骤S202读取下一条数据源选择规则并进行规则匹配;
S204、对得到选择结果获得库类别、库节点属性,以确定最终节点;
S205、根据库类别和最终节点,获取对应库的具体连接;
S206、若库类别为RW读写,则获得Primary主库的数据源连接,或从已有的连接池中获取连接;通过该数据源连接,执行待执行SQL,并将执行结果返回至应用程序;
S207、若库类别为RO只读,包括:
以待执行SQL语句文本整体或者以SQL语句文本的Hash散列值作为Key,从结果缓存中获取对应缓存;若从结果缓存中能获取到Value则缓存命中;否则缓存未命中;
若缓存命中,则以命中缓存的Value作为结果直接返回至应用程序,无需获取数据源连接,也无需执行SQL;该步骤中,若以序列化后的字符串作为Value则还需要反序列化;
若缓存未命中,则获得Slaver从库的数据源连接,或从已有的连接池中获取连接;通过该数据源连接,执行待执行SQL;若执行成功,将SQL执行结果保存至结果缓存中;无论SQL执行结果是否成功均将执行结果返回至应用程序。
6.根据权利要求5所述的一种数据库动态读写分离的方法,其特征在于,步骤S201中,所述当前信息包括当前应用程序名、功能点以及待执行SQL。
7.根据权利要求5所述的一种数据库动态读写分离的方法,其特征在于,步骤S204中,若库节点指定为“ANY”任意,则从该库类别下多个节点中,以随机方式或轮训的方式选其一个节点作为最终节点;
若库节点不是“ANY”任意而是具体指定的节点,则直接以其指定的节点作为最终节点。
8.一种数据库动态读写分离的系统,其特征在于,所述数据库包括Primary主库和多个Slaver从库,该系统包括:
加载初始规则组件,对读取的内容进行解析,并依序将解析后的各条数据源选择规则放入规则链存储组件中;
规则链存储组件,用于实现对数据源选择规则的存储;
动态调整规则组件,该动态调整规则组件通过对外暴露接口,以接收外部调用,并将接收的数据源选择规则放入规则链存储组件内,实现动态改变数据源选择规则;
选择引擎组件,按业务需求读取规则链存储组件中的数据源选择规则,在分析后选出该业务所需的数据源;
RW数据源管理组件,通过RW数据源管理组件实现对Primary主库的数据源连接或连接池的管理;
RO数据源管理组件,通过RO数据源管理组件实现对多个Slaver从库的数据源连接或连接池的管理。
9.根据权利要求8所述的一种数据库动态读写分离的系统,其特征在于,所述动态调整规则组件与中央配置单元联动同步,实现自动从中央配置单元获取最新规则;
所述中央配置单元可为Nacos、Spring Config Server以及ZooKeeper中的任意一种。
10.根据权利要求8所述的一种数据库动态读写分离的系统,其特征在于,所述的加载初始规则组件从配置文件中读取加载规则,并在解析后形成数据源选择规则;
所述规则链存储组件在应用程序中存储数据源选择规则,当应用程序启动时,将数据源选择规则加载到应用程序的内存中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311544041.2A CN117251500B (zh) | 2023-11-20 | 2023-11-20 | 一种数据库动态读写分离的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311544041.2A CN117251500B (zh) | 2023-11-20 | 2023-11-20 | 一种数据库动态读写分离的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117251500A true CN117251500A (zh) | 2023-12-19 |
CN117251500B CN117251500B (zh) | 2024-02-09 |
Family
ID=89126858
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311544041.2A Active CN117251500B (zh) | 2023-11-20 | 2023-11-20 | 一种数据库动态读写分离的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117251500B (zh) |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103942228A (zh) * | 2013-01-23 | 2014-07-23 | 纽海信息技术(上海)有限公司 | 规则引擎、计算方法、业务系统及调用方法 |
WO2016091069A1 (zh) * | 2014-12-12 | 2016-06-16 | 北京奇虎科技有限公司 | 一种数据操作方法及装置 |
WO2016126884A1 (en) * | 2015-02-05 | 2016-08-11 | Alibaba Group Holding Limited | System, method and database proxy server for separating operations of read and write |
WO2018199483A1 (ko) * | 2017-04-27 | 2018-11-01 | 삼성전자 주식회사 | 지능형 에이전트 관리 방법 및 장치 |
US20190026322A1 (en) * | 2017-07-23 | 2019-01-24 | AtScale, Inc. | Rule-based data source selection |
CN110297859A (zh) * | 2019-06-10 | 2019-10-01 | 恩亿科(北京)数据科技有限公司 | 处理实时数据的方法和装置 |
CN110321337A (zh) * | 2019-06-24 | 2019-10-11 | 南威互联网科技集团有限公司 | 一种实现数据库动态切换的方法及计算机可读存储介质 |
CN113835690A (zh) * | 2021-09-23 | 2021-12-24 | 中邮科通信技术股份有限公司 | 读写分离多数据源组件及其工作方法 |
WO2021259188A1 (zh) * | 2020-06-23 | 2021-12-30 | 阿里巴巴集团控股有限公司 | 路由读请求、反馈报文的方法以及各自装置、数据库 |
-
2023
- 2023-11-20 CN CN202311544041.2A patent/CN117251500B/zh active Active
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103942228A (zh) * | 2013-01-23 | 2014-07-23 | 纽海信息技术(上海)有限公司 | 规则引擎、计算方法、业务系统及调用方法 |
WO2016091069A1 (zh) * | 2014-12-12 | 2016-06-16 | 北京奇虎科技有限公司 | 一种数据操作方法及装置 |
WO2016126884A1 (en) * | 2015-02-05 | 2016-08-11 | Alibaba Group Holding Limited | System, method and database proxy server for separating operations of read and write |
WO2018199483A1 (ko) * | 2017-04-27 | 2018-11-01 | 삼성전자 주식회사 | 지능형 에이전트 관리 방법 및 장치 |
US20190026322A1 (en) * | 2017-07-23 | 2019-01-24 | AtScale, Inc. | Rule-based data source selection |
CN110297859A (zh) * | 2019-06-10 | 2019-10-01 | 恩亿科(北京)数据科技有限公司 | 处理实时数据的方法和装置 |
CN110321337A (zh) * | 2019-06-24 | 2019-10-11 | 南威互联网科技集团有限公司 | 一种实现数据库动态切换的方法及计算机可读存储介质 |
WO2021259188A1 (zh) * | 2020-06-23 | 2021-12-30 | 阿里巴巴集团控股有限公司 | 路由读请求、反馈报文的方法以及各自装置、数据库 |
CN113835690A (zh) * | 2021-09-23 | 2021-12-24 | 中邮科通信技术股份有限公司 | 读写分离多数据源组件及其工作方法 |
Also Published As
Publication number | Publication date |
---|---|
CN117251500B (zh) | 2024-02-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112000348B (zh) | 服务灰度发布的控制方法、装置、计算机设备 | |
CN112118565B (zh) | 多租户服务灰度发布方法、装置、计算机设备和存储介质 | |
US6915340B2 (en) | System and method for deriving future network configuration data from the current and previous network configuration data | |
US8065323B2 (en) | Offline validation of data in a database system for foreign key constraints | |
RU2531572C2 (ru) | Способ репликации баз данных и устройство обновления таблицы | |
US6237144B1 (en) | Use of relational databases for software installation | |
US7490167B2 (en) | System and method for platform and language-independent development and delivery of page-based content | |
US7275105B2 (en) | Enabling online and offline operation | |
US5751962A (en) | Object-based systems management of computer networks | |
JP3484779B2 (ja) | 名前サービス方式及び名前サービス方法 | |
EP0756725B1 (en) | Interface device and method | |
US20030093420A1 (en) | Method and system for retrieving sharable information using a hierarchically dependent directory structure | |
CN112148678B (zh) | 一种文件访问方法、系统、设备以及介质 | |
US11704114B2 (en) | Data structures for managing configuration versions of cloud-based applications | |
US20230072930A1 (en) | Database query splitting | |
CN102355499A (zh) | 云计算系统 | |
US10606805B2 (en) | Object-level image query and retrieval | |
US11892992B2 (en) | Unique identification management | |
CN106990974B (zh) | 一种app应用更新方法、装置及电子设备 | |
CN112000343B (zh) | 使用Devops在Kubernetes中部署多版本服务的方法及系统 | |
CN112835638A (zh) | 一种基于嵌入式应用程序的配置信息管理方法及装置 | |
CN117251500B (zh) | 一种数据库动态读写分离的方法 | |
JP3489216B2 (ja) | ファイルシステム | |
US11620285B2 (en) | Automatic database query translation | |
EP3436972A1 (en) | Multiform persistence abstraction |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40097161 Country of ref document: HK |