Mycat分庫分表

轉(zhuǎn)載:https://www.cnblogs.com/joylee/p/7513038.html

學會數(shù)據(jù)庫讀寫分離野崇、分表分庫——用Mycat侦锯,這一篇就夠了趾疚!

系統(tǒng)開發(fā)中立膛,數(shù)據(jù)庫是非常重要的一個點。除了程序的本身的優(yōu)化讹堤,如:SQL語句優(yōu)化吆鹤、代碼優(yōu)化,數(shù)據(jù)庫的處理本身優(yōu)化也是非常重要的洲守。主從疑务、熱備沾凄、分表分庫等都是系統(tǒng)發(fā)展遲早會遇到的技術(shù)問題問題。Mycat是一個廣受好評的數(shù)據(jù)庫中間件知允,已經(jīng)在很多產(chǎn)品上進行使用了撒蟀。希望通過這篇文章的介紹,能學會Mycat的使用温鸽。

安裝

Mycat官網(wǎng):http://www.mycat.io/

可以了解下Mycat的背景和應(yīng)用情況保屯,這樣使用起來比較有信心。

Mycat下載地址:http://dl.mycat.io/

官網(wǎng)有個文檔嗤朴,屬于詳細的介紹配椭,初次入門,看起來比較花時間雹姊。

下載:

建議大家選擇 1.6-RELEASE 版本股缸,畢竟是比較穩(wěn)定的版本。

安裝:

根據(jù)不同的系統(tǒng)選擇不同的版本吱雏。包括linux敦姻、windows、mac,作者考慮還是非常周全的歧杏,當然镰惦,也有源碼版的。(ps:源碼版的下載后犬绒,只要配置正確旺入,就可以正常運行調(diào)試,這個贊一下凯力。)

Mycat的安裝其實只要解壓下載的目錄就可以了茵瘾,非常簡單。

安裝完成后咐鹤,目錄如下:

目錄說明

binmycat命令拗秘,啟動、重啟祈惶、停止等

catletcatlet為Mycat的一個擴展功能

confMycat 配置信息,重點關(guān)注

libMycat引用的jar包雕旨,Mycat是java開發(fā)的

logs日志文件,包括Mycat啟動的日志和運行的日志捧请。

配置

Mycat的配置文件都在conf目錄里面凡涩,這里介紹幾個常用的文件:

文件說明

server.xmlMycat的配置文件,設(shè)置賬號疹蛉、參數(shù)等

schema.xmlMycat對應(yīng)的物理數(shù)據(jù)庫和數(shù)據(jù)庫表的配置

rule.xmlMycat分片(分庫分表)規(guī)則

Mycat的架構(gòu)其實很好理解活箕,Mycat是代理,Mycat后面就是物理數(shù)據(jù)庫氧吐。和Web服務(wù)器的Nginx類似讹蘑。對于使用者來說,訪問的都是Mycat筑舅,不會接觸到后端的數(shù)據(jù)庫座慰。

我們現(xiàn)在做一個主從、讀寫分離翠拣,簡單分表的示例版仔。結(jié)構(gòu)如下圖:

服務(wù)器IP說明

Mycat192.168.0.2mycat服務(wù)器,連接數(shù)據(jù)庫時误墓,連接此服務(wù)器

database1192.168.0.3物理數(shù)據(jù)庫1蛮粮,真正存儲數(shù)據(jù)的數(shù)據(jù)庫

database2192.168.0.4物理數(shù)據(jù)庫2,真正存儲數(shù)據(jù)的數(shù)據(jù)庫

Mycat作為主數(shù)據(jù)庫中間件谜慌,肯定是與代碼弱關(guān)聯(lián)的然想,所以代碼是不用修改的,使用Mycat后欣范,連接數(shù)據(jù)庫是不變的变泄,默認端口是8066。連接方式和普通數(shù)據(jù)庫一樣恼琼,如:jdbc:mysql://192.168.0.2:8066/

server.xml

示例

Copy

testlunchfalse<!-- 表級 DML 權(quán)限設(shè)置 --><!--? ? ? ?

? ? ? ? <privileges check="false">

