作者:王娟
爱可生 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 实例。如下:
代码语言:javascript复制<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 。
代码语言:javascript复制<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/dble/discussions/3145