1. 程式人生 > >MYCAT分庫分表中介軟體的簡單配置與使用

MYCAT分庫分表中介軟體的簡單配置與使用

    前一段時間讀了一本分散式相關的書籍,講到了一種mysql的分庫分表的中介軟體——shark,對它進行了一點研究,想用在實驗室要做的分散式交換系統之中。但是後來發現了一個問題,shark不支援強一致性的系統,而實驗室的分散式交換系統對於強一致性要求又比較高,不得已放棄學習shark,到網上查詢資料,發現有一款國人自主開發的mysql分庫分表中介軟體——MyCat的評價非常不錯,於是來學習學習。

MYCAT是mysql分庫分表中介軟體,前身是由阿里開發的Cobar,但開源了一段時間後就不再維護了。於是MYCAT在這個基礎之上繼續開發,優化了很多機制(如由BIO優化為NIO),在大資料時代,其重要性愈發明顯。以下是官方網站(www.mycat.io)中介紹的片段:

什麼是MYCAT

  • 一個徹底開源的,面向企業應用開發的大資料庫叢集
  • 支援事務、ACID、可以替代MySQL的加強版資料庫
  • 一個可以視為MySQL叢集的企業級資料庫,用來替代昂貴的Oracle叢集
  • 一個融合記憶體快取技術、NoSQL技術、HDFS大資料的新型SQL Server
  • 結合傳統資料庫和新型分散式資料倉庫的新一代企業級資料庫產品
  • 一個新穎的資料庫中介軟體產品
MYCAT的架構為: MYCAT的開源社群為了幫助使用者更好更快的掌握MYCAT使用技巧和方法,撰寫了《MYCAT》權威指南,可以到官方網站上下載電子版。 下面開始簡單的配置與使用。 首先環境是ubuntu-14.04作業系統,裝好mysql-5.6。還由於MYCAT是用JAVA編寫的,需要java7以上的環境。在MYCAT的官方網站上下載MYCAT到系統之中(在寫這篇文章的時候,MYCAT的最新版本是1.6),解壓並且拷貝到/usr/local/Mycat/目錄下。編輯/etc/profile檔案,在末尾新增export MYCAT_HOME=/usr/local/Mycat,儲存退出,執行source /etc/profile使其生效。 在不配置叢集的情況下,此時應該可以啟動mycat了,通過$MYCAT_HOME/bin/mycat start即可在後臺啟動mycat,將start改為console可以在控制檯啟動。如果發現啟動不了,可以檢視$MYCAT_HOME/logs/下可以檢視MYCAT的日誌,一般通過日誌都可以看出有什麼問題,如主機名沒繫結等問題。如果是mysql的使用者名稱密碼不對,導致MYCAT連線mysql失敗,不著急,看後面。 然後就是MYCAT的重點了,幾個關鍵配置檔案($MYCAT_HOME/conf/目錄下)的配置方法: (1)server.xml 這個配置檔案定義了MYCAT服務的基本資訊,如MYCAT的使用者名稱及密碼,還有對哪些邏輯庫有操作許可權等等。對於最簡單的配置來說,關心使用者配置即可:
    這裡配置了兩個使用者,root和user,root使用者可以操作的邏輯庫為TESTDB,密碼為root; user使用者的密碼為user,可以操作的邏輯庫也為TESTDB,但是隻有可讀許可權。

(2)schema.xml

    這個配置檔案定義的內容就有點多了。首先說一下個人對於邏輯庫的理解,邏輯庫實際上是在MYCAT中才存在的資料庫,在實際的mysql中並不存在這個資料庫,所以才是邏輯上的資料庫,設計邏輯庫的原因是要讓MYCAT中的一個庫就能對應到mysql中的不同的庫,最終實現分庫分表。下面是邏輯庫的定義:



    這裡定義了一個邏輯庫TESTDB,裡面有一張邏輯表travelrecord(原來預設的一邏輯些表已經註釋),它的主鍵是id,有三個資料節點(dataNode)dn1、dn2、dn3(配置見後面),所使用的分片演算法是auto-sharding-long(配置見後面)。

接下來是資料節點的定義(dataNode):



    其中資料節點dn1對應的主機是localhost1,實際資料庫是db1;資料節點dn2對應的主機是localhost1,實際資料庫是db2;資料節點dn3對應的主機是localhost1,實際資料庫是db3。對於主機localhost1的配置,即是locathost:3306,使用者名稱配置為root,密碼配置為自己mysql資料庫實際的密碼(前面如果由於資料庫密碼不對導致MYCAT無法連線mysql的話,此時應該可以連線了)

(3)rule.xml

    這個配置檔案配置了分片演算法。前面我們定義邏輯表travelrecord使用分片演算法auto-sharding-long,於是在這個檔案中定義:



    這個鍵值對定義了auto-sharding-long演算法使用id列來進行判斷,具體實現為rang-long:



    這個鍵值對定義了rang-long實現的類,和具體實現方法的檔案為conf目錄下的autopartition-long.txt檔案,這個檔案的內容為:



    可見,根據id進行分片,id為0-50000時,分片到index為0的資料庫(即db1);id為50001-100000時,分片到index為1的資料庫(即db2);id為100001-150000時,分片到index為2的資料庫(即db3)。

此時,需要在mysql資料庫中新建三個資料庫(即在MYCAT中定義的db1、db2、db3):

create database db1; create database db2; create database db3;



    在每個庫中新建表travelrecord:

create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);

    分別在三個資料庫中新增一條資料(注意id):

insert into travelrecord(id,user_id,traveldate,fee,days) values(1,'Victor',20160101,100,10);

insert into travelrecord(id,user_id,traveldate,fee,days) values(5000001,'Job',20160102,100,10);

insert into travelrecord(id,user_id,traveldate,fee,days) values(10000001,'Slow',20160103,100,10);

    這個時候,使用navicat工具,連線到MYCAT,使用者名稱之前配置的為root,密碼之前也配置的為root,埠為8066(MYCAT對外提供伺服器的預設埠)。可以發現有一個邏輯庫TESTDB,邏輯庫中有一張邏輯表travelrecord,表中可以查詢到之前在mysql中的三個資料庫(db1,db2,db3)中新增的三條記錄:



    此時我們在邏輯表中新增一條記錄,id為50002,其它內容隨便填。按照分片規則,此時應該分片到實際資料庫db2,我們這時到mysql的db2資料庫的travelrecord表中檢視,就可以看到這條記錄:



    當然,我們也可以在邏輯表中刪除id為50002的記錄,再到mysql的db2資料庫的travelrecord表中檢視,發現這條記錄已經被刪除了。

    這只是一個非常簡單的分庫分表的示例。在系統分散式化、大規模化的方面,在大量資料得到分庫分表後,同時實現MYCAT叢集化可以在一定程度上緩解資料庫讀寫瓶頸的問題。

    當然,據開源社群給的文件,MYCAT還有好多好玩的功能,如MYCAT監控、MYCAT通過zookeeper啟動等,在此不一一介紹了。

檢視原文:
http://www.xuchenbjtu.cn/index.php/2017/12/01/mycat/