? ? ? ? ? ? <schema name="TESTDB" dml="0110" >

? ? ? ? ? ? ? ? <table name="tb01" dml="0000"></table>

? ? ? ? ? ? ? ? <table name="tb02" dml="1111"></table>

? ? ? ? ? ? </schema>

? ? ? ? </privileges>? ? ?

? ? ? ? -->

重點關(guān)注下面這段妨蛹,其他默認即可。

參數(shù)說明

user用戶配置節(jié)點

--name登錄的用戶名晴竞,也就是連接Mycat的用戶名

--password登錄的密碼蛙卤,也就是連接Mycat的密碼

--schemas數(shù)據(jù)庫名,這里會和schema.xml中的配置關(guān)聯(lián)噩死,多個用逗號分開颤难,例如需要這個用戶需要管理兩個數(shù)據(jù)庫db1,db2,則配置db1,dbs

--privileges配置用戶針對表的增刪改查的權(quán)限甜滨,具體見文檔吧

我這里配置了一個賬號test 密碼也是test,針對數(shù)據(jù)庫lunch,讀寫權(quán)限都有乐严,沒有針對表做任何特殊的權(quán)限。

schema.xml

schema.xml是最主要的配置項衣摩,首先看我的配置文件昂验。

Copy

<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><!-- 數(shù)據(jù)庫配置,與server.xml中的數(shù)據(jù)庫對應(yīng) --><!-- 分片配置 --><!-- 物理數(shù)據(jù)庫配置 -->select user();select user();

參數(shù)說明

schema數(shù)據(jù)庫設(shè)置艾扮,此數(shù)據(jù)庫為邏輯數(shù)據(jù)庫既琴,name與server.xml中schema對應(yīng)

dataNode分片信息,也就是分庫相關(guān)配置

dataHost物理數(shù)據(jù)庫泡嘴,真正存儲數(shù)據(jù)的數(shù)據(jù)庫

每個節(jié)點的屬性逐一說明:

schema:

屬性說明

name邏輯數(shù)據(jù)庫名甫恩,與server.xml中的schema對應(yīng)

checkSQLschema數(shù)據(jù)庫前綴相關(guān)設(shè)置,建議看文檔酌予,這里暫時設(shè)為folse

sqlMaxLimitselect 時默認的limit磺箕,避免查詢?nèi)?/p>

table:

屬性說明

name表名奖慌,物理數(shù)據(jù)庫中表名

dataNode表存儲到哪些節(jié)點,多個節(jié)點用逗號分隔松靡。節(jié)點為下文dataNode設(shè)置的name

primaryKey主鍵字段名简僧,自動生成主鍵時需要設(shè)置

autoIncrement是否自增

rule分片規(guī)則名,具體規(guī)則下文rule詳細介紹

dataNode

屬性說明

name節(jié)點名雕欺,與table中dataNode對應(yīng)

datahost物理數(shù)據(jù)庫名岛马,與datahost中name對應(yīng)

database物理數(shù)據(jù)庫中數(shù)據(jù)庫名

dataHost

屬性說明

name物理數(shù)據(jù)庫名,與dataNode中dataHost對應(yīng)

balance均衡負載的方式

writeType寫入方式

dbType數(shù)據(jù)庫類型

heartbeat心跳檢測語句屠列,注意語句結(jié)尾的分號要加啦逆。

應(yīng)用場景

數(shù)據(jù)庫分表分庫

配置如下:

Copy

<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><!-- 數(shù)據(jù)庫配置,與server.xml中的數(shù)據(jù)庫對應(yīng) --><!-- 分片配置 --><!-- 物理數(shù)據(jù)庫配置 -->select user();select user();

我在192.168.0.2笛洛、192.168.0.3均有數(shù)據(jù)庫lunch夏志。

lunchmenu、restaurant撞蜂、userlunch盲镶、users這些表都只寫入節(jié)點dn1,也就是192.168.0.2這個服務(wù)蝌诡,而dictionary寫入了dn1溉贿、dn2兩個節(jié)點,也就是192.168.0.2浦旱、192.168.0.3這兩臺服務(wù)器宇色。分片的規(guī)則為:mod-long。

