【数据库】达梦数据库读写分离的实现原理
实现读写分离集群的基本思路是:利用备库提供只读服务、无法修改数据的特性,优先将所有操作发送到备库执行,一旦备库执行报错,则发送到主库重新执行。通过备库“试错”这么一个步骤,自然地将只读操作分流到备库执行。并且,备库“试错”由接口层自动完成,对应用透明。
读写分离集群数据库连接创建流程:
1. 用户发起数据库连接请求。
2. 接口(JDBC、DPI 等)根据服务名配置(在 dm_svc.conf 中进行配置)登录主库。
3. 主库挑选一个有效即时备库的 IP/Port 返回给接口。
4. 接口根据返回的备库 IP 和 Port 信息,向备库发起一个连接请求。
5. 备库返回连接成功信息。
6. 接口响应用户数据库连接创建成功接口在备库上创建的连接是读写分离集群自动创建的;对用户而言,就是在主库上创建了一个数据库连接。下图以配置了两个备库的读写集群为例,说明了读写分离集群的连接创建流程。
读写分离集群语句分发流程:
1. 接口收到用户的请求。
2. 接口优先将 SQL 发送到备库执行。
3. 备库执行并返回执行结果。如果接口收到的是备库执行成功消息,则转到第 6 步,如果接口收到的是备库执行失败消息,则转到第 4 步。
4. 重新将执行失败的 SQL 发送到主库执行。只要第 3 步中的 SQL 在备库执行失败,则同一个事务后续的所有操作(包括只读操作)都会直接发送到主库执行。
5. 主库执行并返回执行结果给接口。一旦主库上执行的写事务提交,则下次继续从第1 步开始执行。
6. 接口响应用户并将执行结果返回给用户。
执行举例说明:
--数据准备
CREATE TABLE T(C1 INT);
--事务开始
SELECT * FROM T; --首先在备库上执行
INSERT INTO T VALUES(1); --写操作转移到主库上执行
SELECT * FROM T; --事务未提交,还在主库上执行
COMMIT; --事务提交
SELECT * FROM T; --事务已提交,重新转移到备库上执行
在实际应用过程中,用户可以在JDBC连接串中增加对应的属性来启用和设置读写分离功能,主要属性有以下两个:
rwSeparate 是否使用读写分离系统,默认 0;取值(0 不使用,1 使用)。
rwPercent 分发到主库的事务占主备库总事务的百分比,有效值 0~100,默认 值 25。
<DRIVER>dm.jdbc.driver.DmDriver</DRIVER> <URL>jdbc:dm://localhost:5236?rwSeparate=1&rwPercent=10</URL>

浙公网安备 33010602011771号