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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

环境准备

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/releases
  • 解压并安装dble到指定文件夹中
mkdir -p $working_dir  
cd $working_dir  
tar -xvf actiontech-dble-$version.tar.gz  
cd $working_dir/dble/conf 

安装完成后,目录如下:

目录说明
bindble命令:启动、重启、停止等
confdble配置信息,本文重点关注
libdble引用的jar包
logs日志文件,包括dble启动的日志和运行的日志

配置DBLE

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

文件说明
server.xmlDBLE server相关参数定义,包括dble性能,定时任务,端口,用户配置等;本文主要涉及到访问用户的配置
schema.xmlDBLE具体分片定义,规定table和schema以及dataNode之间的关系,指定每个表格使用哪种类型的分片方法,定义每个dataNode的连接信息等
rule.xmlDBLE实际用到的分片算法的配置

应用场景一:数据拆分

后端MySQL节点

DBLE的架构其实很好理解,DBLE是代理中间件,DBLE后面就是物理数据库。对于使用者来说,访问的都是DBLE,不会接触到后端的数据库。

我们先演示简单的数据拆分的功能。物理部署结构如下表:

服务IP:Port说明
DBLE172.16.3.1:9066DBLE实例,连接数据库时,连接此IP:Port
Mysql A172.16.3.1:14014物理数据库实例A,真正存储数据的数据库
Mysql B172.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说明
DBLE172.16.3.1:9066DBLE实例,连接数据库时,连接此IP:Port
Mysql A172.16.3.1:14014物理数据库实例A,master实例
Mysql B172.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这个中间件;更高阶的使用方法和细节建议大家参考官方文档;

转载于:https://my.oschina.net/actiontechoss/blog/3005888

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文字输入限制_从拼音输入法的兴起看汉字文化圈的衰落

曾经韩国的报纸是这样的&#xff1a;现在的则是这样的&#xff1a;&#xff08;上面两图均来自网络&#xff0c;如有侵权请告知&#xff09;二战之后&#xff0c;曾经广泛使用汉字的朝韩跟越南都走上了废除汉字之路。日本虽然依然使用汉字&#xff0c;却也发布了《当用汉字表》…

JS弹出窗口

转载链接&#xff1a;http://www.jb51.net/article/32747.htm 如何利用网页弹出各种形式的窗口&#xff0c;我想大家大多都是知道些的&#xff0c;但那种多种多样的弹出式窗口是怎么搞出来的&#xff0c;我们今天就来学习一下&#xff1a; 1.弹启一个全屏窗口 windows.open(…

跟各位读者朋友分享下公众号运营策略

大家好&#xff0c;我是若川。欢迎加我微信 ruochuan12&#xff0c;加群交流学习。目前我的公众号运营策略&#xff0c;分享给各位读者朋友。点击下方卡片关注我&#xff0c;或者查看源码等系列文章。可能大多数关注的人不知道&#xff0c;我的公众号取名为若川视野的原因。「若…

[轉載]用PHP的ob_start();控制您的浏览器cache!

FROM http://www.phpchina.com/html/28/1628-3870.html Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用&#xff0c;特别是对于&#xff1a;当你想在数据已经输出后&#xff0c;再输出文件头的情况。输出控制函数不对使用 header() 或 setcookie(), 发送的…

oracle 带有变量的语句_【成都校区】Oracle SQL语句之常见优化方法总结

本帖出自于黑马程序员成都中心&#xff0c;更多资源可关注微信公众号1、SQL语句尽量用大写的&#xff1b;因为oracle总是先解析SQL语句&#xff0c;把小写的字母转换成大写的再执行。2、使用表的别名&#xff1a; 当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每…

js 获取上下文后面的路径_通过在数据后面显示上下文来可视化公众意见

js 获取上下文后面的路径In 1824, The Harrisburg Pennsylvanian, a newspaper from a town in Pennsylvania conducted the first known public opinion polls in history, and successfully predicted the result of the vote in the close race between Andrew Jackson and …

甘肃甘南步班邮递员:草原上的“递爱”艰途

图为甘肃甘南藏族自治州碌曲县郎木寺镇邮政支局的投递员进行投递工作。&#xff08;资料图&#xff09; 钟欣 摄 中新网兰州1月25日电 (吴玉蒿)渐近春节&#xff0c;刘权英投递邮件的工作愈加繁重。现年45岁的刘权英是甘肃甘南藏族自治州碌曲县郎木寺镇邮政支局的一名投递员。由…

核心编程6——线程

Note 0:了进程实际是由两个组件组成的:一个进程内核对象和一个地址空间.类似地,线程也由两个组件组成:一个是线程的内核对象,操作系统用它管理线程.内核对象还是系统用来存放线程统计信息的地方.一个线程堆栈,用于维护线程执行时所需的所有函数参数和局部变量.Note 1:进程是有惰…

