開源分布式中間件 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.pswp.cn/news/276054.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276054.shtml
英文地址,請注明出處:http://en.pswp.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…