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


环境准备

DBLE项目资料

  1.  
    DBLE官方网站:https://opensource.actionsky.com
  2.  
    可以详细了解DBLE的背景和应用场景,本文不涉及到的细节都可在官方文档获得更细节都信息;对于刚了解到同学,可以以本文为快速入门基础
  3.  
     
  4.  
    DBLE官方项目:https://github.com/actiontech/dble
  5.  
    如对源码有兴趣或者需要定制的功能的可以通过源码编译
  6.  
     
  7.  
    DBLE下载地址:https://github.com/actiontech/dble/releases
  8.  
    建议下载最新的releases版本,下载tar压缩包即可,如有源码编译需求的,可以下载源码包
  9.  
    DBLE社区交流:669663113
  10.  
     

安装JDK环境

DBLE是使用java开发的,所以需要启动dble需要先在机器上安装java版本1.8或以上,并且确保JAVA_HOME参数被正确的设置;

这里通过yum源的方式安装了openjdk,同学们可以自行google jdk的几百种安装方式,这里不在赘述;

# yum install java-1.8.0-openjdk
 

确认java环境已配置完成

  1.  
    # java -version
  2.  
    openjdk version "1.8.0_191"
  3.  
    OpenJDK Runtime Environment (build 1.8.0_191-b12)
  4.  
    OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

安装DBLE

DBLE的安装其实只要解压下载的目录就可以了,非常简单。

  1.  
    mkdir -p $working_dir
  2.  
    cd $working_dir
  3.  
    tar -xvf actiontech-dble-$version.tar.gz
  4.  
    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来方便后续的验证,表结构如下:

  1.  
    CREATE TABLE `users` (
  2.  
    `id` int(11) NOT NULL,
  3.  
    `user` varchar(20) DEFAULT NULL,
  4.  
    PRIMARY KEY (`id`)
  5.  
    ) 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语句
  1.  
    ...
  2.  
     
  3.  
    <system>
  4.  
    ...
  5.  
    <!-- property name="serverPort">8066</property> -->
  6.  
    <!--<property name="managerPort">9066</property> -->
  7.  
    ...
  8.  
    </system>
  9.  
    <user name="man1">
  10.  
    <property name="password">654321</property>
  11.  
    <property name="manager">true</property>
  12.  
    <!-- manager user can't set schema-->
  13.  
    </user>
  14.  
     
  15.  
    <user name="test">
  16.  
    <property name="password">password</property>
  17.  
    <property name="schemas">testdb</property>
  18.  
     
  19.  
    <!-- table's DML privileges INSERT/UPDATE/SELECT/DELETE -->
  20.  
    <!--
  21.  
    <privileges check="false">
  22.  
    <schema name="TESTDB" dml="0110" >
  23.  
    <table name="tb01" dml="0000"></table>
  24.  
    <table name="tb02" dml="1111"></table>
  25.  
    </schema>
  26.  
    </privileges>
  27.  
    -->
  28.  
    </user>
  29.  
    ...
参数 说明
user 用户配置节点
name 登录的用户名,也就是连接DBLE的用户名
password 登录的密码,也就是连接DBLE的密码
schemas 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,db2
privileges 配置用户针对表的增删改查的权限,具体见官方文档,这里不做展开

schema.xml

schema.xml是最主要的配置项,我们将users用户表按照取模的方式平均拆分到了MySQL A和MySQL B两个数据数据库实例上,
详细请看配置文件:

  1.  
    <?xml version="1.0"?>
  2.  
    <!DOCTYPE dble:schema SYSTEM "schema.dtd">
  3.  
    <dble:schema xmlns:dble="http://dble.cloud/">
  4.  
     
  5.  
    <schema name="testdb">
  6.  
    <table name="users" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-mod2" />
  7.  
    </schema>
  8.  
     
  9.  
    <!-- 分片配置 -->
  10.  
    <dataNode name="dn1" dataHost="Group1" database="testdb"/>
  11.  
    <dataNode name="dn2" dataHost="Group2" database="testdb"/>
  12.  
     
  13.  
    <!-- 物理数据库配置 -->
  14.  
    <dataHost name="Group1" maxCon="1000" minCon="10" balance="0" switchType="1" slaveThreshold="100">
  15.  
    <heartbeat>show slave status</heartbeat>
  16.  
    <writeHost host="MySQLA" url="172.16.3.1:14014" user="test" password="password"/>
  17.  
    </dataHost>
  18.  
     
  19.  
    <dataHost name="Group2" maxCon="1000" minCon="10" balance="0" switchType="1" slaveThreshold="100">
  20.  
    <heartbeat>show slave status</heartbeat>
  21.  
    <writeHost host="MySQLA" url="172.16.3.1:14015" user="test" password="password"/>
  22.  
    </dataHost>
  23.  
    </dble:schema>

