作者:赵佳慧
爱可生产品团队成员,主要负责公司运维平台的更新迭代。平时喜欢多了解其他技术,不断提升个人技能。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
一、功能介绍
本篇内容主要围绕分库分表中间件 DBLE v3.20.10.0 版本的新特性 “不分库分表的读写分离” 展开介绍。
在 v3.20.10.0 版本之前,DBLE 支持配置分库分表的前提下使用读写分离功能。v3.20.10.0 版本开始,DBLE 支持配置单纯的读写分离,即读写分离功能可以和分库分表功能分开,单独使用读写分离功能。在介绍新特性之前,我们先来回顾分库分表下的读写分离功能如何使用。
二、环境准备
验证分库分表下的读写分离功能之前,首先准备所需环境,基本信息如下:
服务器IP | 用途 | 版本 |
---|---|---|
10.186.64.40 | 部署DBLE服务 | 3.20.10.0 |
10.186.64.23 | 部署MySQL-M1 | 5.7.25 |
10.186.64.31 | 部署MySQL-S1 | 5.7.25 |
10.186.64.34 | 部署MySQL-S2 | 5.7.25 |
1、部署一主两从数据库组。
2、部署 DBLE 环境。
可参考 DBLE手 册中的 快速开始 。
3、编辑 DBLE 配置文件,配置好后端数据库组。
4、开启 MySQL 的 general.log ,用于验证 SQL 语句的下发。
三、使用分库分表的读写分离功能
1、配置分库分表的读写分离功能。
配置要点:
- 配置多个 dbInstance 为读操作提供负载均衡。
- rwSplitMode 配置不能为 0 。
重要配置内容:
user.xml
- shardingUser:分库用户配置
db.xml
show slave status
true
rwSplitMode:读操作的负载均衡模式(候选值0/1/2)
- 0:不做均衡,直接分发到主实例。
- 1:读操作在所有从实例中均衡,当所有从实例均不可用时,下发语句会报错。在v3.20.10前是会发往主实例。
- 2:读操作在所有实例中均衡。
Sharding.xml
2、使用 mysql client 登录 dble 客户端。
注意:需要使用分库用户。
3、在 db1 库中建表 t1 ,并插入数据。
create table t1(id int,c int);
insert into t1(id,c) values(1,1);
insert into t1(id,c) values(2,2);
insert into t1(id,c) values(3,3);
insert into t1(id,c) values(4,4);
insert into t1(id,c) values(5,5);
insert into t1(id,c) values(6,6);
4、下发查询 SQL 。
select * from t1 where id=1;
select * from t1 where id=3;
select * from t1 where id=5;
select * from t1 where id=2;
select * from t1 where id=4;
select * from t1 where id=6;
5、查看后端 MySQL 主实例的 general.log ,没有对 t1 表的读操作。
查看后端 MySQL 从实例的 general.log 。
查看后端 MySQL 另一个从实例的 general.log 。
6、综上,DBLE 将所有读操作转发到所有从实例,并在所有从实例中均衡。符合 rwSplitMode="1" 的配置预期。
四、单纯的读写分离功能
DBLE 单纯的读写分离功能与使用分库分表的读写分离功能,区别在于:前者仅需要在 user.xml 文件中配置 rwSplitUser ,并指定对应的 dbGroup 即可。当开启单纯的读写分离功能时,DBLE 不会加载 sharding.xml 配置,即 DBLE 不具备分库分表的功能。
下面我们进行新功能的配置及测试。
1、修改DBLE的配置文件。
配置要点:
- rwSplitUser引用的dbGroup,仅需在db.xml中定义即可。
- 一个rwSplitUser仅对应一个dbGroup。
- 多个rwSplitUser可引用同一个dbGroup。
user.xml:
- rwSplitUser:读写用户配置。
db.xml:
show slave status
true
2、使用 mysql client 登录 dble 客户端。
注意:需要使用读写用户。
由下图可见,DBLE 未使用分库分表功能,仅展示后端 MySQL 的数据库信息。
3、创建数据库db_3,在db_3中创建表t3并插入数据。
create database db_3;
create table t3(id int,c int);
insert into t3(id,c) values(1,1),(2,2),(3,3),(4,4);
4、下发查询 SQL 。
select * from t3 where id =1;
select * from t3 where id =2;
select * from t3 where id =3;
select * from t3 where id =4;
select * from t3 where id =3;
select * from t3 where id =2;
select * from t3 where id =1;
5、查看后端 MySQL 主实例的 general.log 。
查看后端 MySQL 从实例的 general.log 。
查看后端 MySQL 另一个从实例的 general.log 。
6、综上,DBLE 将所有读操作转发至所有实例,并在所有实例中均衡。符合 rwSplitMode="2" 的配置预期。