主要關(guān)注rule屬性颁湖,rule屬性的內(nèi)容來源于rule.xml這個文件宣蠕,Mycat支持10種分表分庫的規(guī)則,基本能滿足你所需要的要求甥捺,這個必須贊一個抢蚀,其他數(shù)據(jù)庫中間件好像都沒有這么多。

table中的rule屬性對應(yīng)的就是rule.xml文件中tableRule的name,具體有哪些分表和分庫的實現(xiàn)镰禾,建議還是看下文檔皿曲。我這里選擇的mod-long就是將數(shù)據(jù)平均拆分。因為我后端是兩臺物理庫吴侦,所以rule.xml中mod-long對應(yīng)的function count為2屋休,見下面部分代碼:

Copy

idmod-long<!-- how many data nodes -->2

數(shù)據(jù)庫讀寫分離

配置如下:

Copy

<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><!-- 數(shù)據(jù)庫配置,與server.xml中的數(shù)據(jù)庫對應(yīng) --><!-- 分片配置 --><!-- 物理數(shù)據(jù)庫配置 -->select user();

這樣的配置與前一個示例配置改動如下:

刪除了table分配的規(guī)則,以及datanode只有一個

datahost也只有一臺备韧,但是writehost總添加了readhost,balance改為1劫樟,表示讀寫分離。

以上配置達到的效果就是102.168.0.2為主庫,192.168.0.3為從庫叠艳。

注意:Mycat主從分離只是在讀的時候做了處理奶陈,寫入數(shù)據(jù)的時候,只會寫入到writehost附较,需要通過mycat的主從復制將數(shù)據(jù)復制到readhost尿瞭,這個問題當時候我糾結(jié)了好久,數(shù)據(jù)寫入writehost后翅睛,readhost一直沒有數(shù)據(jù),以為是自己配置的問題黑竞,后面才發(fā)現(xiàn)Mycat就沒有實現(xiàn)主從復制的功能捕发,畢竟數(shù)據(jù)庫本身自帶的這個功能才是最高效穩(wěn)定的。

至于其他的場景很魂,如同時主從和分表分庫也是支持的了扎酷,只要了解這個實現(xiàn)以后再去修改配置,都是可以實現(xiàn)的遏匆。而熱備及故障專業(yè)官方推薦使用haproxy配合一起使用法挨,大家可以試試。

使用

Mycat的啟動也很簡單幅聘,啟動命令在Bin目錄:

Copy

##啟動mycat start##停止mycat stop##重啟mycat restart

如果在啟動時發(fā)現(xiàn)異常凡纳,在logs目錄中查看日志。

wrapper.log 為程序啟動的日志帝蒿,啟動時的問題看這個

mycat.log 為腳本執(zhí)行時的日志荐糜,SQL腳本執(zhí)行報錯后的具體錯誤內(nèi)容,查看這個文件。mycat.log是最新的錯誤日志葛超,歷史日志會根據(jù)時間生成目錄保存暴氏。

mycat啟動后,執(zhí)行命令不成功绣张,可能實際上配置有錯誤答渔,導致后面的命令沒有很好的執(zhí)行。

Mycat帶來的最大好處就是使用是完全不用修改原有代碼的侥涵,在mycat通過命令啟動后沼撕,你只需要將數(shù)據(jù)庫連接切換到Mycat的地址就可以了。如下面就可以進行連接了:

Copy

mysql -h192.168.0.1 -P8806 -uroot -p123456

連接成功后可以執(zhí)行sql腳本了独令。

所以端朵,可以直接通過sql管理工具(如:navicat、datagrip)連接燃箭,執(zhí)行腳本冲呢。我一直用datagrip來進行日常簡單的管理,這個很方便招狸。

Mycat還有一個管理的連接敬拓,端口號是9906.

Copy

mysql -h192.168.0.1 -P9906 -uroot -p123456

連接后可以根據(jù)管理命令查看Mycat的運行情況邻薯,當然,喜歡UI管理方式的人乘凸,可以安裝一個Mycat-Web來進行管理厕诡,有興趣自行搜索。

