暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

金仓数据库 JDBC 透明读写分离实战

原创 严少安 2025-10-02
296

前情概要

之前介绍过金仓数据库 KES RWC 集群,具备对应用透明的读写负载均衡能力。但真的可以代码零改动减轻主库的读负载压力,实现更高查询吞吐,具体需要如何配置,本文将加以介绍说明。

2025 第 4 期产品体验官开始了,这也是总第 10 期了,所以本期稍微上了点强度,金仓社区贴心准备几篇参考资料,链接放在阅读原文了,各位体验官速来出手吧!

转发送好礼!欢迎转发本文,并在本文评论你的金仓社区昵称以及参与了几期产品体验官,即可参与抽奖。开奖时间:10月24日,通过 #视频号:少安事务所 直播抽奖。奖品为纸质书《金仓数据库KingbaseES DBA实践》或金仓定制盲盒手办,本文阅读量<500送出一份,本文阅读量>500后每增加200加送一份。

#KINGBASE 如果你还没有金仓社区的账号,快来注册:https://bbs.kingbase.com.cn/register 记得填写邀请人:18185

20251002_154134.png

正文开始。下面分三个部分进行介绍。

  1. 使用 KConsole 部署读写分离集群
  2. 读写分离集群的 JDBC 配置项
  3. 准备 HyBench 性能测试工具
  4. 使用 HyBench 对 KES RWC 集群进行测试

01 使用 KConsole 部署读写分离集群

本文使用 KingbaseES 数据库最新全市场版本 KingbaseES V9R1C10。你可从金仓数据库官方网站的下载中心进行下载试用。

https://www.kingbase.com.cn/download.html

金仓数据库管控工具(KConsole)是专门为 KingbaseES 设计的管控平台,从 KingbaseES V009R001C010 版本引入。通过图形化界面,将原本需要专业 DBA 技能的操作转化为直观的可视化操作,大幅降低了数据库管理的门槛。KConsole 支持单实例和读写分离集群的统一管控,实现了运维操作的标准化和自动化,提升了数据库管理效率。

Linux 系统下,运行命令 kconsole.sh 启动 KConsole 图形化界面。

配置过程确实门槛更低了,具体步骤可以参考官方文档:

https://docs.kingbase.com.cn/cn/KES-V9R1C10/reference/tools/%E8%BF%90%E7%BB%B4%E7%AE%A1%E7%90%86/kconsole#%E9%83%A8%E7%BD%B2%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB%E9%9B%86%E7%BE%A4

集群部署成功后,查看节点信息。

你还可以继续使用 KConsole 扩展集群,增加读节点。



到此,由一个主节点、一个备节点的读写分离集群已创建完成。

02 读写分离集群的 JDBC 配置项

以往的项目中,想要实现读写分离或者读流量负载均衡,往往需要引入 Proxy 层中间件,对 SQL 解析、路由进行定制配置,这无疑会导致延迟增加,造成性能损耗。或者对应用代码进行大改,事务性 SQL 发送到写节点,只读查询发送到只读节点,改造成本倍增。即便是云原生模式,强一致性读往往被绑定到主节点,读扩展困难。

金仓数据库已经把读写分离做成数据库端的一项内置能力,通过 JDBC 驱动把路由逻辑下沉到客户端,既省掉中间件,又无需改业务代码。一句话:业务还是那条业务,驱动里悄悄把读 SQL 扔给了备机。

金仓数据库 KES RWC 集群提供了四种读写分离配置,适用于不同场景。

配置 概念 适用场景
读写分离最大性能 不考虑备机数据延迟造成的主备不一致问题,所有节点均可承担读负载。 应用对强一致性不要求,比如历史报表业务;或者应用有自己的处理规避方式,比如影响业务逻辑的关键查询都放在一个事务内的DML语句后面。
读写分离(读已提交)最大一致性 需要考虑备机数据延迟造成的主备不一致问题,只有强同步或主节点可承担读负载。 应用需要强一致性,比如严格依赖查询数据做后面的逻辑分支处理,一个事务插入,后一个事务马上查询这条数据,此时就会需要严格一致性。
读写分离(可重复读)最大一致性 一个事务内的两次相同查询需要获得的数据是完全一致的,此时不能分发,只能全部走主机,备机节点此时无法承担读负载,只用作数据备份,不对外提供服务。 应用原来就依赖于严格的RP做业务处理。
读写分离多集群 应用配置多数据源时,每个数据源都可以是不同的读写分离集群。 业务需要同时连接多个不同的RWC集群时,可以通过配置多个JDBC连接串达到,通常多个连接串会配置到业务使用的第三方连接池的数据源配置中。

