背景和目的
当前业务系统面临的业务压力越来越大,单节点已经难以满足现在和未来的业务需求。因此市面上出现了很多的解决方案,其中就包括读写分离集群。读写分离通过备机读负载均衡,降低主机上读负载,以此提高整个系统的吞吐量。
金仓JDBC读写分离主旨是通过JDBC驱动实现SQL读写分离,让DQL语句在多个节点间负载均衡。同时对应用透明,无需修改现有程序。
金仓JDBC通过在内部直接识别语句类型,记录事务状态等处理。把读事务中的读语句负载均衡给集群中的多个节点执行,降低单节点的负载,提升数据库集群整体的吞吐量。
读写分离尤其适用于读多写少的OA系统,配合金仓的一主多备集群,在高并发时,性能提升明显。

读写分离在事务中的处理
如果事务中只有读操作,通过JDBC驱动将事务中的语句分发到备节点中执行;如果事务中只有写操作,通过驱动分发器将事务分发到主节点中执行;如果事务中开始是读,后续有写操作,则将开始的读操作分发到备节点中执行,直到写操作后,该事务中的所有SQL将在主节点中执行;对于无法识别读写类型的,将发送到主节点中执行。
读负载均衡
JDBC可以通过参数控制读语句发给主机的比例,方便根据具体机器性能来分配负载。所有的备机节点用于读操作,当我们读取操作较多时,驱动分发器将通过分发算法,将读操作均衡分布在所有正确的备机节点中执行,降低主节点负载,通过备节点负载均衡,提高查询性能。
性能提升
在读比例比较大的应用系统中,同步部署金仓的读写分离集群,能大大的提升数据库的响应能力,比如:某个应用系统中的读操作占了70%,则通过部署3节点的读写分离集群,能将数据库的整体性能(事务吞吐量)提高2倍左右;随着读操作的比例越高,性能提升倍数约趋向于节点数。
性能测试结果对比:
Jmeter 执行100万次select查询操作

一主两备
连接配置方式 Throughput(持续3分钟) 并发连接数(线程数)
单机,不使用读写分离 9749.11 50
使用中间代理kingbasecluster读写分离 6478.32 50
使用 JDBC读写分离 25731.95 50
JDBC读写分离对比单机性能提升1.5倍。
JDBC读写分离对比kingbasecluster性能提升3倍。
Throughput曲线图:
由此图可以看出JDBC 读写分离性能提升明显
备注:为方便对比测试,全部执行简单查询语句。

透明故障转移
当数据库集群中出现某个节点宕机或者网络中断等问题时,金仓的数据库集群可以自动恢复。同时金仓JDBC会自动重建连接和自动判断主备状态,在非写事务状态下,JDBC还可以自动重发失败语句,直至成功,从而最大程度保障上层应用服务连续。
参数配置
ConfigurePath = String
指定配置文件的路径,只能在连接串中配置,值为null时,不读取配置文件,默认取值为:null。当连接参数较多时,可通过配置文件配置连接参数。当文件中配置的连接参数与URL中的参数重复时,会覆盖掉URL中的参数值。
USEDISPATCH = Boolean
指定是否使用读写分离功能,默认取值为:false。此配置项关闭JDBC就变成单机JDBC,无读写分离功能。
TransactionDispatchStrategy = String
指定事务中的分发策略,1表示事务都不分发,2表示事务中的写语句之前的读语句可以分发,默认取值为:“2”。此功能开启需要同时开启读写分离功能。
HOSTLOADRATE = String
指定主机的读语句负载率,默认取值为:“0”。此功能开启需要同时开启读写分离功能。根据当前发给主机的语句数目与总语句数目的比例与HOSTLOADRATE设置的比例进行比较,当前者大于后者时,发给备机,否则发给主机,当总语句数目达到Integer.MAX_VALUE时,用当前分发的实际比例的分子分母更新当前发给主机的语句数目与总语句数目。
SLAVE_ADD = String
指定备机地址,可指定多个,用“,”隔开。此功能开启需要同时开启读写分离功能。
SLAVE_PORT = String
指定备机端口,与备机地址对应,可指定多个,用“,”隔开。此功能开启需要同时开启读写分离功能且设置备机地址。
RETRYTIMES = String
指定失败重发的最高次数,默认取值为:“10”。此功能开启需要同时开启读写分离功能。
RETRYINTERVAL = String
指定每次失败重发之间的时间间隔,单位是秒,默认取值为:“5”。此功能开启需要同时开启读写分离功能且重试次数大于0。
forwardStandby = Boolean
指定发送给备机的语句如果出现I/O错误,是否优先将错误语句转发给其他备机,默认值为false。 此功能开启需要同时开启读写分离功能。
WhiteList = String
WhiteList指定只读函数列表,可指定多个,各个函数之间用分号分隔,如:WhiteList=MAX;COUNT;AVG 这样,默认取值为:null。 目前只支持函数名字的比较,不支持函数名重载的区分。此功能开启需要同时开启读写分离功能。
BlackList = String
默认情况下认为函数都是只读的,BlackList指定写函数列表,可指定多个,各个函数之间用分号分隔,如:BlackList=updateXXX;writeXXX 这样,默认取值为:null。 目前只支持函数名字的比较,不支持函数名重载的区分。不与WhiteList同时配置,与WhiteList同时配置时,只有BlackList生效。此功能开启需要同时开启读写分离功能。
MasterFunctionList = String
指定只发主机,但不改变事务状态的函数语句列表,可指定多个,各个函数之间用分号分隔,如:MasterFunctionList=updateXXX;writeXXX 这样,默认取值为:null。 目前只支持函数名字的比较,不支持函数名重载的区分。此功能开启需要同时开启读写分离功能。
TempTable = String
指定临时表,如果是查询临时表的查询语句,则只发主机且不改变事务状态。可指定多个,各个表名之间用分号分隔,如:aaa;bbb这样,默认取值为:null。 此功能开启需要同时开启读写分离功能。
BlackSqlList = String
指定只发主机,但不改变事务状态的sql语句列表,可指定多个,各个语句之间用分号分隔,如:BlackSqlList=SET TRANSACTION READ WRITE;BEGIN READ WRITE 这样,默认取值为:null。 此功能开启需要同时开启读写分离功能。
最佳实践
以上参数大多使用默认值即可,也可根据需求进行修改。最简单的使用配置只需开启读写分离,然后配置主备机IP、Port即可。
只使用URL进行配置一主两备集群
jdbc:kingbase8://192.168.8.128:54321/TEST?USEDISPATCH=true&SLAVE_ADD=192.168.8.129,192.168.8.130&SLAVE_PORT=54321,54321
使用URL+配置文件进行配置一主两备集群
jdbc:kingbase8:TEST?ConfigurePath=/home/test/jdbc.conf

