目录
启⽤dble的读写分离,需在 user.xml ⽂件中配置 rwSplitUser并指定对应的dbGroup即可。
<?xml version="1.0" encoding="UTF-8"?>
<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="rent" password="admin123" dbGroup="rentGroup" maxCon="100"/>
</dble:user>
/1.使用dble进行读写分离
2.dble分析sql将读发给从
3.rwSplitMode=0 直接分发到主实例
4.rwSplitMode=1 读操作必须在所有从实例中均衡
5.rwSplitMode=2 读操作在所有实例中均衡
6.rwSplitMode=3 读操作尽量在所有实例中均衡r
7.rwSplitMode=3 读操作尽量在所有实例中均衡,有从走从,没有走主
# 1.配置db.xml disabled="false" 改为false,true 是这个节点废弃了
# rwSplitMode="3" 读操作尽量在所有实例中均衡,有从走从,没有走主
<?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="rentGroup" rwSplitMode="3" delayThreshold="100">
<heartbeat>show slave status</heartbeat>
<dbInstance name="instanceM1" url="192.168.1.8:3306" user="root" password="admin123" maxCon="1000" minCon="10"
primary="true" readWeight="1" id="xx1">
<property name="testOnCreate">true</property>
</dbInstance>
<dbInstance name="instanceS1" url="192.168.1.9:3306" user="root" password="admin123" maxCon="1000" minCon="10" readWeight="2" disabled="false">
<property name="testOnCreate">false</property>
</dbInstance>
</dbGroup>
<!-- <dbGroup name="dbGroup2" rwSplitMode="0" delayThreshold="100" disableHA="true"> -->
<!-- <heartbeat errorRetryCount="1" timeout="10">show slave status</heartbeat> -->
<!-- <dbInstance name="instanceM2" url="192.168.1.9:3306" user="root" password="admin123" maxCon="1000" minCon="10"
primary="true"> -->
<!-- <property name="testOnCreate">true</property> -->
<!-- </dbInstance> -->
<!-- can have multi read instances -->
<!--<dbInstance name="instanceS2" url="ip4:3306" user="your_user" password="your_psw" maxCon="1000" minCon="10" usingDecrypt="true">-->
<!--<property name="testOnCreate">true</property>-->
<!--</dbInstance>-->
<!--</dbGroup> -->
</dble:db>
dble通过配置多个dbInstance为读操作提供负载均衡
# 重启
/var/lib/dble/bin/dble restart
# 查看日志
tail -f /var/lib/dble/logs/wrapper.log
tail -f /var/lib/dble/logs/dble.log
# 打开管理端接口 9066
firewall-cmd --zone=public --add-port=9066/tcp --permanent
firewall-cmd --zone=public --add-port=8066/tcp --permanent
firewall-cmd --reload
# 链接dble mysql客户端
mysql -h 192.168.1.10 -uman1 -P9066 -padmin123
# 数据端口8066 数据节点 用户名rent/dmin123
mysql -h 192.168.1.10 -urent -P8066 -padmin123
mysql -h 192.168.1.10 -urent -P8066 -padmin123
4.1测试读:
MySQL [(none)]> select @@server_id;select @@server_id;select @@server_id;select @@server_id;select @@server_id;select @@server_id;
4.2测试写:
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;
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 会在客⼾端拆分语句,⼀次只发送⼀条语句,故不会有该条限制 ;