开源分布式中间件 DBLE 快速入门指南
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
環(huán)境準(zhǔn)備
DBLE項(xiàng)目資料
DBLE官方網(wǎng)站:https://opensource.actionsky.com 可以詳細(xì)了解DBLE的背景和應(yīng)用場(chǎng)景,本文不涉及到的細(xì)節(jié)都可在官方文檔獲得更細(xì)節(jié)都信息;對(duì)于剛了解到同學(xué),可以以本文為快速入門(mén)基礎(chǔ)DBLE官方項(xiàng)目:https://github.com/actiontech/dble 如對(duì)源碼有興趣或者需要定制的功能的可以通過(guò)源碼編譯DBLE下載地址:https://github.com/actiontech/dble/releases 建議下載最新的releases版本,下載tar壓縮包即可,如有源碼編譯需求的,可以下載源碼包DBLE社區(qū)交流:669663113安裝JDK環(huán)境
DBLE是使用java開(kāi)發(fā)的,所以需要啟動(dòng)dble需要先在機(jī)器上安裝java版本1.8或以上,并且確保JAVA_HOME參數(shù)被正確的設(shè)置;
這里通過(guò)yum源的方式安裝了openjdk,同學(xué)們可以自行g(shù)oogle jdk的幾百種安裝方式,這里不在贅述;
# yum install java-1.8.0-openjdk確認(rèn)java環(huán)境已配置完成
# 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的安裝其實(shí)只要解壓下載的目錄就可以了,非常簡(jiǎn)單。
- 通過(guò)此連接下載最新安裝包https://github.com/actiontech/dble/releases
- 解壓并安裝dble到指定文件夾中
安裝完成后,目錄如下:
| bin | dble命令:啟動(dòng)、重啟、停止等 |
| conf | dble配置信息,本文重點(diǎn)關(guān)注 |
| lib | dble引用的jar包 |
| logs | 日志文件,包括dble啟動(dòng)的日志和運(yùn)行的日志 |
配置DBLE
DBLE的配置文件都在conf目錄里面,這里介紹幾個(gè)常用的文件:
| server.xml | DBLE server相關(guān)參數(shù)定義,包括dble性能,定時(shí)任務(wù),端口,用戶(hù)配置等;本文主要涉及到訪問(wèn)用戶(hù)的配置 |
| schema.xml | DBLE具體分片定義,規(guī)定table和schema以及dataNode之間的關(guān)系,指定每個(gè)表格使用哪種類(lèi)型的分片方法,定義每個(gè)dataNode的連接信息等 |
| rule.xml | DBLE實(shí)際用到的分片算法的配置 |
應(yīng)用場(chǎng)景一:數(shù)據(jù)拆分
后端MySQL節(jié)點(diǎn)
DBLE的架構(gòu)其實(shí)很好理解,DBLE是代理中間件,DBLE后面就是物理數(shù)據(jù)庫(kù)。對(duì)于使用者來(lái)說(shuō),訪問(wèn)的都是DBLE,不會(huì)接觸到后端的數(shù)據(jù)庫(kù)。
我們先演示簡(jiǎn)單的數(shù)據(jù)拆分的功能。物理部署結(jié)構(gòu)如下表:
| DBLE | 172.16.3.1:9066 | DBLE實(shí)例,連接數(shù)據(jù)庫(kù)時(shí),連接此IP:Port |
| Mysql A | 172.16.3.1:14014 | 物理數(shù)據(jù)庫(kù)實(shí)例A,真正存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)庫(kù) |
| Mysql B | 172.16.3.1:14015 | 物理數(shù)據(jù)庫(kù)實(shí)例B,真正存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)庫(kù) |
備注:為了演示簡(jiǎn)單,這里將實(shí)例都部署在了一臺(tái)機(jī)器上并用不同端口做區(qū)分,同學(xué)們也可以用三臺(tái)機(jī)器來(lái)做環(huán)境搭建
在MySQL A和MySQL B中創(chuàng)建庫(kù)表testdb.users來(lái)方便后續(xù)的驗(yàn)證,表結(jié)構(gòu)如下:
CREATE TABLE `users` ( `id` int(11) NOT NULL, `user` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1server.xml
server.xml里可以配置跟DBLE自身相關(guān)的許多參數(shù),這里重點(diǎn)只關(guān)注下面這段訪問(wèn)用戶(hù)相關(guān)的配置,其他默認(rèn)即可;
第一段 "< system >" 為DBLE的服務(wù)端口(默認(rèn)8066)和管理端口(默認(rèn)9066)的配置
- 管理端口只能接受DBLE的管理命令,這里不做展開(kāi)
- 服務(wù)端口即DBLE的業(yè)務(wù)訪問(wèn)端口,可以接受SQL語(yǔ)句
第二段“< user >”配置管理理用戶(hù),默認(rèn)為man1,密碼為654321
- 即可以通過(guò) mysql -P9066 -h 127.0.0.1 -u man1 -p654321來(lái)下發(fā)管理命令
第三段“< user >”配置業(yè)務(wù)用戶(hù),配置了一個(gè)賬號(hào)test 密碼password,針對(duì)數(shù)據(jù)庫(kù)testdb,讀寫(xiě)權(quán)限都有,沒(méi)有針對(duì)表做任何特殊的權(quán)限,故把表配置做了注釋
- 即可以通過(guò) mysql -P8066 -h 127.0.0.1 -utest -ppassword下發(fā)SQL語(yǔ)句
| user | 用戶(hù)配置節(jié)點(diǎn) |
| name | 登錄的用戶(hù)名,也就是連接DBLE的用戶(hù)名 |
| password | 登錄的密碼,也就是連接DBLE的密碼 |
| schemas | 數(shù)據(jù)庫(kù)名,這里會(huì)和schema.xml中的配置關(guān)聯(lián),多個(gè)用逗號(hào)分開(kāi),例如需要這個(gè)用戶(hù)需要管理兩個(gè)數(shù)據(jù)庫(kù)db1,db2,則配置db1,db2 |
| privileges | 配置用戶(hù)針對(duì)表的增刪改查的權(quán)限,具體見(jiàn)官方文檔,這里不做展開(kāi) |
schema.xml
schema.xml是最主要的配置項(xiàng),我們將users用戶(hù)表按照取模的方式平均拆分到了MySQL A和MySQL B兩個(gè)數(shù)據(jù)數(shù)據(jù)庫(kù)實(shí)例上, 詳細(xì)請(qǐng)看配置文件:
<?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"/><!-- 物理數(shù)據(jù)庫(kù)配置 --><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>參數(shù)說(shuō)明
- schema 邏輯數(shù)據(jù)庫(kù)信息,此數(shù)據(jù)庫(kù)為邏輯數(shù)據(jù)庫(kù),name 與 server.xml 中 schema對(duì)應(yīng);
- dataNode 分片信息,此為分片節(jié)點(diǎn)的定義;分片名字和schema的dataNode對(duì)應(yīng);分片與下面的dataHost 物理實(shí)例進(jìn)行關(guān)聯(lián);
- dataHost 物理實(shí)例組信息,dataHost下可以掛載同組的讀寫(xiě)物理實(shí)例節(jié)點(diǎn),實(shí)現(xiàn)高可用或者讀寫(xiě)分離;
每個(gè)節(jié)點(diǎn)的屬性逐一說(shuō)明:
-
schema: 屬性說(shuō)明 :
- name 邏輯數(shù)據(jù)庫(kù)名,與 server.xml 中的 schema 對(duì)應(yīng);
- table: 子屬性說(shuō)明 :
- name 表名,物理數(shù)據(jù)庫(kù)中表名
- dataNode 表存儲(chǔ)到哪些節(jié)點(diǎn),多個(gè)節(jié)點(diǎn)用逗號(hào)分隔
- primaryKey 主鍵,用于主鍵緩存和自增識(shí)別,不作主鍵約束
- autoIncrement 是否自增
- rule 分片規(guī)則名,具體規(guī)則下文 rule 詳細(xì)介紹
-
dataNode 屬性說(shuō)明:
- name 節(jié)點(diǎn)名,與 table 中 dataNode 對(duì)應(yīng)
- datahost 物理實(shí)例組名,與 datahost 中 name 對(duì)應(yīng)
- database 物理數(shù)據(jù)庫(kù)中數(shù)據(jù)庫(kù)名;
-
dataHost 屬性說(shuō)明:
- name 物理數(shù)據(jù)庫(kù)名,與 dataNode 中 dataHost 對(duì)應(yīng)
- balance 均衡負(fù)載的方式
- switchtype 寫(xiě)節(jié)點(diǎn)的高可用切換方式;等于1時(shí),心跳不健康發(fā)生切換
- heartbeat 心跳檢測(cè)語(yǔ)句,注意語(yǔ)句結(jié)尾的分號(hào)要加
- writehost 寫(xiě)物理實(shí)例 子屬性說(shuō)明 :
- host 物理實(shí)例名
- url 物理庫(kù)IP+Port
- user 物理庫(kù)用戶(hù)
- password 物理庫(kù)密碼
rule.xml
主要關(guān)注rule屬性,rule屬性的內(nèi)容來(lái)源于rule.xml這個(gè)文件,DBLE支持多種分表分庫(kù)的規(guī)則,基本能滿(mǎn)足你所需要的要求
table中的rule屬性對(duì)應(yīng)的就是rule.xml文件中tableRule的name,具體有哪些拆分算法實(shí)現(xiàn),建議還是看下文檔。我這里選擇的sharding-by-mod2,是hash算法的特例,就是將數(shù)據(jù)平均拆分。因?yàn)槲液蠖耸莾膳_(tái)物理庫(kù),所以rule.xml中hashmod2對(duì)應(yīng)的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>驗(yàn)證配置生效
啟動(dòng)DBLE
## 進(jìn)入DBLE安裝目錄,執(zhí)行start命令 ./bin/dble start## DBLE啟動(dòng)會(huì)自動(dòng)加載配置,需確認(rèn)進(jìn)程是否正常啟動(dòng),如啟動(dòng)失敗,建議按照日志報(bào)錯(cuò)排查問(wèn)題,正確啟動(dòng)日志如下: 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通過(guò)DBLE流量入口8066登陸數(shù)據(jù)庫(kù)
mysql -P8066 -h 127.0.0.1 -utest -ppassword插入兩條用戶(hù)記錄,并獲取DBLE側(cè)的查詢(xún)記錄
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)從上面的驗(yàn)證流程,往DBLE插入的數(shù)據(jù),會(huì)按照取模的方式下發(fā)到真實(shí)的物理庫(kù),來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的自動(dòng)分片;同時(shí)通過(guò)DBLE下發(fā)的查詢(xún)會(huì)被DBLE自動(dòng)下發(fā)給實(shí)際的物理庫(kù),合并返回給客戶(hù)端,可以通過(guò)explain執(zhí)行計(jì)劃觀察到下發(fā)的實(shí)際下發(fā)給物理庫(kù)的SQL語(yǔ)句
應(yīng)用場(chǎng)景二:讀寫(xiě)分離
DBLE除了做數(shù)據(jù)的分片功能外,也支持讀寫(xiě)分離功能;開(kāi)啟讀寫(xiě)分離功能后,可以將主實(shí)例上的讀壓力負(fù)載給原本stand by的從實(shí)例,從而擴(kuò)展整個(gè)集群的吞吐能力;
后端MySQL節(jié)點(diǎn)
我們?cè)偻ㄟ^(guò)示例,演示DBLE的讀寫(xiě)分離的功能。物理部署結(jié)構(gòu)如下表:
| DBLE | 172.16.3.1:9066 | DBLE實(shí)例,連接數(shù)據(jù)庫(kù)時(shí),連接此IP:Port |
| Mysql A | 172.16.3.1:14014 | 物理數(shù)據(jù)庫(kù)實(shí)例A,master實(shí)例 |
| Mysql B | 172.16.3.1:14015 | 物理數(shù)據(jù)庫(kù)實(shí)例B,slave實(shí)例 |
備注:為了演示簡(jiǎn)單,這里將實(shí)例都部署在了一臺(tái)機(jī)器上并用不同端口做區(qū)分,同學(xué)們也可以用三臺(tái)機(jī)器來(lái)做環(huán)境搭建
此場(chǎng)景中,我們將MySQL A和MySQL B搭建成主從復(fù)制關(guān)系,同時(shí)我們只變更schema.xml的配置來(lái)完成讀寫(xiě)分離的架構(gòu);
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"/><!-- 物理數(shù)據(jù)庫(kù)配置 --><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通過(guò)balance參數(shù)來(lái)控制讀寫(xiě)分離的負(fù)載策略,寫(xiě)節(jié)點(diǎn)是否參與均衡與datahost的balance屬性有關(guān),本案例中我們將值調(diào)整為balance="3",并定義了writeHost和readHost balance的定義具體見(jiàn)下圖
驗(yàn)證配置生效
通過(guò)DBLE管理入口9066登陸數(shù)據(jù)庫(kù),注意這里我們通過(guò)管理入口的show @@datasource來(lái)驗(yàn)證讀寫(xiě)分離的狀態(tài)的正確性
- session1
- session2
- session1
從show @@datasource;這個(gè)管理命令上我們能夠觀測(cè)到READ_LOAD在slave節(jié)點(diǎn)上計(jì)數(shù)器增加了5次,也就是說(shuō)讀流量順利的下發(fā)到了slave節(jié)點(diǎn);當(dāng)然大家也可以通過(guò)打開(kāi)mysql的general log來(lái)觀測(cè)讀寫(xiě)分離的情況
總結(jié)
本文通過(guò)兩個(gè)場(chǎng)景來(lái)講解DBLE的快速入門(mén),希望通過(guò)簡(jiǎn)單的示例來(lái)給大家梳理DBLE的基本概念,幫助大家快速熟悉和使用DBLE這個(gè)中間件;更高階的使用方法和細(xì)節(jié)建議大家參考官方文檔;
轉(zhuǎn)載于:https://my.oschina.net/actiontechoss/blog/3005888
總結(jié)
以上是生活随笔為你收集整理的开源分布式中间件 DBLE 快速入门指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Centos安装Lammps教程——in
- 下一篇: 相机sd卡格式化后还能不能数据再恢复