jdbc.conf配置文件例子:
USEDISPATCH=true
HOST=192.168.8.128
PORT=54321
SLAVE_ADD=192.168.8.129,192.168.8.130
SLAVE_PORT=54321,54321
FAQ
a. 集群状态正常,sockettimeout设置大于0时,为什么执行时间超长的事务会失败并导致jdbc重建连接?
答:sockettimeout是控制底层socket超时返回的最长时间,默认是0,即没有超时无限等待。如果指定大于0的值,意思就是最多等待sockettimeout的时间,socket的receive操作就会返回。这主要是用来防止当server掉线时,client端socket的receive操作会一直等待。但是这会带来副作用,就是如果一条语句真的执行很长时间超过了sockettimeout的值时,会被认为是超时而中断receive返回超时错误。如果是在读写分离状态下,超时会造成重建连接重发语句。此时需要根据用户的语句最长执行时间来设置sockettimeout或者设置为0一直等待。如果应用自己有防这种JDBC操作一直不返回的机制,JDBC调用不返回,应用会有自己的超时控制,那就不需要JDBC设置sockettimeout,让应用自己控制超时时间就好。如果应用没有这种防止机制,一个JDBC操作不返回就会造成应用完全卡死,那就需要设置JDBC的sockettimeout值,让JDBC来控制超时时间。
b. 主备切换后,备机rewind,或者备机故障后,备机恢复时为什么备机的连接数是持续上升,而不是一次性全部建好?
答:主备切换后,连接不是马上就全部建立起来的,而是应用确实调用到JDBC时,JDBC才会去判断集群是否切换了,重建连接,重发语句执行。所以连接数的恢复速度和应用操作JDBC负荷有关,通常是慢慢建立起来的,备机的连接会稍滞后于主机连接恢复速度,因为切机重发时,都是只要能找到新的主机就可以重发成功了,不会等到所有备机重启完成。只有等到下一次发送语句触发备机时,JDBC才会去检测备机是否已经起来了,如果未建起才会去重建备机连接。
c. 主机切机后,应用第一次登陆WEB慢,JDBC等待时间分析。
答:局域网内测试拔网线切机后的过程:
1集群的新主机起来可连接后;
2应用用户登录WEB;
3使用连接池中已经有的JDBC连接(主机的连接都已经失效,备机的rewind之前都还在);
4发送SQL;
5 (I /O Error 20秒)收到错误返回; 6重建JDBC连接(sleep 5秒); 7(在线0.1秒返回)+(不在线的需要10秒返回)。重建连接完成开始执行登陆SQL返回,总计35秒左右。
其中 (不在线的需要10秒返回) 这个可以通过connectTimeout 参数控制connect超时时间,默认是10秒。 其中 (sleep 5秒) 这个可以通过RETRYINTERVAL参数控制重建连接的间隔时间,默认是5秒。 其中 (I /O Error 20秒) 这个可以通过socketTimeout参数控制receive的超时时间,默认是0无限等待。备机的连接不是马上断掉,而是在一段时间内都还可以使用,等到rewind时连接才会全部断掉。
更多内容获取请访问金仓社区官网
https://www.kingbase.com.cn/index/download/c_id/401.html