参数说明

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

每个节点的属性逐一说明:

  • schema:

属性说明 :

  1.  
    - name 逻辑数据库名,与 server.xml 中的 schema 对应;
  2.  
    - table:

子属性说明 :

  1.  
    - name 表名,物理数据库中表名
  2.  
    - dataNode 表存储到哪些节点,多个节点用逗号分隔
  3.  
    - primaryKey 主键,用于主键缓存和自增识别,不作主键约束
  4.  
    - autoIncrement 是否自增
  5.  
    - rule 分片规则名,具体规则下文 rule 详细介绍
  • dataNode
    属性说明:

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

属性说明:

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

    1.  
      子属性说明 :
    2.  
      - host 物理实例名
    3.  
      - url 物理库IP+Port
    4.  
      - user 物理库用户
    5.  
      - password 物理库密码

rule.xml

主要关注rule属性,rule属性的内容来源于rule.xml这个文件,DBLE支持多种分表分库的规则,基本能满足你所需要的要求

table中的rule属性对应的就是rule.xml文件中tableRule的name,具体有哪些拆分算法实现,建议还是看下文档。我这里选择的sharding-by-mod2,是hash算法的特例,就是将数据平均拆分。因为我后端是两台物理库,所以rule.xml中hashmod2对应的partitionCountt为2,配置如下:

  1.  
    <tableRule name="sharding-by-mod2">
  2.  
    <rule>
  3.  
    <columns>id</columns>
  4.  
    <algorithm>hashmod2</algorithm>
  5.  
    </rule>
  6.  
    </tableRule>
  7.  
    <function name="hashmod2" class="Hash">
  8.  
    <property name="partitionCount">2</property>
  9.  
    <property name="partitionLength">1</property>
  10.  
    </function>

验证配置生效

启动DBLE

  1.  
    ## 进入DBLE安装目录,执行start命令
  2.  
    ./bin/dble start
  3.  
     
  4.  
    ## DBLE启动会自动加载配置,需确认进程是否正常启动,如启动失败,建议按照日志报错排查问题,正确启动日志如下:
  5.  
    STATUS | wrapper | 2019/01/21 17:31:43 | --> Wrapper Started as Daemon
  6.  
    STATUS | wrapper | 2019/01/21 17:31:43 | Launching a JVM...
  7.  
    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
  8.  
    INFO | jvm 1 | 2019/01/21 17:31:44 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
  9.  
    INFO | jvm 1 | 2019/01/21 17:31:44 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
  10.  
    INFO | jvm 1 | 2019/01/21 17:31:44 |
  11.  
    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侧的查询记录

  1.  
    mysql> insert into users(id,user) values(1,"zhangsan");
  2.  
    Query OK, 1 row affected (0.09 sec)
  3.  
    mysql> insert into users(id,user) values(2,"lisi");
  4.  
    Query OK, 1 row affected (0.09 sec)
  5.  
     
  6.  
     
  7.  
    mysql> explain select * from users;
  8.  
    +-----------+----------+---------------------+
  9.  
    | DATA_NODE | TYPE | SQL/REF |
  10.  
    +-----------+----------+---------------------+
  11.  
    | dn1 | BASE SQL | select * from users |
  12.  
    | dn2 | BASE SQL | select * from users |
  13.  
    +-----------+----------+---------------------+
  14.  
    2 rows in set (0.00 sec)
  15.  
     
  16.  
    mysql> select * from users;
  17.  
    +----+----------+
  18.  
    | id | user |
  19.  
    +----+----------+
  20.  
    | 2 | lisi |
  21.  
    | 1 | zhangsan |
  22.  
    +----+----------+
  23.  
    2 rows in set (0.01 sec)