簡而言之营勤,開發(fā)中使用Mycat和直接使用Mysql機會沒有差別灵嫌。

常見問題

使用Mycat后總會遇到一些坑,我將自己遇到的一些問題在這里列一下葛作,希望能與大家有共鳴:

Mycat是不是配置以后寿羞,就能完全解決分表分庫和讀寫分離問題?

Mycat配合數(shù)據(jù)庫本身的復制功能赂蠢,可以解決讀寫分離的問題绪穆,但是針對分表分庫的問題,不是完美的解決虱岂【猎海或者說,至今為止第岖,業(yè)界沒有完美的解決方案难菌。

分表分庫寫入能完美解決,但是蔑滓,不能完美解決主要是聯(lián)表查詢的問題扔傅,Mycat支持兩個表聯(lián)表的查詢,多余兩個表的查詢不支持烫饼。 其實猎塞,很多數(shù)據(jù)庫中間件關(guān)于分表分庫后查詢的問題,都是需要自己實現(xiàn)的杠纵,而且節(jié)本都不支持聯(lián)表查詢荠耽,Mycat已經(jīng)算做地非常先進了。

分表分庫的后聯(lián)表查詢問題比藻,大家通過合理數(shù)據(jù)庫設(shè)計來避免铝量。

Mycat支持哪些數(shù)據(jù)庫,其他平臺如 .net银亲、PHP能用嗎慢叨?

官方說了,支持的數(shù)據(jù)庫包括MySQL务蝠、SQL Server拍谐、Oracle、DB2、PostgreSQL 等主流數(shù)據(jù)庫轩拨,很贊践瓷。

盡量用Mysql,我試過SQL Server,會有些小問題亡蓉,因為部分語法有點差異晕翠。

Mycat 非JAVA平臺如 .net、PHP能用嗎砍濒?

可以用淋肾。這一點MyCat做的也很棒。

參考

《Mycat權(quán)威指南》:?http://www.mycat.io/document/Mycat_V1.6.0.pdf

官網(wǎng) :http://www.mycat.io/

如果想熟練使用Mycat爸邢,建議要仔細看看官方推薦的文檔巫员,可能需要花點時間。本文只是簡單的介紹下Mycat的配置甲棍,希望能快速讓大家對Mycat有個認識,官方的文檔理解起來也很容易赶掖,只是需要的時間更多感猛,本文為說明的參數(shù),請參考官方文檔奢赂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陪白,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子膳灶,更是在濱河造成了極大的恐慌咱士,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轧钓,死亡現(xiàn)場離奇詭異序厉,居然都是意外死亡,警方通過查閱死者的電腦和手機毕箍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門弛房,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人而柑,你說我怎么就攤上這事文捶。” “怎么了媒咳?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵粹排,是天一觀的道長。 經(jīng)常有香客問我涩澡,道長顽耳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮斧抱,結(jié)果婚禮上常拓,老公的妹妹穿的比我還像新娘。我一直安慰自己辉浦,他們只是感情好弄抬,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宪郊,像睡著了一般掂恕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弛槐,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天懊亡,我揣著相機與錄音,去河邊找鬼乎串。 笑死店枣,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的叹誉。 我是一名探鬼主播鸯两,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼长豁!你這毒婦竟也來了钧唐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匠襟,失蹤者是張志新(化名)和其女友劉穎钝侠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酸舍,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡帅韧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了啃勉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弱匪。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖璧亮,靈堂內(nèi)的尸體忽然破棺而出萧诫,到底是詐尸還是另有隱情,我是刑警寧澤枝嘶,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布帘饶,位于F島的核電站,受9級特大地震影響群扶,放射性物質(zhì)發(fā)生泄漏及刻。R本人自食惡果不足惜镀裤,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缴饭。 院中可真熱鬧暑劝,春花似錦、人聲如沸颗搂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丢氢。三九已至傅联,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疚察,已是汗流浹背蒸走。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留貌嫡,地道東北人比驻。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像岛抄,于是被迫代替她去往敵國和親别惦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容