网站首页 > 教程分享 正文
当今世界,随着企业业务全面向数字化、在线化、智能化演进,应用场景日趋复杂和多样化。企业面临着指数级递增的海量存储需求,业务系统的压力越来越大。
对于数据库企业,面对单节点难以满足的业务需求,人大金仓提出了多种解决方案,其中读写分离集群应用于高并发场景,性能提升效果明显。下文,将针对金仓JDBC读写分离集群进行简单说明。
金仓JDBC读写分离集群原理
读写分离通过备机读负载均衡,降低主机上读负载,以此提高整个系统的吞吐量。
金仓JDBC读写分离主旨是通过JDBC驱动实现SQL读写分离,让DQL语句在多个节点间负载均衡,同时对应用透明,无需修改现有程序。
金仓JDBC通过在内部直接识别语句类型,记录事务状态等处理。把读语句负载均衡给集群中的多个节点执行,降低单节点的负载,提升数据库集群整体的吞吐量。
读写分离集群提升性能
主备节点各有分工 缓解争用现象
在事务处理过程中,以下四种操作分别对应不同节点执行:
1.如果只有读操作,通过JDBC驱动将事务中的语句分发到备节点中执行;
2.如果事务中只有写操作,通过驱动分发器将事务分发到主节点中执行;
3.如果事务中开始是读,后续有写操作,则将开始的读操作分发到备节点中执行,直到写操作后,该事务中的所有SQL将在主节点中执行;
4.对于TCL事务控制和SET会话参数设置语句发送给所有节点。
5.对于DCL语句只发送给主节点。
负载均衡 提升性能
针对不同的硬件性能,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。此功能开启需要同时开启读写分离功能。
socketTimeout = String
指定底层socket receive的超时时间,单位是秒,值可以为任意正整数,“0”表示没有超时,一 直等,直到返回,默认取值为:“0”。
最佳实践
以上参数大多使用默认值即可,也可根据需求进行修改。最简单的使用配置只需开启读写分离,然后配置主备机IP、Port即可。
请注意:读写分离的主备机的IP地址需要配置真实IP地址,不要配置VIP。因为VIP在切机后会造成新升主的IP和VIP其实指向了同一节点,造成重复连接,同时造成之前故障的旧主机重新恢复上线后,无法被识别。另外VIP并不可靠,可能出现丢失或VIP重复问题。
只使用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
常见问答
集群状态正常,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来控制超时时间。
主备切换后,备机rewind,或者备机故障后,备机恢复时为什么备机的连接数是持续上升,而不是一次性全部建好?
主备切换后,连接不是马上就全部建立起来的,而是应用确实调用到JDBC时,JDBC才会去判断集群是否切换了,重建连接,重发语句执行。所以连接数的恢复速度和应用操作JDBC负荷有关,通常是慢慢建立起来的,备机的连接会稍滞后于主机连接恢复速度,因为切机重发时,都是只要能找到新的主机就可以重发成功了,不会等到所有备机重启完成。只有等到下一次发送语句触发备机时,JDBC才会去检测备机是否已经起来了,如果未建起才会去重建备机连接。
主机切机后,应用第一次登陆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时连接才会全部断掉。
猜你喜欢
- 2024-10-14 Java之Spring4:JDBC(java之父余胜军网站)
- 2024-10-14 《JDBC》第09节:JDBC之DatabaseMetaData数据库元数据对象
- 2024-10-14 《JDBC》第18节:JDBC之数据库连接池Hikari的使用(软编码方式)
- 2024-10-14 flink教程-详解flink 1.11 中的JDBC Catalog
- 2024-10-14 肝!Spring JDBC持久化层框架“全家桶”教程
- 2024-10-14 JDBC的基础使用(jdbc 教程)
- 2024-10-14 大数据开发基础之JAVA基础-JDBC基础知识
- 2024-10-14 JDBC基础整理(jdbc 教程)
- 2024-10-14 小白都能看懂的JDBC事务(jdbc实现事务管理)
- 2024-10-14 Spring JdbcTemplate讲解(spring的jdbc模板)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)