获取MySQLA和MySQLB的记录

  1.  
    # mysql -P14014 -h 127.0.0.1 -utest -ppassword
  2.  
    mysql> select * from users;
  3.  
    +----+----------+
  4.  
    | id | user |
  5.  
    +----+----------+
  6.  
    | 2 | lisi |
  7.  
    +----+----------+
  8.  
    1 rows in set (0.01 sec)
  9.  
     
  10.  
    # mysql -P14015 -h 127.0.0.1 -utest -ppassword
  11.  
    mysql> select * from users;
  12.  
    +----+----------+
  13.  
    | id | user |
  14.  
    +----+----------+
  15.  
    | 1 | zhangsan |
  16.  
    +----+----------+
  17.  
    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

  1.  
    <?xml version="1.0"?>
  2.  
    <!DOCTYPE dble:schema SYSTEM "schema.dtd">
  3.  
    <dble:schema xmlns:dble="http://dble.cloud/">
  4.  
     
  5.  
    <schema name="testdb">
  6.  
    </schema>
  7.  
     
  8.  
    <!-- 分片配置 -->
  9.  
    <dataNode name="dn1" dataHost="Group1" database="testdb"/>
  10.  
     
  11.  
    <!-- 物理数据库配置 -->
  12.  
    <dataHost name="Group1" maxCon="1000" minCon="10" balance="3" switchType="1" slaveThreshold="100">
  13.  
    <heartbeat>show slave status</heartbeat>
  14.  
    <writeHost host="MySQLA" url="172.16.3.1:14014" user="test" password="password">
  15.  
    <readHost host="MySQLB" url="172.16.3.1:14015" user="test" password="password"/>
  16.  
    </writeHost>
  17.  
    </dataHost>
  18.  
    </dble:schema>

DBLE通过balance参数来控制读写分离的负载策略,写节点是否参与均衡与datahost的balance属性有关,本案例中我们将值调整为balance="3",并定义了writeHost和readHost
balance的定义具体见下图

验证配置生效

通过DBLE管理入口9066登陆数据库,注意这里我们通过管理入口的show @@datasource来验证读写分离的状态的正确性

  • session1
  1.  
    ##session1 登陆DBLE的管理端,查看读写分离的节点状态
  2.  
    mysql -P9066 -h 127.0.0.1 -uman1 -p654321
  3.  
    mysql> show @@datasource;
  4.  
    +--------+------------+-------+------+--------+------+------+---------+-----------+------------+
  5.  
    | NAME | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
  6.  
    +--------+------------+-------+------+--------+------+------+---------+-----------+------------+
  7.  
    | MySQLA | 172.16.3.1 | 19388 | W | 11 | 11 | 1000 | 11 | 0 | 0 |
  8.  
    | MySQLB | 172.16.3.1 | 19389 | R | 1 | 4 | 1000 | 3 | 0 | 0 |
  9.  
    +--------+------------+-------+------+--------+------+------+---------+-----------+------------+
  10.  
    2 rows in set (0.00 sec)
  • session2
  1.  
    ## session2 下发selct语句5次,查看READ_LOAD字段计数器的变化
  2.  
    mysql -P8066 -h 127.0.0.1 -utest -ppassword
  3.  
    mysql> select * from users;
  • session1
  1.  
    ##session1 返回DBLE的管理端,查看读写分离的节点状态
  2.  
    mysql> show @@datasource;
  3.  
    +--------+------------+-------+------+--------+------+------+---------+-----------+------------+
  4.  
    | NAME | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
  5.  
    +--------+------------+-------+------+--------+------+------+---------+-----------+------------+
  6.  
    | MySQLA | 172.16.3.1 | 19388 | W | 11 | 11 | 1000 | 11 | 0 | 0 |
  7.  
    | MySQLB | 172.16.3.1 | 19389 | R | 1 | 4 | 1000 | 8 | 5 | 0 |
  8.  
    +--------+------------+-------+------+--------+------+------+---------+-----------+------------+
  9.  
    2 rows in set (0.00 sec)

从show @@datasource;这个管理命令上我们能够观测到READ_LOAD在slave节点上计数器增加了5次,也就是说读流量顺利的下发到了slave节点;当然大家也可以通过打开mysql的general log来观测读写分离的情况

总结

