开源分布式中间件 DBLE 快速入门指南

20次阅读

共计 8972 个字符,预计需要花费 23 分钟才能阅读完成。

DBLE 是企业级开源分布式中间件,江湖人送外号“MyCat Plus”;以其简单稳定,持续维护,良好的社区环境和广大的群众基础得到了社区的大力支持;

环境准备
DBLE 项目资料
DBLE 官方网站:https://opensource.actionsky.com
可以详细了解 DBLE 的背景和应用场景,本文不涉及到的细节都可在官方文档获得更细节都信息;对于刚了解到同学,可以以本文为快速入门基础

DBLE 官方项目:https://github.com/actiontech/dble
如对源码有兴趣或者需要定制的功能的可以通过源码编译

DBLE 下载地址:https://github.com/actiontech/dble/releases
建议下载最新的 releases 版本,下载 tar 压缩包即可,如有源码编译需求的,可以下载源码包
DBLE 社区交流:669663113

安装 JDK 环境
DBLE 是使用 java 开发的,所以需要启动 dble 需要先在机器上安装 java 版本 1.8 或以上,并且确保 JAVA_HOME 参数被正确的设置;
这里通过 yum 源的方式安装了 openjdk,同学们可以自行 google jdk 的几百种安装方式,这里不在赘述;
# yum install java-1.8.0-openjdk
确认 java 环境已配置完成
# java -version
openjdk version “1.8.0_191”
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)
安装 DBLE
DBLE 的安装其实只要解压下载的目录就可以了,非常简单。

通过此连接下载最新安装包 https://github.com/actiontech…

解压并安装 dble 到指定文件夹中

mkdir -p $working_dir
cd $working_dir
tar -xvf actiontech-dble-$version.tar.gz
cd $working_dir/dble/conf
安装完成后,目录如下:

目录
说明

bin
dble 命令:启动、重启、停止等

conf
dble 配置信息, 本文重点关注

lib
dble 引用的 jar 包

logs
日志文件,包括 dble 启动的日志和运行的日志

配置 DBLE
DBLE 的配置文件都在 conf 目录里面,这里介绍几个常用的文件:

文件
说明

server.xml
DBLE server 相关参数定义,包括 dble 性能,定时任务,端口,用户配置等;本文主要涉及到访问用户的配置

schema.xml
DBLE 具体分片定义,规定 table 和 schema 以及 dataNode 之间的关系,指定每个表格使用哪种类型的分片方法,定义每个 dataNode 的连接信息等

rule.xml
DBLE 实际用到的分片算法的配置

应用场景一:数据拆分
后端 MySQL 节点
DBLE 的架构其实很好理解,DBLE 是代理中间件,DBLE 后面就是物理数据库。对于使用者来说,访问的都是 DBLE,不会接触到后端的数据库。
我们先演示简单的数据拆分的功能。物理部署结构如下表:

服务
IP:Port
说明

DBLE
172.16.3.1:9066
DBLE 实例,连接数据库时,连接此 IP:Port

Mysql A
172.16.3.1:14014
物理数据库实例 A,真正存储数据的数据库

Mysql B
172.16.3.1:14015
物理数据库实例 B,真正存储数据的数据库

