【本文正在参与炫“库”行动-人大金仓有奖征文】
活动链接: CSDN
1读写分离实现原理
读写分离: 通过JDBC驱动自动识SQL别语句读写种类,写语句发给主机,分发读语句到备机,从而实现读写分离。
通过让主数据库(master)处理写事务:增、改、删等操作(INSERT、UPDATE、DELETE),而从数据库(slave)分担处理读事务SELECT查询操作,从而提升集群对外整体处理性能。
2读写分离在事务中的处理
对于单个事务内的处理:如果事务中只有读操作,通过JDBC驱动将事务中的语句分发到Slave节点中执行;如果事务中只有写操作,通过驱动分发器将整个事务内的所有语句都分发到Master节点中执行;如果事务中开始是读,后续有写操作,则将开始的读操作分发到Slave节点中执行,直到写操作后,该事务中的所有SQL将在Master节点中执行;对于无法识别读写类型的,将发送到Master节点中执行。
对于多个事务并发的处理:此时由于有可能查询分发异步备机,而异步备机和主库之间可能存在数据差异,无法保证此时的数据强一致性,只能提供最终一致性。所以需要业务层能够处理这种弱一致性状态。
如果业务一定要强一致性,方法有一下几种:
1:把这种查询放在一个事务中写语句的后面,此时读语句只发给主机,直到事务结束。
2:把这种查询放在一个PLSQL块中,此时该语句被当做写处理,只会发给主机。
3:select后面加上for update,此时该语句被当做写处理,只会发给主机。
4:使用JDBC连接参数sendDelay控制异步备机的延时,每次在主库上执行写语句时,JDBC都会记录写语句执行的最新时间,每次分发异步备机时,都会去检查当前时间和写语句最后执行时间的差距是否小于指定的延时。如果小于指定延时,就跳过异步备机,直接交给主机执行。如果大于指定延时,则可以分发给异步备机。
3 负载均衡
JDBC可以通过参数控制读语句发给主机的比例,方便根据具体机器性能来分配负载。所有的Slave节点用于读操作,当我们读取操作较多时,驱动分发器将通过分发算法,将读操作均衡分布在所有正确的Slave节点中执行,降低Master节点负载,通过Slave节点负载均衡,提高查询性能。
4 性能提升
在读比例比较大的应用系统中,同步部署金仓的读写分离集群,能大大的提升数据库的响应能力,比如:应用系统中的读操作占了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 读写分离性能提升明显
备注:为方便对比测试,全部执行简单查询语句。
5 实现方案
JDBC读写分离目标是提供一种对应用透明的读写分离解决方案,在不改动应用的情况下实现读写分离方案,最大限度的提升系统性能。读写分离是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力。主数据库提供写操作,从数据库提供读操作,这样既避免了主数据库服务器(Master)的过载,也有效地利用了从数据库服务器(Slave)的资源。
分发器的主要目的是实现读/写分离的自动完成,避免读/写分离人工参与,实现读操作在备机上的均衡分布,达到负载均衡的目的。
6 读写分离配置例子
以下例子分别使用2种方式来建立读写分离的配置,以集群:node1[192.168.8.128:54321]、node2[192.168.8.223:54322]、node3[192.168.8.130:54323]为例:
6.1:只用连接串 开启JDBC读写分离 一主两备:
URL jdbc:kingbase8://192.168.8.128:54321/test?USEDISPATCH=true&SLAVE_ADD=192.168.8.223,192.168.8.130&SLAVE_PORT=54322,54323&nodeList=node1,node2,node3
6.2:连接串+配置文件 开启JDBC读写分离 一主两备:
URL jdbc:kingbase8://192.168.8.128:54321/test?ConfigurePath=jdbc.conf
jdbc.conf配置文件
#打开读写分离功能
USEDISPATCH=true
#备机地址
SLAVE_ADD=192.168.8.223,192.168.8.130
#备机端口
SLAVE_PORT=54321,54321
#指定各节点的名称,与主备机地址一一对应
nodeList=node1,node2,node3
#主机负载率,备机之间轮询平分
HOSTLOADRATE=33
【本文正在参与炫“库”行动-人大金仓有奖征文】
活动链接: CSDN