本例中,采用默认配置部署 RWC 集群,主备之间为同步模式。

在应用层只需修改 JDBC 配置项,即可实现读写流量分离。具体配置项有如下几个。

# 打开读写分离功能
USEDISPATCH=true
# 其他备机 IP
SLAVE_ADD=ip1,ip2,ip3
# 其他备机端口
SLAVE_PORT=54321,54321,54321
# 各节点名称,repmgr cluster show 命令查询出的 Name 字段
nodeList=node1,node2,node3
# 主机负载率,备机之间轮询平分
HOSTLOADRATE=33
# 可分发节点选择列表策略
# 1 表示所有在线节点均可分发,2 表示只分发主节点和同步备机节点
# 默认取值为:'1'
readListStrategy=1

正常 JDBC 配置为:

jdbc:kingbase8://192.168.43.92:54321/test?useUnicode=true&characterEncoding=utf-8

修改为支持读写分离模式:

jdbc:kingbase8://192.168.43.90:54321/test?useUnicode=true&characterEncoding=utf-8&USEDISPATCH=true&SLAVE_ADD=192.168.43.90,192.168.43.91&SLAVE_PORT=54321,54321&nodeList=node1,node1,node2&HOSTLOADRATE=33

更多细节介绍可参阅文档:

https://docs.kingbase.com.cn/cn/KES-V9R1C10/application/client_interface/Java/Jdbc/jdbc-11/#%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB%E8%AF%BB%E5%B7%B2%E6%8F%90%E4%BA%A4%E6%9C%80%E5%A4%A7%E4%B8%80%E8%87%B4%E6%80%A7

03 准备 HyBench 性能测试工具

Hybench 是一款由中国软件评测中心、清华大学联合牵头,多家数据库厂商共同研发的 HTAP 数据库基准测试工具。

Hybench 针对 HTAP 数据库技术特点,参考实际典型应用场景进行设计,数据模型采用在线金融交易分析场景,提供 OLTP、OLAP、OLXP 三类典型 HTAP 负载,支持不同规模的数据集,可以计算出 TPS、QPS、XPS、新鲜度等不同维度的评价指标,最终给出统一评价指标 H-Score。为数据库厂商和第三方评测机构提供HTAP数据库基准性能的评价方法及工具,引导 HTAP 数据库的技术研究方向,帮助用户进行 HTAP 数据库选型。

项目地址:https://gitee.com/cstc2023/hybench

Hybench 工具已经编译成 Jar 包,只需将整个项目下载到本地,配置好 Java 环境变量即可使用。hybench 执行程序的是 Shell 脚本,里面配置了 Java 环境变量,需要配置 JDK 17。

你可以从这里下载 JDK 17 的二进制包 jdk-17.0.15_linux-x64_bin.tar.gz

https://www.oracle.com/java/technologies/javase/jdk17-0-13-later-archive-downloads.html

查看 hybench

[shawnyan@rl9 hybench-master]$ cat hybench
export JAVA_HOME=/home/shawnyan/jdk-17.0.15
export PATH=$JAVA_HOME/bin:$PATH

