MYCAT分庫分表中介軟體的簡單配置與使用
阿新 • • 發佈:2018-12-24
前一段時間讀了一本分散式相關的書籍,講到了一種mysql的分庫分表的中介軟體——shark,對它進行了一點研究,想用在實驗室要做的分散式交換系統之中。但是後來發現了一個問題,shark不支援強一致性的系統,而實驗室的分散式交換系統對於強一致性要求又比較高,不得已放棄學習shark,到網上查詢資料,發現有一款國人自主開發的mysql分庫分表中介軟體——MyCat的評價非常不錯,於是來學習學習。 MYCAT是mysql分庫分表中介軟體,前身是由阿里開發的Cobar,但開源了一段時間後就不再維護了。於是MYCAT在這個基礎之上繼續開發,優化了很多機制(如由BIO優化為NIO),在大資料時代,其重要性愈發明顯。以下是官方網站(www.mycat.io)中介紹的片段:
什麼是MYCAT
- 一個徹底開源的,面向企業應用開發的大資料庫叢集
- 支援事務、ACID、可以替代MySQL的加強版資料庫
- 一個可以視為MySQL叢集的企業級資料庫,用來替代昂貴的Oracle叢集
- 一個融合記憶體快取技術、NoSQL技術、HDFS大資料的新型SQL Server
- 結合傳統資料庫和新型分散式資料倉庫的新一代企業級資料庫產品
- 一個新穎的資料庫中介軟體產品
這裡配置了兩個使用者,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/