作者:王娟

爱可生 dble 团队测试成员,次要负责 dble 需要测试,自动化编写和社区问题解答。人狠话不多。

本文起源:原创投稿

*爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。


dble 从 3.20.10 版本开始⽀持单纯的读写拆散性能,能够和分库分表性能离开使⽤。

如何疾速领有读写拆散呢?

第一步,筹备好一组 mysql 实 例,并确保这组 mysql 实例的主从复制关系失常。如下应用一主二从的mysql:

主:172.100.9.6:3307

从:172.100.9.2:3307、172.100.9.3:3307

别离到2个从实例上执行 show slave status ,查看复制关系是否失常。

第二步,在 db.xml 配置 mysql 实例。如下:

<dbGroup rwSplitMode="1" name="ha_group1" delayThreshold="100">    <heartbeat>show slave status</heartbeat>    <dbInstance name="hostM1" password="******" url="172.100.9.6:3307" user="test" maxCon="1000" minCon="10" primary="true"/>    <dbInstance name="hostS1" password="******" url="172.100.9.2:3307" user="test" maxCon="1000" minCon="10" readWeight="1"/>    <dbInstance name="hostS2" password="******" url="172.100.9.3:3307" user="test" maxCon="1000" minCon="10" readWeight="1"/></dbGroup>


配置 dbGroup 时须要留神以下参数:

rwSplitMode: 读操作的负载平衡模式,可选值 0/1/2/3
在进⾏读负载平衡的时候会依据这个配置进⾏
0:不做平衡,间接散发到主实例,从实例将被疏忽,不会尝试建⽴连接池,但会有⼼跳连贯
1:读操作在所有从实例中平衡,当所有从实例都不可⽤时,下发语句会报错。
2:读操作在所有实例中平衡。
3:读操作在所有从实例中平衡,当所有从实例都不可⽤时,将语句发往主实例。

delayThreshold:指定主从提早阀值,单位秒,默认 -1 ,表⽰⽆提早
在进⾏读取负载平衡的时候会依据最近⼀次的⼼跳状态以及读库和主库的提早进⾏判断,如果主从复制不⼯作或者复制提早超过 delayThreshold 配置,则认为此节点不适宜进⾏读取,依赖于⼼跳语句为 show slave status 。如果 delayThreshold=-1 那么读负载平衡选取的时候不会进⾏提早检测。

readWeight:节点权重(负载平衡时候使⽤)
负载平衡过程中会查看所有节点的权重是否相等,如果不相等,那么就会依据权重来配置压⼒。该值需是⼤于等于 0 的整数。如果配为 0 表⽰该节点不参加读。需注意,总权重(所有节点权重之和)必须⼤于 0。

如何辨别读节点与写节点?

写节点:primary="true"

读节点:primary 没配置或者 primary="false"

第三步,user.xml减少读写拆散用户。通过dbGroup指定到db.xml里dbGroup的name。

<rwSplitUser name="rwSplit1" password="111111" dbGroup="ha_group1" />

第四步,到 dble 治理端执行 reload @@config_all ,使配置失效。这时就能够应用新创建的读写拆散用户 rwSplit1 登录 dble 了。

如何验证读写拆散配置是否失效呢?

别离到 3 个 mysql 实例执行:set global general_log = on ,开启 general log 。

应用 rwSplit1 用户登录 dble 8066 端口,执行以下 sql :

insert into test_table values (1, 'name1'),(2, 'name2');

select * from test_table;

查看写节点的 general log ,insert 语句发到写节点上。

分点查看 2 个读节点的 general log ,select 语句发到其中一个读节点上。

补充:

1、同时开启 dble 读写拆散和分库分表的性能时,分库分表引⽤的 dbGroup和 读写拆散引⽤的 dbGroup 必须互相独⽴。rwSplitUser 引⽤的 dbGroup ,仅需在 db.xml 中定义即可。

2、多个 rwSplitUser 能够引⽤同⼀个 dbGroup 。

3、dble 读写拆散哪些语句发往主实例,哪些语句发往从实例呢?参考:https://github.com/actiontech...