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這個中間件;更高階的使用方法和細節建議你們參考官方文檔;