PHP解决抢购、秒杀、抢楼、抽奖等阻塞式高并发库存防控超量的思路方法

转载链接&#xff1a;http://www.4u4v.net/thinking-approach-to-buy-spike-grab-floor-sweepstakes-and-other-high-concurrent-blocking-prevention-excess-inventory-solve-php.html 如今在电商行业里,秒杀抢购活动已经是商家常用促销手段。但是库存数量有限&#xff0c;而同…

看了就会的 Node.js 三大基础模块常用 API

大家好&#xff0c;我是若川。欢迎加我微信 ruochuan12&#xff0c;加群交流学习。今天分享一篇nodejs基础的文章。点击下方卡片关注我&#xff0c;或者查看源码等系列文章。在日常使用 Node 进行开发的时候&#xff0c;会使用到一些文件系统、路径操作等基础 API&#xff0c;这…

vue-cli3插件初体验

vue-cli3发布自2018年8月&#xff0c;距离现在还不是特别久&#xff0c;最好搭建项目刚好用到&#xff0c;所以写下这篇文章&#xff0c;记录一下踩坑经历。vue的作者说过&#xff0c;vue-cli的本质是模版的拉取&#xff0c;太多的配置导致了模版的难以维护&#xff0c;所以重构…

ios设计登录功能_亲爱的产品设计师,这是iOS 14的新功能

ios设计登录功能On June 22, 2020 Apple previewed iOS 14 for the first time. As always there are quite some changes you should know about as a product designer like widgets, pickers, app clips, permissions and more.2020年6月22日&#xff0c;Apple首次预览iOS 1…

c++ int 转 short_C/C++结构体内存对齐

在面试或工作中&#xff0c;经常会遇到内存对齐的问题。这里结合我的理解谈一谈对内存对齐的理解。1. 为什么要内存对齐&#xff0c;不对齐会怎么样&#xff1f;内存中存放数据是为了给CPU使用&#xff0c;CPU访问内存数据时会受到地址总线宽度的限制&#xff0c;也就是一次能从…

对于日访问量达到1W IP的处理方法

转自&#xff1a;http://www.java123.net/56026-2.html 对于日访问量达到1W IP的处理方法 一、1万ip真是不高&#xff1a; 1.常用数据用缓存&#xff0c;减轻数据库压力。 2.详细页数据生成静态页面。 二、10000算是相当小的了,不需要什么特殊的处理机制,只要符合最一般的…

数据契约(DataContract)

WCF第一要素就是契约: 服务契约用于声明可用于远程访问的类型。在Interface或class开始处使用服务契约标签. [ServiceContract] Public interface Iservice { } 接口调用契约的好处: 1. 同一服务类型可以实现多个不相干的服务契约. 2. 有利于版本升级 3. 按照…

jakob slam_Jakob Nielsen针对用户界面设计的第二种可用性启发法

jakob slamIn the pursuit of providing great user experiences, it’s imperative that digital products are evaluated. A 为了提供出色的用户体验&#xff0c;必须对数字产品进行评估。 一个 heuristic evaluation is essential to delivering great user experiences. I…

微软Office 365正式上架Mac App Store

今天&#xff0c;Office 365正式在Mac App Store上架&#xff0c;Mac用户可以轻松下载Word&#xff0c;Outlook&#xff0c;Excel&#xff0c;PowerPoint&#xff0c;OneNote以及整套微软的热门应用程序。用户还可以从应用程序内订购Office 365。苹果全球开发者关系高级主管Sha…

一文搞懂浏览器原理

大家好&#xff0c;我是若川。最近这几年&#xff0c;云计算的普及和 HTML5 技术的快速发展&#xff0c;越来越多的应用转向了浏览器 / 服务器&#xff08;B/S&#xff09;架构&#xff0c;这种改变让浏览器的重要性与日俱增&#xff0c;视频、音频、游戏几大核心场景也都在逐渐…

python处理excel可视化_python如何将excel数据处理可视化

python将excel数据处理可视化的方法&#xff1a;首先安装xlrd与xlwt库&#xff0c;进行表格读取&#xff1b;然后使用pyecharts生成Echarts图表的类库&#xff1b;最后安装Echarts读取Excel数据及显示即可。python将excel数据处理可视化的方法&#xff1a;Excel表操作python操作…

dataframe中将一列数据切分成多列

为什么80%的码农都做不了架构师&#xff1f;>>> 原sheet中数据 目的 将【备注】列切分成【key】列和【value】列 Python sheet[key] sheet[备注].str.extract(r(_.*(?\u503c))) sheet[value] sheet[备注].str.extract(r((?<).*))结果 参考 pandas.Series.st…