备注:为了演示简单,这里将实例都部署在了一台机器上并用不同端口做区分,同学们也可以用三台机器来做环境搭建
在 MySQL A 和 MySQL B 中创建库表 testdb.users 来方便后续的验证,表结构如下:
CREATE TABLE `users` (
`id` int(11) NOT NULL,
`user` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
server.xml
server.xml 里可以配置跟 DBLE 自身相关的许多参数,这里重点只关注下面这段访问用户相关的配置,其他默认即可;
第一段 “< system >” 为 DBLE 的服务端口(默认 8066)和管理端口(默认 9066)的配置

管理端口只能接受 DBLE 的管理命令,这里不做展开
服务端口即 DBLE 的业务访问端口,可以接受 SQL 语句

第二段“< user >”配置管理理用户,默认为 man1,密码为 654321
即可以通过 mysql -P9066 -h 127.0.0.1 -u man1 -p654321 来下发管理命令
第三段“< user >”配置业务用户,配置了一个账号 test 密码 password, 针对数据库 testdb, 读写权限都有,没有针对表做任何特殊的权限,故把表配置做了注释
即可以通过 mysql -P8066 -h 127.0.0.1 -utest -ppassword 下发 SQL 语句

<system>

<!– property name=”serverPort”>8066</property> –>
<!–<property name=”managerPort”>9066</property> –>

</system>
<user name=”man1″>
<property name=”password”>654321</property>
<property name=”manager”>true</property>
<!– manager user can’t set schema–>
</user>

<user name=”test”>
<property name=”password”>password</property>
<property name=”schemas”>testdb</property>

<!– table’s DML privileges INSERT/UPDATE/SELECT/DELETE –>
<!–
<privileges check=”false”>
<schema name=”TESTDB” dml=”0110″ >
<table name=”tb01″ dml=”0000″></table>
<table name=”tb02″ dml=”1111″></table>
</schema>
</privileges>
–>
</user>

参数
说明

user
用户配置节点

name
登录的用户名,也就是连接 DBLE 的用户名

password
登录的密码,也就是连接 DBLE 的密码

schemas
数据库名,这里会和 schema.xml 中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库 db1,db2,则配置 db1,db2

privileges
配置用户针对表的增删改查的权限,具体见官方文档,这里不做展开

schema.xml
schema.xml 是最主要的配置项,我们将 users 用户表按照取模的方式平均拆分到了 MySQL A 和 MySQL B 两个数据数据库实例上,详细请看配置文件:
<?xml version=”1.0″?>
<!DOCTYPE dble:schema SYSTEM “schema.dtd”>
<dble:schema xmlns:dble=”http://dble.cloud/”>

<schema name=”testdb”>
<table name=”users” primaryKey=”ID” dataNode=”dn1,dn2″ rule=”sharding-by-mod2″ />
</schema>

<!– 分片配置 –>
<dataNode name=”dn1″ dataHost=”Group1″ database=”testdb”/>
<dataNode name=”dn2″ dataHost=”Group2″ database=”testdb”/>

<!– 物理数据库配置 –>
<dataHost name=”Group1″ maxCon=”1000″ minCon=”10″ balance=”0″ switchType=”1″ slaveThreshold=”100″>
<heartbeat>show slave status</heartbeat>
<writeHost host=”MySQLA” url=”172.16.3.1:14014″ user=”test” password=”password”/>
</dataHost>

<dataHost name=”Group2″ maxCon=”1000″ minCon=”10″ balance=”0″ switchType=”1″ slaveThreshold=”100″>
<heartbeat>show slave status</heartbeat>
<writeHost host=”MySQLA” url=”172.16.3.1:14015″ user=”test” password=”password”/>
</dataHost>
</dble:schema>
参数说明

schema 逻辑数据库信息,此数据库为逻辑数据库,name 与 server.xml 中 schema 对应;
dataNode 分片信息,此为分片节点的定义;分片名字和 schema 的 dataNode 对应;分片与下面的 dataHost 物理实例进行关联;
dataHost 物理实例组信息,dataHost 下可以挂载同组的读写物理实例节点,实现高可用或者读写分离;

每个节点的属性逐一说明:
schema:
属性说明:
– name 逻辑数据库名,与 server.xml 中的 schema 对应;
– table:
子属性说明:
– name 表名,物理数据库中表名
– dataNode 表存储到哪些节点,多个节点用逗号分隔
– primaryKey 主键,用于主键缓存和自增识别,不作主键约束
– autoIncrement 是否自增
– rule 分片规则名,具体规则下文 rule 详细介绍

dataNode 属性说明:

name 节点名,与 table 中 dataNode 对应
datahost 物理实例组名,与 datahost 中 name 对应
database 物理数据库中数据库名;

dataHost

属性说明:

name 物理数据库名,与 dataNode 中 dataHost 对应
balance 均衡负载的方式
switchtype 写节点的高可用切换方式;等于 1 时,心跳不健康发生切换
heartbeat 心跳检测语句,注意语句结尾的分号要加

writehost 写物理实例
子属性说明:
– host 物理实例名
– url 物理库 IP+Port
– user 物理库用户
– password 物理库密码

rule.xml
主要关注 rule 属性,rule 属性的内容来源于 rule.xml 这个文件,DBLE 支持多种分表分库的规则,基本能满足你所需要的要求
table 中的 rule 属性对应的就是 rule.xml 文件中 tableRule 的 name, 具体有哪些拆分算法实现,建议还是看下文档。我这里选择的 sharding-by-mod2,是 hash 算法的特例,就是将数据平均拆分。因为我后端是两台物理库,所以 rule.xml 中 hashmod2 对应的 partitionCountt 为 2,配置如下:
<tableRule name=”sharding-by-mod2″>
<rule>
<columns>id</columns>
<algorithm>hashmod2</algorithm>
</rule>
</tableRule>
<function name=”hashmod2″ class=”Hash”>
<property name=”partitionCount”>2</property>
<property name=”partitionLength”>1</property>
</function>
验证配置生效
启动 DBLE
## 进入 DBLE 安装目录,执行 start 命令
./bin/dble start

## DBLE 启动会自动加载配置,需确认进程是否正常启动,如启动失败,建议按照日志报错排查问题,正确启动日志如下:
STATUS | wrapper | 2019/01/21 17:31:43 | –> Wrapper Started as Daemon
STATUS | wrapper | 2019/01/21 17:31:43 | Launching a JVM…
INFO | jvm 1 | 2019/01/21 17:31:43 | OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
INFO | jvm 1 | 2019/01/21 17:31:44 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO | jvm 1 | 2019/01/21 17:31:44 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
INFO | jvm 1 | 2019/01/21 17:31:44 |
INFO | jvm 1 | 2019/01/21 17:31:45 | Server startup successfully. see logs in logs/dble.log

通过 DBLE 流量入口 8066 登陆数据库
mysql -P8066 -h 127.0.0.1 -utest -ppassword

插入两条用户记录,并获取 DBLE 侧的查询记录
mysql> insert into users(id,user) values(1,”zhangsan”);
Query OK, 1 row affected (0.09 sec)
mysql> insert into users(id,user) values(2,”lisi”);
Query OK, 1 row affected (0.09 sec)

mysql> explain select * from users;
+———–+———-+———————+
| DATA_NODE | TYPE | SQL/REF |
+———–+———-+———————+
| dn1 | BASE SQL | select * from users |
| dn2 | BASE SQL | select * from users |
+———–+———-+———————+
2 rows in set (0.00 sec)

mysql> select * from users;
+—-+———-+
| id | user |
+—-+———-+
| 2 | lisi |
| 1 | zhangsan |
+—-+———-+
2 rows in set (0.01 sec)
获取 MySQLA 和 MySQLB 的记录
# mysql -P14014 -h 127.0.0.1 -utest -ppassword
mysql> select * from users;
+—-+———-+
| id | user |
+—-+———-+
| 2 | lisi |
+—-+———-+
1 rows in set (0.01 sec)

# mysql -P14015 -h 127.0.0.1 -utest -ppassword
mysql> select * from users;
+—-+———-+
| id | user |
+—-+———-+
| 1 | zhangsan |
+—-+———-+
1 rows in set (0.01 sec)
从上面的验证流程,往 DBLE 插入的数据,会按照取模的方式下发到真实的物理库,来实现数据库的自动分片;同时通过 DBLE 下发的查询会被 DBLE 自动下发给实际的物理库,合并返回给客户端,可以通过 explain 执行计划观察到下发的实际下发给物理库的 SQL 语句
应用场景二:读写分离
DBLE 除了做数据的分片功能外,也支持读写分离功能;开启读写分离功能后,可以将主实例上的读压力负载给原本 stand by 的从实例,从而扩展整个集群的吞吐能力;
后端 MySQL 节点
我们再通过示例,演示 DBLE 的读写分离的功能。物理部署结构如下表:

服务
IP:Port
说明

DBLE
172.16.3.1:9066
DBLE 实例,连接数据库时,连接此 IP:Port

Mysql A
172.16.3.1:14014
物理数据库实例 A,master 实例

Mysql B
172.16.3.1:14015
物理数据库实例 B,slave 实例

备注:为了演示简单,这里将实例都部署在了一台机器上并用不同端口做区分,同学们也可以用三台机器来做环境搭建
此场景中,我们将 MySQL A 和 MySQL B 搭建成主从复制关系,同时我们只变更 schema.xml 的配置来完成读写分离的架构;
schema.xml
<?xml version=”1.0″?>
<!DOCTYPE dble:schema SYSTEM “schema.dtd”>
<dble:schema xmlns:dble=”http://dble.cloud/”>

<schema name=”testdb”>
</schema>

<!– 分片配置 –>
<dataNode name=”dn1″ dataHost=”Group1″ database=”testdb”/>

<!– 物理数据库配置 –>
<dataHost name=”Group1″ maxCon=”1000″ minCon=”10″ balance=”3″ switchType=”1″ slaveThreshold=”100″>
<heartbeat>show slave status</heartbeat>
<writeHost host=”MySQLA” url=”172.16.3.1:14014″ user=”test” password=”password”>
<readHost host=”MySQLB” url=”172.16.3.1:14015″ user=”test” password=”password”/>
</writeHost>
</dataHost>
</dble:schema>
DBLE 通过 balance 参数来控制读写分离的负载策略,写节点是否参与均衡与 datahost 的 balance 属性有关,本案例中我们将值调整为 balance=”3″,并定义了 writeHost 和 readHostbalance 的定义具体见下图

验证配置生效
通过 DBLE 管理入口 9066 登陆数据库,注意这里我们通过管理入口的 show @@datasource 来验证读写分离的状态的正确性
session1
##session1 登陆 DBLE 的管理端,查看读写分离的节点状态
mysql -P9066 -h 127.0.0.1 -uman1 -p654321
mysql> show @@datasource;
+——–+————+——-+——+——–+——+——+———+———–+————+
| NAME | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+——–+————+——-+——+——–+——+——+———+———–+————+
| MySQLA | 172.16.3.1 | 19388 | W | 11 | 11 | 1000 | 11 | 0 | 0 |
| MySQLB | 172.16.3.1 | 19389 | R | 1 | 4 | 1000 | 3 | 0 | 0 |
+——–+————+——-+——+——–+——+——+———+———–+————+
2 rows in set (0.00 sec)
session2
## session2 下发 selct 语句 5 次,查看 READ_LOAD 字段计数器的变化
mysql -P8066 -h 127.0.0.1 -utest -ppassword
mysql> select * from users;
session1
##session1 返回 DBLE 的管理端,查看读写分离的节点状态
mysql> show @@datasource;
+——–+————+——-+——+——–+——+——+———+———–+————+
| NAME | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+——–+————+——-+——+——–+——+——+———+———–+————+
| MySQLA | 172.16.3.1 | 19388 | W | 11 | 11 | 1000 | 11 | 0 | 0 |
| MySQLB | 172.16.3.1 | 19389 | R | 1 | 4 | 1000 | 8 | 5 | 0 |
+——–+————+——-+——+——–+——+——+———+———–+————+
2 rows in set (0.00 sec)
从 show @@datasource; 这个管理命令上我们能够观测到 READ_LOAD 在 slave 节点上计数器增加了 5 次,也就是说读流量顺利的下发到了 slave 节点;当然大家也可以通过打开 mysql 的 general log 来观测读写分离的情况
总结
本文通过两个场景来讲解 DBLE 的快速入门,希望通过简单的示例来给大家梳理 DBLE 的基本概念,帮助大家快速熟悉和使用 DBLE 这个中间件;更高阶的使用方法和细节建议大家参考官方文档;

正文完
 0