单纯使用读写分离功能
- 3.20.10.0版本开始dble?持单纯的读写分离,可以和分库分表功能分开单独使?。
- 若想启?dble的读写分离,仅需在 user.xml ?件中配置 rwSplitUser并指定对应的dbGroup即可。
1、修改user.xml
配置文件
<dble:user xmlns:dble="http://dble.cloud/" version="4.0">
<managerUser name="man1" password="654321" maxCon="100"/>
<!-- <shardingUser name="root" password="123456" schemas="testdb" readOnly="false" maxCon="20"/>-->
<rwSplitUser name="rwsu1" password="123456" dbGroup="dbGroup1" maxCon="20"/>
</dble:user>
- 这?需要注意的是三种??配置的顺序是固定的。
- 当在user.xml中注释
shardingUser
用户时,dble不会加载sharding.xml配置文件,即dble不具备分库分表的功能。
2、修改db.xml
配置文件
<?xml version="1.0"?>
<!--
~ Copyright (C) 2016-2020 ActionTech.
~ License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher.
-->
<dble:db xmlns:dble="http://dble.cloud/" version="4.0">
<dbGroup name="dbGroup1" rwSplitMode="3" delayThreshold="100">
<heartbeat>show slave status</heartbeat>
<dbInstance name="instanceM1" url="10.186.65.68:3308" user="test" password="test" maxCon="1000" minCon="10"
primary="true" readWeight="2" id="xx1">
<property name="testOnCreate">true</property>
</dbInstance>
<dbInstance name="instanceS1" url="10.186.65.71:3308" user="test" password="test" maxCon="1000" minCon="10" readWeight="2" disabled="false">
<property name="testOnCreate">false</property>
</dbInstance>
<dbInstance name="instanceS2" url="10.186.65.72:3308" user="test" password="test" maxCon="1000" minCon="10" readWeight="2" disabled="false">
<property name="testOnCreate">false</property>
</dbInstance>
</dbGroup>
</dble:db>
- dble通过配置多个dbInstance为读操作提供负载均衡
3、重启DBLE
[root@study01 dble]# ./bin/dble restart
Stopping dble-server...
Stopped dble-server.
Starting dble-server...
4、测试读写分离
[root@study01 ~]# mysql -urwsu1 -p -h127.0.0.1 -P8066
Enter password:
#测试读:
MySQL [(none)]> select @@server_id;select @@server_id;select @@server_id;select @@server_id;select @@server_id;select @@server_id;
#测试写:
MySQL [(none)]> begin;
MySQL [(none)]> select @@server_id;select @@server_id;select @@server_id;select @@server_id;select @@server_id;select @@server_id;
MySQL [(none)]> commit;
5、读写分离功能限制
- druid 解析器限制 - 不?持set语句中存在特殊字符;
- druid 解析器限制 - set session transaction read write, isolation level repeatable read中,逗号后的语句不?效;
- 只读事务的?持;
- 不?持set transaction read write;
- select 语句现在的逻辑是都进?负载,还没有进?细节的区分,?如有些语句需要强制发主,如系统函数,系统表,系统变量;
- select ... into 或者 load data中存在??变量,通过dble再次查询该变量,变量值不对;
- 预编译语句和当前连接存在关联,使?会有问题;
- client连接dble时,若指定不存在的schema默认库,dble不会报错;
- 在会话中,删除正在使?的库,mysql会将当前库置为null,dble依然保留;
- prepared statament协议未测试,谨慎使?;
- set 语句?前只?持会话级别系统变量和??变量的设置,若需要设置密码等可以使?hint的?式设置或去后端节点去设置;
- 读写分离会打破原先的隔离级别;
- 创建临时表后,之后所有的语句都发往主,因为临时表不?持主从复制。直到你删除了所有临时表后,原先的负载均衡策略恢复;
- 部分客?端,?如 在设置了 allowMultiQueries=true (默认为 false) 的 jdbc,此时客?端可以?次性发送 multi-queries , dble 对此情况不做拆分,全部发往主。MySQL Command-Line client 会在客?端拆分语句,?次只发送?条语句,故不会有该条限制 ;