本文通过两个场景来讲解DBLE的快速入门,希望通过简单的示例来给大家梳理DBLE的基本概念,帮助大家快速熟悉和使用DBLE这个中间件;更高阶的使用方法和细节建议大家参考官方文档;

MySQL 中间件 - DBLE 简单使用的更多相关文章

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

    GitHub:https://github.com/actiontech/dble 官方中文文档:https://actiontech.github.io/dble-docs-cn/ 一.环境准备 D ...

  2. 数据库中间件DBLE学习(一) 基础介绍和快速搭建

    dble基本架构简介 dble是上海爱可生信息技术股份有限公司基于mysql的高可用扩展性的分布式中间件.江湖人送外号MyCat Plus.开源地址 我们首先来看架构图,外部应用通过NIO/AIO进行 ...

  3. mysql中间件研究(Atlas,cobar,TDDL)

    mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差.下面介绍几款能代替其的mysql开源中间件产品,Atlas ...

  4. MySQL中间件Atlas安装及使用

    简介 Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量 ...

  5. MySQL中间件之ProxySQL(1):简介和安装

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.ProxySQL简介 之前的文章里,介绍了一个MySQL的中间件: ...

  6. mysql中间件研究(Atlas,cobar,TDDL)[转载]

    mysql中间件研究(Atlas,cobar,TDDL) mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差. ...

  7. MySQL中间件之ProxySQL_读写分离/查询重写配置

    MySQL中间件之ProxySQL_读写分离/查询重写配置 Posted on 2016-12-25 by mark blue, mark Leave a comment MySQL 1.闲扯几句 读 ...

  8. mysql 中间件

    http://f.dataguru.cn/thread-543718-1-1.html mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持 ...

  9. mysql中间件研究(tddl atlas cobar sharding-jdbc)

    mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差.下面介绍几款能代替其的mysql开源中间件产品,Atlas ...

随机推荐

  1. HSF 开发

    HSF 简介 HSF(High Speed Service Framework),高速服务框架,是阿里-主要采用的服务框架,其目的是 作为桥梁联通不同的业务系统,解耦系统之间的实现依赖. 1: RPC ...

  2. 《三》大话 Typescript 接口

    > 前言: 本文章为 TypeScript 系列文章. 旨在利用碎片时间快速入门 Typescript. 或重新温故 Typescript 查漏补缺.在官方 api 的基础上, 加上一些日常使用 ...

  3. k8s 回滚应用

    kubectl apply 每次更新应用时 Kubernetes 都会记录下当前的配置,保存为一个 revision(版次),这样就可以回滚到某个特定 revision. 滚动更新是一次只更新一小部分 ...

  4. 记一次 WPS Pro 2019 设备和驱动器图标删除

    1.图标预览 先看样式 2.软件不能关闭 百度和腾讯网盘都会创建,但是可以软件关闭,WPS以前也可以,现在新版作妖了 3.注册表删除 你做那我就删~Code:HKEY_CURRENT_USER\Sof ...

  5. Java自学-控制流程 continue

    Java的 continue语句 继续下一次循环 示例 1 : continue 如果是双数,后面的代码不执行,直接进行下一次循环 public class HelloWorld { public s ...

  6. 学习笔记之盘一盘 Python 系列 1 & 2 - 入门篇

    盘一盘 Python 系列 1 & 2 - 入门篇 https://mp.weixin.qq.com/s?__biz=MzIzMjY0MjE1MA==&mid=2247486473&a ...

  7. Pytorch 张量维度

    Tensor类的成员函数dim()可以返回张量的维度,shape属性与成员函数size()返回张量的具体维度分量,如下代码定义了一个两行三列的张量: f = torch.randn(2, 3) pri ...

  8. Linux Samba服务器的安装

    Samba最大的功能就是可以用于Linux与windows系统直接的文件共享和打印共享,也可以用于Linux与Linux之间的资源共享 安装 # yum install samba samba-cli ...

  9. shell EOF 用户自定义终止符

    #!/bin/bash ftp -n << EOF user guest 123456 binary cd /home/ prompt mget * close bye EOF 使用Tab ...

  10. Java 递归方法

    递归:在一个方法体内,调用自身,一般要有出口. 实例:已知一个数列,f(0)=1,f(1)=4,f(n+2)=2*f(n+1)+f(n),其中n为大于等于0的整数,求f(10)的值. package ...