干货丨金仓JDBC读写分离介绍和最佳实践相关推荐

  1. 金仓数据库 MySQL 至 KingbaseES 迁移最佳实践(3. MySQL 数据库移植实战)

    3. MySQL 数据库移植实战 由于 KingbaseES 利用 KDTS-PLUS 等多种工具简化移植过程. 本节重点描述了在实际应用中移植一个 MySQL 数据库系统的完整过程,以及其中的主要移 ...

  2. 金仓数据库 Oracle至KingbaseES迁移最佳实践(2. 概述)

    2. 概述 本章节包含以下内容: Oracle兼容特性概览 相关技术资源 2.1. Oracle兼容特性概览 通常,异构数据库移植的工作量繁重.这些工作量主要来源于:在数据类型.SQL语言.PL/SQ ...

  3. 金仓数据库KingbaseES物理备份恢复最佳实践(数据恢复解决方案)

    为了预防上述故障的发生,同时提升数据的高可用性,KingbaseES 提供了sys_rman物理备份恢复工具,该工具集成了WAL文件归档.PITR恢复等功能,实现了自动化定时备份以及灵活多样化的恢复, ...

  4. MySQL读写分离介绍及搭建

    MySQL读写分离介绍及搭建 转载于:https://www.cnblogs.com/gotodsp/p/6511297.html

  5. MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 转载

    http://heylinux.com/archives/1004.html MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛 ...

  6. 技术干货 | 人大金仓KFS精准过滤和分片并行入库技术解析

    "技术干货"是人大金仓推出的系列主题内容.本期展示的是人大金仓KFS V2.0通过精准过滤和基于表的分片并行入库特性来提升数据的入库效率,打破传统数据同步性能瓶颈,为用户提供极致高 ...

  7. SpringBoot + Sharding JDBC 读写分离、分库分表

    Sharding-JDBC 最早是当当网内部使用的一款分库分表框架,到2017年的时候才开始对外开源,这几年在大量社区贡献者的不断迭代下,功能也逐渐完善,现已更名为 ShardingSphere,20 ...

  8. 技术干货 | 人大金仓KFS基于分区索引的分片入库技术解析

    在之前的文章<技术干货:人大金仓KFS精准过滤和分片并行入库技术解析>中,KFS利用分片并行入库技术,解决了某金融POC数据同步项目中数据入库持续积压问题.经过优化后,在200并发的压测场 ...

  9. 干货|为什么Kafka不支持读写分离

    在 Kafka 中,生产者写入消息.消费者读取消息的操作都是与 leader 副本进行交互的,从 而实现的是一种主写主读的生产消费模型.数据库.Redis 等都具备主写主读的功能,与此同时还支持主写从 ...

最新文章

  1. LeetCode 965 Univalued Binary Tree--判断二叉树的所有节点的值是否相同--python,java解法
  2. java vector内存结构_Java 数据结构
  3. Jquery知识小点备注
  4. c++ fstream用得多不?_护肤品在精不在多,简单3步:用对产品皮肤好,真正会护肤的都懂...
  5. php 中set是什么_php中set
  6. mac怎么合并两个容器_Mac怎么合并文件夹?macz不容错过的苹果mac教程分享
  7. linux 子shell
  8. 一本书,给你把卷积神经网络(CNN)安排得明明白白
  9. Haskell 开发平台安装及Hello World
  10. GOPS2016全球运维大会•上海站进入倒计时 最全参会攻略震撼来袭
  11. 【2022刷题】受伤的皇后
  12. wordpress修改后台站点地址后无法打开的解决办法
  13. JavaEye论坛热点推荐-2009年1月
  14. php皮肤程序,2020修复升级版PHP全新皮肤界面点赞任务系统平台源码运营版,仿众人帮蚂蚁帮扶牛帮...
  15. php cli python,PHP MVC框架 CodeIgniter CLI模式简介
  16. 度小满联合北大光华聚焦超级关联网络,硬技术能否改变行业风向?
  17. ACE网络编程开发网
  18. Android日记本报告,「最美应用」这款极简主义者的日记本,终于有了 Android 版...
  19. 基于jsp+mysql+Spring+mybatis的SSM图书馆座位预约管理系统文末附下载地址
  20. 北大青鸟ACCP4.0上机考试评分标准

热门文章

  1. element ui el-autocomplete 组件 value-key 属性
  2. 人工智能“大杀器”GPT-3遭严重质疑:它其实是在“胡言乱语”,OpenAI违背科学伦理
  3. java抽奖概率抽奖
  4. 华中科技大学计算机学院有调剂名额吗,2017华中科技大学计算机学院考研调剂公告...
  5. 中国第三方输入法行业发展趋势如何?看这篇报告就够了
  6. deepin note
  7. 怎么将网站由http变为https
  8. 国外LEAD联盟win系统去哪里下载
  9. 相同周长的图形,面积最大者是圆
  10. 红外热像仪方便研发合理布局