分布式 | DBLE 新特性之脱离分库分表的读写分离

算法分
• 阅读 1749

作者:赵佳慧

爱可生产品团队成员,主要负责公司运维平台的更新迭代。平时喜欢多了解其他技术,不断提升个人技能。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


一、功能介绍

本篇内容主要围绕分库分表中间件 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-M15.7.25
10.186.64.31部署MySQL-S15.7.25
10.186.64.34部署MySQL-S25.7.25

1、部署一主两从数据库组。

2、部署 DBLE 环境。

可参考 DBLE手 册中的 快速开始 。

3、编辑 DBLE 配置文件,配置好后端数据库组。

4、开启 MySQL 的 general.log ,用于验证 SQL 语句的下发。

分布式 | DBLE 新特性之脱离分库分表的读写分离

三、使用分库分表的读写分离功能

1、配置分库分表的读写分离功能。

配置要点:

  • 配置多个 dbInstance 为读操作提供负载均衡。
  • rwSplitMode 配置不能为 0 。

重要配置内容:

user.xml

<dble:user xmlns:dble="http://dble.cloud/" version="4.0">
    <managerUser name="admin" password="1" maxCon="200"/>
    <shardingUser name="root" password="1" schemas="db1" maxCon="200" >
    </shardingUser> 
</dble:user>
  • shardingUser:分库用户配置

db.xml

<dble:db xmlns:dble="http://dble.cloud/" version="4.0">
    <dbGroup name="dbGroup1" rwSplitMode="1" delayThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <dbInstance name="M1" url="10.186.64.23:3306" user="root" password="1" maxCon="500" minCon="100" primary="true" readWeight="0" id="mysql1">
            <property name="testOnCreate">true</property>
        </dbInstance>
        <dbInstance name="S1" url="10.186.64.31:3306" user="root" password="1" maxCon="500" minCon="100" disabled="false">
        </dbInstance>
        <dbInstance name="S2" url="10.186.64.34:3306" user="root" password="1" maxCon="500" minCon="100" disabled="false">
        </dbInstance>
    </dbGroup>
</dble:db>
  • rwSplitMode:读操作的负载均衡模式(候选值0/1/2)

    • 0:不做均衡,直接分发到主实例。
    • 1:读操作在所有从实例中均衡,当所有从实例均不可用时,下发语句会报错。在v3.20.10前是会发往主实例。
    • 2:读操作在所有实例中均衡。

Sharding.xml

<dble:sharding xmlns:dble="http://dble.cloud/" version="4.0">
    <schema name="db1"  sqlMaxLimit="-1">
        <globalTable name="t1" shardingNode="dn1,dn2" sqlMaxLimit="-1"></globalTable>
    </schema>
    <shardingNode name="dn1" dbGroup="dbGroup1" database="db_1"/>
    <shardingNode name="dn2" dbGroup="dbGroup1" database="db_2"/>
</dble:sharding>

2、使用 mysql client 登录 dble 客户端。

注意:需要使用分库用户。

分布式 | 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 表的读操作。

分布式 | DBLE 新特性之脱离分库分表的读写分离

查看后端 MySQL 从实例的 general.log 。

分布式 | DBLE 新特性之脱离分库分表的读写分离

查看后端 MySQL 另一个从实例的 general.log 。

分布式 | DBLE 新特性之脱离分库分表的读写分离

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:

<dble:user xmlns:dble="http://dble.cloud/" version="4.0">
    <managerUser name="admin" password="1" maxCon="100"/>
    <rwSplitUser name="user1" password="1" dbGroup="dbGroup1" maxCon="20"/> 
</dble:user>
  • rwSplitUser:读写用户配置。

db.xml:

<dble:db xmlns:dble="http://dble.cloud/" version="4.0">
    <dbGroup name="dbGroup1" rwSplitMode="2" delayThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <dbInstance name="M1" url="10.186.64.23:3306" user="root" password="1" maxCon="500" minCon="100" primary="true" readWeight="0" id="mysql1">
            <property name="testOnCreate">true</property></dbInstance>
        <dbInstance name="S1" url="10.186.64.31:3306" user="root" password="1" maxCon="500" minCon="100" disabled="false"></dbInstance>
        <dbInstance name="S2" url="10.186.64.34:3306" user="root" password="1" maxCon="500" minCon="100" disabled="false"></dbInstance>
    </dbGroup>
    </dbGroup>

2、使用 mysql client 登录 dble 客户端。