java -cp ./lib/*:. com.hybench.HyBench $*
[shawnyan@rl9 hybench-master]$

接下来,我们使用 hybench 验证 RWC 集群读写分离。

04 使用 HyBench 对 KES RWC 集群进行测试

  1. 创建数据库连接配置文件。

创建新配置文件,用于连接到 KES 数据库。

[shawnyan@rl9 hybench-master]$ cat conf/kes.prop
db=postgres
classname=com.kingbase8.Driver
username=system
password=
url=jdbc:kingbase8://192.168.43.92:54321/test?useUnicode=true&characterEncoding=utf-8

#url_ap=jdbc:kingbase8://192.168.43.92:54321/test?useUnicode=true&characterEncoding=utf-8
url_ap=jdbc:kingbase8://192.168.43.90:54321/test?useUnicode=true&characterEncoding=utf-8&USEDISPATCH=true&SLAVE_ADD=192.168.43.90,192.168.43.91&SLAVE_PORT=54321,54321&nodeList=node1,node1,node2&HOSTLOADRATE=33
classname_ap=com.kingbase8.Driver
username_ap=system
password_ap=
...
  1. 使用 hybench 生产测试数据。

执行命令,生成测试数据。

./hybench -t gendata -c conf/kes.prop

查看生成的文件。

[shawnyan@rl9 hybench-master]$ ll -h Data_1x/
total 517M
-rw-r--r-- 1 shawnyan shawnyan  14M Oct  1 22:05 checkingAccount.csv
-rw-r--r-- 1 shawnyan shawnyan  34M Oct  1 22:05 checking.csv
-rw-r--r-- 1 shawnyan shawnyan 313K Oct  1 22:05 company.csv
-rw-r--r-- 1 shawnyan shawnyan  36M Oct  1 22:05 customer.csv
-rw-r--r-- 1 shawnyan shawnyan  34M Oct  1 22:05 loanApps.csv
-rw-r--r-- 1 shawnyan shawnyan  44M Oct  1 22:05 loanTrans.csv
-rw-r--r-- 1 shawnyan shawnyan  14M Oct  1 22:05 savingAccount.csv
-rw-r--r-- 1 shawnyan shawnyan 343M Oct  1 22:05 transfer.csv
[shawnyan@rl9 hybench-master]$
  1. 创建测试表。

运行生成表结构的命令:

./hybench -t sql -f conf/ddl_pg.sql -c conf/kes.prop
./hybench -t sql -f conf/create_index_kes.sql -c conf/kes.prop

连接到 KES 查看表。

[kingbase@rl9 ~]$ ksql -U system -d test -c '\d'
                  List of relations
 Schema |          Name           |   Type   | Owner
--------+-------------------------+----------+--------
 public | checking                | table    | system
 public | checking_seq            | sequence | system
 public | checkingaccount         | table    | system
 public | company                 | table    | system
 public | customer                | table    | system
 public | loanapps                | table    | system
 public | loanapps_seq            | sequence | system
 public | loantrans               | table    | system
 public | loantrans_seq           | sequence | system
 public | savingaccount           | table    | system
 public | sys_stat_statements     | view     | system
 public | sys_stat_statements_all | view     | system
 public | transfer                | table    | system
 public | transfer_seq            | sequence | system
(14 rows)
  1. 导入测试数据。
cd Data_1x
ksql -U system -d test

\copy checkingAccount from 'checkingAccount.csv' CSV DELIMITER ',' ;
\copy checking from 'checking.csv' CSV DELIMITER ',' ;
\copy company from 'company.csv' CSV DELIMITER ',' ;
\copy customer from 'customer.csv' CSV DELIMITER ',' ;
\copy loanApps from 'loanApps.csv' CSV DELIMITER ',' ;
\copy loanTrans from 'loanTrans.csv' CSV DELIMITER ',' ;
\copy savingAccount from 'savingAccount.csv' CSV DELIMITER ',' ;
\copy transfer from 'transfer.csv' CSV DELIMITER ',' ;

输出结果。

test=# \copy checkingAccount from 'checkingAccount.csv' CSV DELIMITER ',' ;
COPY 302000
test=# \copy checking from 'checking.csv' CSV DELIMITER ',' ;
COPY 600000
test=# \copy company from 'company.csv' CSV DELIMITER ',' ;
COPY 2000
test=# \copy customer from 'customer.csv' CSV DELIMITER ',' ;
COPY 300000
test=# \copy loanApps from 'loanApps.csv' CSV DELIMITER ',' ;
COPY 600000
test=# \copy loanTrans from 'loanTrans.csv' CSV DELIMITER ',' ;
COPY 600000
test=# \copy savingAccount from 'savingAccount.csv' CSV DELIMITER ',' ;
COPY 302000
test=# \copy transfer from 'transfer.csv' CSV DELIMITER ',' ;
COPY 6000000
test=#
  1. 运行 AP 负载测试。
./hybench -t runap -f conf/stmt_oracle.toml -c conf/kes.prop

测试结果。

单节点承接 AP 负载(1,2,4 并发)。

====================Test Summary========================
Test starts at 2025-10-01 23:07:30
Test ends at 2025-10-01 23:08:31
AP Concurrency is 1
TP Concurrency is 0
Total amount of AP Queries is 871
QPS is 14.42

====================Test Summary========================
Test starts at 2025-10-01 23:09:27
Test ends at 2025-10-01 23:10:28
AP Concurrency is 2
TP Concurrency is 0
Total amount of AP Queries is 1482
QPS is 24.66

====================Test Summary========================
Test starts at 2025-10-01 23:12:22
Test ends at 2025-10-01 23:13:23
AP Concurrency is 4
TP Concurrency is 0
Total amount of AP Queries is 1729
QPS is 28.67

双节点承接 AP 负载(4,8 并发)。

====================Test Summary========================
Test starts at 2025-10-02 01:16:25
Test ends at 2025-10-02 01:17:26
AP Concurrency is 4
TP Concurrency is 0
Total amount of AP Queries is 2080
QPS is 34.12

====================Test Summary========================
Test starts at 2025-10-02 01:37:46
Test ends at 2025-10-02 01:38:49
AP Concurrency is 8
TP Concurrency is 0
Total amount of AP Queries is 2314
QPS is 37.51

在两个节点都可以观察到读操作。

[kingbase@kes1 ~]$ ps aux | grep SEL
kingbase  114668 20.2  7.2 1699544 566488 ?      Rs   01:40   0:08 kingbase: system test 192.168.43.90(49176) SELECT
kingbase  114671 23.5  7.2 1698040 566096 ?      Rs   01:40   0:09 kingbase: system test 192.168.43.90(49220) SELECT
kingbase  114674 27.0  7.2 1698056 566328 ?      Rs   01:40   0:11 kingbase: system test 192.168.43.90(49242) SELECT
kingbase  114675 22.9  7.2 1699540 566560 ?      Rs   01:40   0:09 kingbase: system test 192.168.43.90(49256) SELECT
kingbase  115027  0.0  0.0 221796  2304 pts/4    S+   01:41   0:00 grep --color=auto SEL
[kingbase@kes1 ~]$

[kingbase@kes2 ~]$ ps aux | grep SEL
kingbase   72206 35.5  7.2 1701272 568688 ?      Rs   01:42   0:12 kingbase: system test 192.168.43.90(17844) SELECT
kingbase   72209 30.2  7.1 1695796 563920 ?      Rs   01:42   0:10 kingbase: system test 192.168.43.90(17890) SELECT
kingbase   72210 31.3  7.3 1710340 576828 ?      Rs   01:42   0:11 kingbase: system test 192.168.43.90(17906) SELECT
kingbase   72211 35.1  7.1 1695480 563752 ?      Rs   01:42   0:12 kingbase: system test 192.168.43.90(17922) SELECT
kingbase   72212 24.7  7.1 1694664 562652 ?      Rs   01:42   0:08 kingbase: system test 192.168.43.90(17930) SELECT
kingbase   72626  0.0  0.0 221664  2176 pts/1    S+   01:43   0:00 grep --color=auto SEL
[kingbase@kes2 ~]$

到此,整个测试流程已打通,但由于机器资源有限,性能测试数据很不理想,但可观察到 QPS 数据有明显提升,反应出查询吞吐量确有提升。

总结

金仓数据库通过 JDBC 透明读写分离,把原本需要“专业 DBA+中间件团队+应用重构”三座大山,浓缩成“一个 URL 参数”微调,极大提升人效比。如果你的系统正被报表查询拖慢、被大量只读请求挤占 CPU,不妨花点时间,用 KConsole 将单节点升级为 KingbaseES 读写分离集群,把读流量交给备机。性能提升,原来可以如此简单。

Have a nice day ~


🌻 往期精彩 ▼

– / END / –

👉 欢迎关注我的视频号

👉 这里有得聊

如果对国产基础软件(操作系统、数据库、中间件)感兴趣,可以加群一起聊聊。
关注微信公众号:少安事务所,后台回复[群],即可看到入口。

如果这篇文章为你带来了灵感或启发,请帮忙『三连』吧,感谢!ღ( ´・ᴗ・` )~

最后修改时间:2025-10-03 07:32:39
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论