DBLE 是企业级开源分布式中间件,江湖人送外号 “MyCat Plus”;以其简单稳定,持续维护,良好的社区环境和广大的群众基础获得了社区的大力支持;java
DBLE官方网站:https://opensource.actionsky.com 能够详细了解DBLE的背景和应用场景,本文不涉及到的细节均可在官方文档得到更细节都信息;对于刚了解到同窗,能够以本文为快速入门基础 DBLE官方项目:https://github.com/actiontech/dble 如对源码有兴趣或者须要定制的功能的能够经过源码编译 DBLE下载地址:https://github.com/actiontech/dble/releases 建议下载最新的releases版本,下载tar压缩包便可,若有源码编译需求的,能够下载源码包 DBLE社区交流:669663113
DBLE是使用java开发的,因此须要启动dble须要先在机器上安装java版本1.8或以上,而且确保JAVA_HOME参数被正确的设置;mysql
这里经过yum源的方式安装了openjdk,同窗们能够自行google jdk的几百种安装方式,这里不在赘述;git
# yum install java-1.8.0-openjdk
确认java环境已配置完成github
# 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的安装其实只要解压下载的目录就能够了,很是简单。算法
mkdir -p $working_dir cd $working_dir tar -xvf actiontech-dble-$version.tar.gz cd $working_dir/dble/conf
安装完成后,目录以下:sql
目录 | 说明 |
---|---|
bin | dble命令:启动、重启、中止等 |
conf | dble配置信息,本文重点关注 |
lib | dble引用的jar包 |
logs | 日志文件,包括dble启动的日志和运行的日志 |
DBLE的配置文件都在conf目录里面,这里介绍几个经常使用的文件:shell
文件 | 说明 |
---|---|
server.xml | DBLE server相关参数定义,包括dble性能,定时任务,端口,用户配置等;本文主要涉及到访问用户的配置 |
schema.xml | DBLE具体分片定义,规定table和schema以及dataNode之间的关系,指定每一个表格使用哪一种类型的分片方法,定义每一个dataNode的链接信息等 |
rule.xml | DBLE实际用到的分片算法的配置 |
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里能够配置跟DBLE自身相关的许多参数,这里重点只关注下面这段访问用户相关的配置,其余默认便可;
第一段 "< system >" 为DBLE的服务端口(默认8066)和管理端口(默认9066)的配置
第二段“< user >”配置管理理用户,默认为man1,密码为654321
第三段“< user >”配置业务用户,配置了一个帐号test 密码password,针对数据库testdb,读写权限都有,没有针对表作任何特殊的权限,故把表配置作了注释
... <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是最主要的配置项,咱们将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>
参数说明
每一个节点的属性逐一说明:
属性说明 :
- name 逻辑数据库名,与 server.xml 中的 schema 对应; - table:
子属性说明 :
- name 表名,物理数据库中表名 - dataNode 表存储到哪些节点,多个节点用逗号分隔 - primaryKey 主键,用于主键缓存和自增识别,不做主键约束 - autoIncrement 是否自增 - rule 分片规则名,具体规则下文 rule 详细介绍
dataNode
属性说明:
属性说明:
writehost 写物理实例
子属性说明 : - host 物理实例名 - url 物理库IP+Port - user 物理库用户 - password 物理库密码
主要关注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的从实例,从而扩展整个集群的吞吐能力;
咱们再经过示例,演示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的配置来完成读写分离的架构;
<?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和readHost
balance的定义具体见下图
经过DBLE管理入口9066登录数据库,注意这里咱们经过管理入口的show @@datasource来验证读写分离的状态的正确性
##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 下发selct语句5次,查看READ_LOAD字段计数器的变化 mysql -P8066 -h 127.0.0.1 -utest -ppassword mysql> select * from users;
##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这个中间件;更高阶的使用方法和细节建议你们参考官方文档;