注意:需要使用读写用户。

由下图可见,DBLE 未使用分库分表功能,仅展示后端 MySQL 的数据库信息。

分布式 | DBLE 新特性之脱离分库分表的读写分离

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 。

分布式 | DBLE 新特性之脱离分库分表的读写分离

查看后端 MySQL 从实例的 general.log 。

分布式 | DBLE 新特性之脱离分库分表的读写分离

查看后端 MySQL 另一个从实例的 general.log 。

分布式 | DBLE 新特性之脱离分库分表的读写分离

6、综上,DBLE 将所有读操作转发至所有实例,并在所有实例中均衡。符合 rwSplitMode="2" 的配置预期。

五、小结

分布式 | DBLE 新特性之脱离分库分表的读写分离

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
Java中Class对象详解
<divclass"htmledit\_views"id"content\_views"<phttps://blog.csdn.net/mcryeasy/article/details/52344729<br</p<p待优化整理总结</p<p</p<h1style"padding:0px;fontfamily:'apple
Wesley13 Wesley13
4年前
JDBC+C3P0+DBCP 基本使用
1.概述这篇文章主要说了JDBC的基本使用,包括Statement,PreparedStatement,JDBC的连接,Mysql创建用户创建数据表,C3P0的连接与配置,DBCP的连接与配置.2.mysql的处理这里的JDBC使用Mysql作为DBMS,请先安装Mysql,未安装的请点击这里下载(https:
Stella981 Stella981
4年前
LocalDateTime计算时间差
<divclass"htmledit\_views"id"content\_views"<pLocalDateTime为java8的新特性之一<br</p<p<br</p<pLocalDateTime.now()获得当前时间<br</p<p</p<h5</h5<divstyle"marginleft
Wesley13 Wesley13
4年前
P2P技术详解(三):P2P中的NAT穿越(打洞)方案详解(进阶分析篇)
1、引言接本系列的上一篇《P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解(基本原理篇)(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Flinks.jianshu.com%2Fgo%3Fto%3Dhttp%253A%252F%252Fwww.52im
Wesley13 Wesley13
4年前
Activiti 工作流入门指南
<divclass"htmledit\_views"id"content\_views"<h1<aname"t0"</a概览</h1<p如我们的介绍部分所述,Activiti目前分为两大类:</p<ul<li<p<ahref"https://activiti.gitbook.io/activiti7deve
Wesley13 Wesley13
4年前
P2P技术揭秘.P2P网络技术原理与典型系统开发
Modular.Java(2009.06)\.Craig.Walls.文字版.pdf:http://www.t00y.com/file/59501950(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.t00y.com%2Ffile%2F59501950)\More.E
Easter79 Easter79
4年前
Tomcat8及之后版本出现的The valid characters are defined in RFC 7230 and RFC 3986
<divclass"htmledit\_views"id"content\_views"<p升级tomcat8及更高版本带来的问题</p<p由于使用get请求,链接中参数携带特殊字符,由于Tomcat的新版本中增加了一个新特性,就是严格按照RFC3986规范进行访问</p<h2<aname"t0"</a解析,而RFC
Stella981 Stella981
4年前
JFinal使用笔记2
大部分步骤按cf官方的教程就可以了。遇到的问题如下:1、使用C3p0Plugin配置数据库连接,代码如下//配置C3p0数据库连接池插件//C3p0Pluginc3p0PluginnewC3p0Plugin(getProperty("jdbcUrl"),getProperty("user"),getP
Stella981 Stella981
4年前
SpringBoot学习遇到的问题(持续更新)
1.问题:\Cause:com.microsoft.sqlserver.jdbc.SQLServerException:必须声明表变量"@P0"。_;uncategorizedSQLException;SQLstate\S0001\;errorcode\1087\;必须声明表变量"@P0"。;nested
Wesley13 Wesley13
4年前
CDN+P2P在大规模直播&实时直播的技术实践
摘要:本次分享将介绍爱奇艺多类型的直播业务现状,以及直播整体技术架构和客户端直播网络模块Livenet的实现。回顾直播技术顺应业务多样化的演进过程,包括从偏P2P架构发展到结合CDN&P2P混合架构,为多端适配而实现的多协议支持和切换等演变,直播P2P和直播推流SDK的技术实现等。演讲/周志伟整理/LiveVideoStack
算法分
算法分
Lv1
阶下青苔与红树,雨中寥落月中愁。
文章
2
粉丝
0
获赞
0