MySQL 中间件 - DBLE 简单使用
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和readHost
balance的定义具体见下图
验证配置生效
通过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这个中间件;更高阶的使用方法和细节建议大家参考官方文档;
MySQL 中间件 - DBLE 简单使用的更多相关文章
- 开源分布式中间件 DBLE 快速入门指南
GitHub:https://github.com/actiontech/dble 官方中文文档:https://actiontech.github.io/dble-docs-cn/ 一.环境准备 D ...
- 数据库中间件DBLE学习(一) 基础介绍和快速搭建
dble基本架构简介 dble是上海爱可生信息技术股份有限公司基于mysql的高可用扩展性的分布式中间件.江湖人送外号MyCat Plus.开源地址 我们首先来看架构图,外部应用通过NIO/AIO进行 ...
- mysql中间件研究(Atlas,cobar,TDDL)
mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差.下面介绍几款能代替其的mysql开源中间件产品,Atlas ...
- MySQL中间件Atlas安装及使用
简介 Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量 ...
- MySQL中间件之ProxySQL(1):简介和安装
返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.ProxySQL简介 之前的文章里,介绍了一个MySQL的中间件: ...
- mysql中间件研究(Atlas,cobar,TDDL)[转载]
mysql中间件研究(Atlas,cobar,TDDL) mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差. ...
- MySQL中间件之ProxySQL_读写分离/查询重写配置
MySQL中间件之ProxySQL_读写分离/查询重写配置 Posted on 2016-12-25 by mark blue, mark Leave a comment MySQL 1.闲扯几句 读 ...
- mysql 中间件
http://f.dataguru.cn/thread-543718-1-1.html mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持 ...
- mysql中间件研究(tddl atlas cobar sharding-jdbc)
mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差.下面介绍几款能代替其的mysql开源中间件产品,Atlas ...
随机推荐
- 二叉树根结点到任意结点的路径(C语言)
有一棵二叉树,如下图所示: 其中 # 表示空结点. 先序遍历:A B D E G C F 问题:怎么得到从根结点到任意结点的路径呢? 示例:输入 G,怎么得到从结点 A 到结点 G 的路径呢? 很明显 ...
- 怎样使用U盘安装系统
准备工作 一个8G及以上的U盘: 软碟通UltraISO,下载地址,非免费,但试用就够了: 系统镜像,推荐去MSDN下载: 安装过程 利用U盘制作启动盘,准备好上述的东西,然后开始制作启动盘: 注意: ...
- CentOS7 安装 Docker、最佳Docker学习文档
目录 一.Docker支持 二.安装Docker -1.在新主机上首次安装Docker CE之前,需要设置Docker存储库.之后,就可以从存储库安装和更新Docker. 0.卸载旧版 1.正式安装 ...
- C#类型成员:方法
一.方法 方法的基本结构:返回值 方法名(参数){ 内容 },其中无返回值时用void,有返回值时用返回值类型,参数可以是零到无限个,参数由参数类型和参数名组成. void Method1() { } ...
- 没有15k薪资都不会了解的测试内幕
软件测试的工程师阶层是指随着行业的飞速发展,测试人员犹如身在洪流之中“逆水行舟不进则退”.知其然已经无法满足当今的测试人员,还要知其所以然.所以测试人员不仅仅要关注系统外部结构,还得了解系统内部的逻辑 ...
- Node.js到底是什么
接触前端也有一段时间了,逐渐开始接触Node.js,刚刚接触Node.js的时候一直都以为Node.js就是JavaScript,当对Node.js有一定的了解之后,其实并不然两者之间有关系,其中的关 ...
- Git版本管理工具使用
1.Git简介 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核 ...
- java服务端集成极光消息推送--详细开发步骤
1.极光推送账号准备 要使用极光消息推送必须先在官方网站上注册账号,并添加应用. 产品介绍:https://docs.jiguang.cn/jpush/guideline/intro/ 注册开发者账号 ...
- centos7 docker安装Jenkins BlueOcean
Jenkins是一款Java开发的跨平台持续集成和持续发布的开源项目,Jenkins已经作为各大公司进行CI/CD的首选工具.而BlueOcean是Jenkins推出的一个插件,其目的就是让程序员执行 ...
- Windows系统Apache下载和安装
一.Apache的下载 1.访问Apache官网:https://httpd.apache.org 2.选择Windows版本下载 3.下载完成后解压缩,把文件放到自己想放的盘 二.Apache的安装 ...