Mycat 前生今世
如果我有一個(gè)32核心的服務(wù)器,我就可以實(shí)現(xiàn)1個(gè)億的數(shù)據(jù)分片,我有32核心的服務(wù)器么?沒有,所以我至今無法實(shí)現(xiàn)1個(gè)億的數(shù)據(jù)庫(kù)分片。---Mycat's Plan
Mycat 簡(jiǎn)介
Mycat是什么?
從定義和分類來看,它是一個(gè)開源的分布式數(shù)據(jù)庫(kù)系統(tǒng),是一個(gè)實(shí)現(xiàn)了MySQL協(xié)議的Server,前端用戶可以把它看做是一個(gè)數(shù)據(jù)庫(kù)代理,用MySQL客戶端工具和命令行訪問,而其后端可以用MySQL原生(Native)協(xié)議與多個(gè)MySQL服務(wù)器通信,也可以用JDBC協(xié)議與大多數(shù)主流數(shù)據(jù)庫(kù)服務(wù)器通信,其核心功能是分庫(kù)分表,即將一個(gè)大表水平分割為N個(gè)小表,存儲(chǔ)在后端MySQL服務(wù)器里或者其他數(shù)據(jù)庫(kù)里。
Mycat發(fā)展到目前版本,已經(jīng)不在是一個(gè)單純的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流數(shù)據(jù)庫(kù),也支持MongoDB這種新型NOSQL方式的存儲(chǔ),未來還會(huì)支持更多類型的存儲(chǔ)。而在最終用戶看來,無論是那種存儲(chǔ)方式,在Mycat里,都是一個(gè)傳統(tǒng)的數(shù)據(jù)庫(kù)表,支持標(biāo)準(zhǔn)的SQL語句進(jìn)行數(shù)據(jù)的操作,這樣一來,對(duì)前端業(yè)務(wù)系統(tǒng)來說,可以大幅度降低開發(fā)難度,提升開發(fā)速度,在測(cè)試階段,可以將一表定義為任何一種Mycat支持的存儲(chǔ)方式,比如MySQL的MyASM表、內(nèi)存表、或者M(jìn)ongoDB、LeveIDB以及號(hào)稱是世界上最快的內(nèi)存數(shù)據(jù)庫(kù)MemSQL上。
試想一下,用戶表存放在MemSQL上,大量讀頻率遠(yuǎn)超過寫頻率的數(shù)據(jù)如訂單的快照數(shù)據(jù)存放于InnoDB中,一些日志數(shù)據(jù)存放于MongoDB中,而且還能把Oracle的表跟MySQL的表做關(guān)聯(lián)查詢,你是否有一種不能呼吸的感覺?而未來,還能通過Mycat自動(dòng)將一些計(jì)算分析后的數(shù)據(jù)灌入到Hadoop中,并能用Mycat+Storm/Spark Stream引擎做大規(guī)模數(shù)據(jù)分析,看到這里。
對(duì)于DBA來說,可以這么理解Mycat:
Mycat就是MySQL Server,而Mycat后面連接的MySQL Server,就好象是MySQL的存儲(chǔ)引擎,如InnoDB,MyISAM等,因此,Mycat本身并不存儲(chǔ)數(shù)據(jù),數(shù)據(jù)是在后端的MySQL上存儲(chǔ)的,因此數(shù)據(jù)可靠性以及事務(wù)等都是MySQL保證的,簡(jiǎn)單的說,Mycat就是MySQL最佳伴侶,它在一定程度上讓MySQL擁有了能跟Oracle PK的能力。
對(duì)于軟件工程師來說,可以這么理解Mycat:
Mycat就是一個(gè)近似等于MySQL的數(shù)據(jù)庫(kù)服務(wù)器,你可以用連接MySQL的方式去連接Mycat(除了端口不同,默認(rèn)的Mycat端口是8066而非MySQL的3306,因此需要在連接字符串上增加端口信息),大多數(shù)情況下,可以用你熟悉的對(duì)象映射框架使用Mycat,但建議對(duì)于分片表,盡量使用基礎(chǔ)的SQL語句,因?yàn)檫@樣能達(dá)到最佳性能,特別是幾千萬甚至幾百億條記錄的情況下。
對(duì)于架構(gòu)師來說,可以這么理解Mycat:
Mycat是一個(gè)強(qiáng)大的數(shù)據(jù)庫(kù)中間件,不僅僅可以用作讀寫分離、以及分表分庫(kù)、容災(zāi)備份,而且可以用于多租戶應(yīng)用開發(fā)、云平臺(tái)基礎(chǔ)設(shè)施、讓你的架構(gòu)具備很強(qiáng)的適應(yīng)性和靈活性,借助于即將發(fā)布的Mycat智能優(yōu)化模塊,系統(tǒng)的數(shù)據(jù)訪問瓶頸和熱點(diǎn)一目了然,根據(jù)這些統(tǒng)計(jì)分析數(shù)據(jù),你可以自動(dòng)或手工調(diào)整后端存儲(chǔ),將不同的表映射到不同存儲(chǔ)引擎上,而整個(gè)應(yīng)用的代碼一行也不用改變。
當(dāng)前是個(gè)大數(shù)據(jù)的時(shí)代,但究竟怎樣規(guī)模的數(shù)據(jù)是和數(shù)據(jù)庫(kù)系統(tǒng)呢?對(duì)此,國(guó)外有一個(gè)數(shù)據(jù)庫(kù)領(lǐng)域的權(quán)威人士說了一個(gè)結(jié)論:干億以下的數(shù)據(jù)規(guī)模仍然是數(shù)據(jù)庫(kù)領(lǐng)域的專長(zhǎng),而Hadoop等這種系統(tǒng),更適合的是干億以上的規(guī)模,所以,Mycat適合1000億條以下的單表規(guī)模,如果你的數(shù)據(jù)超過了這個(gè)規(guī)模,請(qǐng)投靠Mycat Plus吧!
Mycat原理
Mycat的原理并不復(fù)雜,復(fù)雜的是代碼,如果代碼也不復(fù)雜,那么早就成為一個(gè)傳說了。
Mycat的原理中最重要的一個(gè)動(dòng)詞是“攔截”,它攔截了用戶發(fā)送過來的SQL語句,首先對(duì)SQL語句做了一些特定的分析:如分片分析、路由分析、讀寫分離分析、緩存分析等,然后將此SQL發(fā)往后端的真實(shí)數(shù)據(jù)庫(kù),并將返回的結(jié)果做適當(dāng)?shù)奶幚?,最終再返回給用戶。
上述圖片里,Orders表被分為三個(gè)分片datanode(簡(jiǎn)稱dn),這三個(gè)分片是分布在兩臺(tái)MySQL Server上(DataHost),即datanode=database@datahost方式,因此你可以用一臺(tái)到N臺(tái)服務(wù)器來分片,分片規(guī)則為(sharding rule)典型的字符串枚舉分片規(guī)則,一個(gè)規(guī)則的定義是分片字段(sharding column)+分片函數(shù)(rule function),這里的分片字段為rov而分片函數(shù)為字符串枚舉方式。
當(dāng)Mycat收到一個(gè)SQL時(shí),會(huì)先解析這個(gè)SQL,查找涉及到的表,然后看此表的定義,如果有分片規(guī)則,則獲取到SQL里分片字段的值,并匹配分片函數(shù),得到該QL對(duì)應(yīng)的分片列表,然后將SQL發(fā)往這些分片去執(zhí)行,最后收集和處理所有分片返回的結(jié)果數(shù)據(jù),并輸出到客戶端。以select * from Orders where prov=?語句為例,查到prov=wuhan,按照分片函數(shù),wuhan返回
dn1,于是SQL就發(fā)給了MySQL1,去取DB1上的查詢結(jié)果,并返回給用戶。
如果上述SQL改為elect * from Orders where prov in (‘wuhan’,‘beijing’),那么,SQL就會(huì)發(fā)給ySQL1與MySQL2去執(zhí)行,然后結(jié)果集合并后輸出給用戶。但通常業(yè)務(wù)中我們的SQL會(huì)有Order By 以及Limit翻頁(yè)語法,此時(shí)就涉及到結(jié)果集在Mycat端的二次處理,這部分的代碼也比較復(fù)雜,而最復(fù)雜的則屬兩個(gè)表的Jion問題,為此,Mycat提出了創(chuàng)新性的ER分片、全局表、HBT(Human Brain Tech)人工智能的Catlet、以及結(jié)合Storm/Spark引擎等十八般武藝的解決辦法,從而成為目前業(yè)界最強(qiáng)大的方案,這就是開源的力量!
應(yīng)用場(chǎng)景
Mycat發(fā)展到現(xiàn)在,適用的場(chǎng)景已經(jīng)很豐富,而且不斷有新用戶給出新的創(chuàng)新性的方案,以下是幾個(gè)典型的應(yīng)用場(chǎng)景:
a.單純的讀寫分離,此時(shí)配置最為簡(jiǎn)單,支持讀寫分離,主從切換
b.分表分庫(kù),對(duì)于超過1〇〇〇萬的表進(jìn)行分片,最大支持1 〇〇〇億的單表分片
c.多租戶應(yīng)用,每個(gè)應(yīng)用一個(gè)庫(kù),但應(yīng)用程序只連接Mycat,從而不改造程序本身,實(shí)現(xiàn)多租戶化
d.報(bào)表系統(tǒng),借助于Mycat的分表能力,處理大規(guī)模報(bào)表的統(tǒng)計(jì)
e.代替Hbase,分析大數(shù)據(jù)
f.作為海量數(shù)據(jù)實(shí)時(shí)查詢的一種簡(jiǎn)單有效方案,比如 1〇〇億條頻繁查詢的記錄需要在3秒內(nèi)查詢出來結(jié)果, 除了基于主鍵的查詢,還可能存在范圍查詢或其他屬性查詢,此時(shí)Mycat可能是最簡(jiǎn)單有效的選擇
—單純的讀寫分離,此時(shí)配置最為簡(jiǎn)單,支持讀寫分離,主從切換分表分庫(kù),對(duì)于超過000萬的表進(jìn)行分片,最大支持1000億的單表分片
—多租戶應(yīng)用,每個(gè)應(yīng)用一個(gè)庫(kù),但應(yīng)用程序只連接Mycat,從而不改造程序本身,實(shí)現(xiàn)多租戶化
—報(bào)表系統(tǒng),借助于Mycat的分表能力,處理大規(guī)模報(bào)表的統(tǒng)計(jì)替代Hbase,分析大數(shù)據(jù),作為海量數(shù)據(jù)實(shí)時(shí)查詢的一種簡(jiǎn)單有效方案,比如100億條頻繁查詢的記錄需要在3秒內(nèi)查詢出來結(jié)果,除了基于主鍵的查詢,還可能存在范圍查詢或其他屬性查詢,此時(shí)ycat可能是最簡(jiǎn)單有效的選擇
Mycat長(zhǎng)期路線圖
強(qiáng)化分布式數(shù)據(jù)庫(kù)中間件的方面的功能,使之具備豐富的插件、強(qiáng)大的數(shù)據(jù)庫(kù)智能優(yōu)化功能、全面的系統(tǒng)監(jiān)控能力、以及方便的數(shù)據(jù)運(yùn)維工具,實(shí)現(xiàn)在線數(shù)據(jù)擴(kuò)容、遷移等高級(jí)功能進(jìn)一步挺進(jìn)大數(shù)據(jù)計(jì)算領(lǐng)域,深度結(jié)合Spark Stream和Storm等分布式實(shí)時(shí)流引擎,能夠完成快速的巨表關(guān)聯(lián)、排序、分組聚合等 OLAP方向的能力,并集成一些熱門常用的實(shí)時(shí)分析算法,讓工程師以及DBA們更容易用Mycat實(shí)現(xiàn)一些高級(jí)數(shù)據(jù)分析處理功能。
不斷強(qiáng)化Mycat開源社區(qū)的技術(shù)水平,吸引更多的IT技術(shù)專家,使得Mycat社區(qū)成為中國(guó)的Apache,并將Mycat推到Apache基金會(huì),成為國(guó)內(nèi)頂尖開源項(xiàng)目,最終能夠讓一部分志愿者成為專職的Mycat開發(fā)者,榮耀跟實(shí)力一起提升。
依托Mycat社區(qū),聚集100個(gè)CXO級(jí)別的精英,眾籌建設(shè)親親山莊,Mycat社區(qū)+親親山莊=中國(guó)最大IT O2O社區(qū)
Mycat中的概念
數(shù)據(jù)庫(kù)中間件
前面講了Mycat是一個(gè)開源的分布式數(shù)據(jù)庫(kù)系統(tǒng),但是由于真正的數(shù)據(jù)庫(kù)需要存儲(chǔ)引擎,而Mycat并沒有存儲(chǔ)引擎,所以并不是完全意義的分布式數(shù)據(jù)庫(kù)系統(tǒng)。
那么Mycat是什么?Mycat是數(shù)據(jù)庫(kù)中間件,就是介于數(shù)據(jù)庫(kù)與應(yīng)用之間,進(jìn)行數(shù)據(jù)處理與交互的中間服務(wù)。由于前面講的對(duì)數(shù)據(jù)進(jìn)行分片處理之后,從原有的一個(gè)庫(kù),被切分為多個(gè)分片數(shù)據(jù)庫(kù),所有的分片數(shù)據(jù)庫(kù)集群構(gòu)成了整個(gè)完整的數(shù)據(jù)庫(kù)存儲(chǔ)。
如上圖所表示,數(shù)據(jù)被分到多個(gè)分片數(shù)據(jù)庫(kù)后,應(yīng)用如果需要讀取數(shù)據(jù),就要需要處理多個(gè)數(shù)據(jù)源的數(shù)據(jù)。如果沒有數(shù)據(jù)庫(kù)中間件,那么應(yīng)用將直接面對(duì)分片集群,數(shù)據(jù)源切換、事務(wù)處理、數(shù)據(jù)聚合都需要應(yīng)用直接處理,原本該是專注于業(yè)務(wù)的應(yīng)用,將會(huì)花大量的工作來處理分片后的問題,最重要的是每個(gè)應(yīng)用處理將是完全的重復(fù)造輪子。
所以有了數(shù)據(jù)庫(kù)中間件,應(yīng)用只需要集中與業(yè)務(wù)處理,大量的通用的數(shù)據(jù)聚合,事務(wù),數(shù)據(jù)源切換都由中間件來處理,中間件的性能與處理能力將直接決定應(yīng)用的讀寫性能,所以一款好的數(shù)據(jù)庫(kù)中間件至關(guān)重要。
邏輯庫(kù)(schema)
通常對(duì)實(shí)際應(yīng)用來說,并不需要知道中間件的存在,開發(fā)人員只需要知道數(shù)據(jù)庫(kù)的概念,所以數(shù)據(jù)庫(kù)中間件可以被看做是一個(gè)或多個(gè)數(shù)據(jù)庫(kù)集群構(gòu)成的邏輯庫(kù)。
在云計(jì)算時(shí)代,數(shù)據(jù)庫(kù)中間件可以以多租戶的形式給一個(gè)或多個(gè)應(yīng)用提供服務(wù),每個(gè)應(yīng)用訪問的可能是一個(gè)獨(dú)立或者是共享的物理庫(kù),常見的如阿里云數(shù)據(jù)庫(kù)服務(wù)器RDS。
邏輯表(table)
既然有邏輯庫(kù),那么就會(huì)有邏輯表,分布式數(shù)據(jù)庫(kù)中,對(duì)應(yīng)用來說,讀寫數(shù)據(jù)的表就是邏輯表。邏輯表,可 以是數(shù)據(jù)切分后,分布在一個(gè)或多個(gè)分片庫(kù)中,也可以不做數(shù)據(jù)切分,不分片,只有一個(gè)表構(gòu)成。
分片表
分片表,是指那些原有的很大數(shù)據(jù)的表,需要切分到多個(gè)數(shù)據(jù)庫(kù)的表,這樣,每個(gè)分片都有一部分?jǐn)?shù)據(jù),所 有分片構(gòu)成了完整的數(shù)據(jù)
例如在mycat配置中的t_node就屬于分片表,數(shù)據(jù)按照規(guī)則被分到dn1,dn2兩個(gè)分片節(jié)點(diǎn)(dataNode) 上。
<table name=nt_noden primaryKey=nvidn autoincrement=ntruen dataNode=ndn1,dn2n rule=nrule1n />
非分片表
一個(gè)數(shù)據(jù)庫(kù)中并不是所有的表都很大,某些表是可以不用進(jìn)行切分的,非分片是相對(duì)分片表來說的,就是那 些不需要進(jìn)行數(shù)據(jù)切分的表。
如下配置中t_node ,只存在于分片節(jié)點(diǎn)(dataNode ) dn1上。
<table name=nt_noden primaryKey=nvidn autoincrement=ntruen dataNode=ndn1" />
ER 表
關(guān)系型數(shù)據(jù)庫(kù)是基于實(shí)體關(guān)系模型(Entity-Relationship Model)之上,通過其描述了真實(shí)世界中事物與關(guān) 系,Mycat中的ER表即是來源于此。根據(jù)這一思路,提出了基于E-R關(guān)系的數(shù)捤分片策略,子表的記錄與所關(guān) 聯(lián)的父表記錄存放在同一個(gè)數(shù)據(jù)分片上,即子表依賴于父表,通過表分組(Table Group )保證數(shù)據(jù)Join不會(huì)跨庫(kù)操作。
表分組(Table Group )是解決跨分片數(shù)據(jù)join的一種很好的思路,也是數(shù)據(jù)切分規(guī)劃的重要一條規(guī)則。
全局表
一個(gè)真實(shí)的業(yè)務(wù)系統(tǒng)中,往往存在大量的類似字典表的表,這些表基本上很少變動(dòng),字典表具有以下幾個(gè)特性:
1.變動(dòng)不頻繁
2.數(shù)據(jù)量總體變化不大
3.數(shù)據(jù)規(guī)模不大,很少有超過數(shù)十萬條記錄。
分片節(jié)點(diǎn)(dataNode)
數(shù)據(jù)切分后,一個(gè)大表被分到不同的分片數(shù)據(jù)庫(kù)上面,每個(gè)表分片所在的數(shù)據(jù)庫(kù)就是分片節(jié)點(diǎn) (dataNode )。
節(jié)點(diǎn)主機(jī)(dataHost)
數(shù)據(jù)切分后,每個(gè)分片節(jié)點(diǎn)(dataNode )不一定都會(huì)獨(dú)占一臺(tái)機(jī)器,同一機(jī)器上面可以有多個(gè)分片數(shù)據(jù)庫(kù), 這樣一個(gè)或多個(gè)分片節(jié)點(diǎn)(dataNode )所在的機(jī)器就是節(jié)點(diǎn)主機(jī)(dataHost),為了規(guī)避單節(jié)點(diǎn)主機(jī)并發(fā)數(shù)限 制,盡量將讀寫壓力高的分片節(jié)點(diǎn)(dataNode )均衡的放在不同的節(jié)點(diǎn)主機(jī)(dataHost )。
分片規(guī)則(rule)
前面講了數(shù)據(jù)切分,1個(gè)大表被分成若干個(gè)分片表,就需要一定的規(guī)則,這樣按照某種業(yè)務(wù)規(guī)則把數(shù)據(jù)分到 某個(gè)分片的規(guī)則就是分片規(guī)則,數(shù)據(jù)切分選擇合適的分片規(guī)則非常重要,將極大的避免后續(xù)數(shù)據(jù)處理的難度。
多租戶
多租戶技術(shù)或稱多重租賃技術(shù),是一種軟件架構(gòu)技術(shù),它是在探討與實(shí)現(xiàn)如何于多用戶的環(huán)境下共用相同的系統(tǒng)或程序組件,并且仍可確保各用戶間數(shù)據(jù)的隔離性。在云計(jì)算時(shí)代,多租戶技術(shù)在共用的數(shù)據(jù)中心以單一系統(tǒng)架構(gòu)與服務(wù)提供多數(shù)客戶端相同甚至可定制化的服務(wù),并且仍然可以保障客戶的數(shù)據(jù)隔離。目前各種各樣的云計(jì)算服務(wù)就是這類技術(shù)范疇,例如阿里云數(shù)據(jù)庫(kù)服務(wù)(RDS )、阿里云服務(wù)器(ECS)等等。
多租戶在數(shù)據(jù)存儲(chǔ)上存在三種主要的方案,分別是:
1.1 獨(dú)立數(shù)據(jù)庫(kù)
這是第一種方案,即一個(gè)租戶一個(gè)數(shù)據(jù)庫(kù),這種方案的用戶數(shù)據(jù)隔離級(jí)別最高,安全性最好,但成本也高。
優(yōu)點(diǎn):
1、為不同的租戶提供獨(dú)立的數(shù)據(jù)庫(kù),有助于簡(jiǎn)化數(shù)據(jù)模型的擴(kuò)展設(shè)計(jì),滿足不同租戶的獨(dú)特需求;
2、如果出現(xiàn)故障,恢復(fù)數(shù)據(jù)比較簡(jiǎn)單。
缺點(diǎn):
1、增大了數(shù)據(jù)庫(kù)的安裝數(shù)量,隨之帶來維護(hù)成本和購(gòu)置成本的增加。
這種方案與傳統(tǒng)的一個(gè)客戶、一套數(shù)據(jù)、一套部署類似,差別只在于軟件統(tǒng)一部署在運(yùn)營(yíng)商那里。如果面對(duì)的是銀行、醫(yī)院等需要非常高數(shù)據(jù)隔離級(jí)別的租戶,可以選擇這種模式,提高租用的定價(jià)。如果定價(jià)較低,產(chǎn)品 走低價(jià)路線,這種方案一般對(duì)運(yùn)營(yíng)商來說是無法承受的。
1.2共享數(shù)據(jù)庫(kù),隔離數(shù)據(jù)架構(gòu)
這是第二種方案,即多個(gè)或所有租戶共享Database,但是每個(gè)租戶一個(gè)Schema。
優(yōu)點(diǎn):
1、為安全性要求較高的租戶提供了一定程度的邏輯數(shù)據(jù)隔離,并不是完全隔離;每個(gè)數(shù)據(jù)庫(kù)可以支持更多的租戶數(shù)量。
缺點(diǎn):
1、如果出現(xiàn)故障,數(shù)據(jù)恢復(fù)比較困難,因?yàn)榛謴?fù)數(shù)據(jù)庫(kù)將牽扯到其它租戶的數(shù)據(jù)
2、如果需要跨租戶統(tǒng)計(jì)數(shù)據(jù),存在一定困難。
共享數(shù)據(jù)庫(kù),共享數(shù)據(jù)架構(gòu)
這是第三種方案,即租戶共享同一個(gè)Database、同一個(gè)Schema,但在表中通過TenantID區(qū)分租戶的數(shù)據(jù)。這是共享程度最高、隔離級(jí)別最低的模式。
優(yōu)點(diǎn):
1、三種方案比較,第三種方案的維護(hù)和購(gòu)置成本最低,允許每個(gè)數(shù)據(jù)庫(kù)支持的租戶數(shù)量最多。
缺點(diǎn):
1、隔離級(jí)別最低,安全性最低,需要在設(shè)計(jì)開發(fā)時(shí)加大對(duì)安全的開發(fā)量;
2、數(shù)據(jù)備份和恢復(fù)最困難,需要逐表逐條備份和還原。
3、如果希望以最少的服務(wù)器為最多的租戶提供服務(wù),并且租戶接受以犧牲隔離級(jí)別換取降低成本,這種方案最適合
官方網(wǎng)站:http://www.mycat.org.cn/
何為數(shù)據(jù)切分?
簡(jiǎn)單來說,就是指通過某種特定的條件,將我們存放在同一個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù)分散存放到多個(gè)數(shù)據(jù)庫(kù)(主 機(jī))上面,以達(dá)到分散單臺(tái)設(shè)備負(fù)載的效果。
數(shù)據(jù)的切分(Sharding )根據(jù)其切分規(guī)則的類型,可以分為兩種切分模式。一種是按照不同的表(或者 Schema )來切分到不同的數(shù)據(jù)庫(kù)(主機(jī))之上,這種切可以稱之為數(shù)據(jù)的垂直(縱向)切分;另外一種則是根據(jù)表中的數(shù)據(jù)的邏輯關(guān)系,將同一個(gè)表中的數(shù)據(jù)按照某種條件拆分到多臺(tái)數(shù)據(jù)庫(kù)(主機(jī))上面,這種切分稱之為數(shù)據(jù)的水平(橫向)切分。
垂直切分的最大特點(diǎn)就是規(guī)則簡(jiǎn)單,實(shí)施也更為方便,尤其適合各業(yè)務(wù)之間的耦合度非常低,相互影響很小,業(yè)務(wù)邏輯非常清晰的系統(tǒng)。在這種系統(tǒng)中,可以很容易做到將不同業(yè)務(wù)模塊所使用的表分拆到不同的數(shù)據(jù)庫(kù)中。根據(jù)不同的表來進(jìn)行拆分,對(duì)應(yīng)用程序的影響也更小,拆分規(guī)則也會(huì)比較簡(jiǎn)單清晰。
水平切分于垂直切分相比,相對(duì)來說稍微復(fù)雜一些。因?yàn)橐獙⑼粋€(gè)表中的不同數(shù)據(jù)拆分到不同的據(jù)庫(kù)中,對(duì)于應(yīng)用程序來說,拆分規(guī)則本身就較根據(jù)表名來拆分更為復(fù)雜,后期的數(shù)據(jù)維護(hù)也會(huì)更為復(fù)雜一些。
垂直切分
一個(gè)數(shù)據(jù)庫(kù)由很多表的構(gòu)成,每個(gè)表對(duì)應(yīng)著不同的業(yè)務(wù),垂直切分是指按照業(yè)務(wù)將表進(jìn)行分類,分布到不同 的數(shù)據(jù)庫(kù)上面,這樣也就將數(shù)據(jù)或者說壓力分擔(dān)到不同的庫(kù)上面,如下圖:
一個(gè)架構(gòu)設(shè)計(jì)較好的應(yīng)用系統(tǒng),其總體功能肯定是由很多個(gè)功能模塊所組成的,而每一個(gè)功能模塊所需要的 數(shù)據(jù)對(duì)應(yīng)到數(shù)據(jù)庫(kù)中就是一個(gè)或者多個(gè)表。而在架構(gòu)設(shè)計(jì)中,各個(gè)功能模塊相互之間的交互點(diǎn)越統(tǒng)一越少,系統(tǒng) 的耦合度就越低,系統(tǒng)各個(gè)模塊的維護(hù)性以及擴(kuò)展性也就越好。這樣的系統(tǒng),實(shí)現(xiàn)數(shù)據(jù)的垂直切分也就越容易。
但是往往系統(tǒng)之有些表難以做到完全的獨(dú)立,存在這擴(kuò)庫(kù)join的情況,對(duì)于這類的表,就需要去做平衡,是數(shù)據(jù)庫(kù)讓步業(yè)務(wù),共用一個(gè)數(shù)據(jù)源,還是分成多個(gè)庫(kù),業(yè)務(wù)之間通過接口來做調(diào)用。在系統(tǒng)初期,數(shù)據(jù)量比較少,或者資源有限的情況下,會(huì)選擇共用數(shù)據(jù)源,但是當(dāng)數(shù)據(jù)發(fā)展到了一定的規(guī)模,負(fù)載很大的情況,就需要必須去做分割。
一般來講業(yè)務(wù)存在著復(fù)雜join的場(chǎng)景是難以切分的,往往業(yè)務(wù)獨(dú)立的易于切分。如何切分,切分到何種 程度是考驗(yàn)技術(shù)架構(gòu)的一個(gè)難題。
下面來分析下垂直切分的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
- 拆分后業(yè)務(wù)清晰,拆分規(guī)則明確。
- 系統(tǒng)之間整合或擴(kuò)展容易。
- 數(shù)據(jù)維護(hù)簡(jiǎn)單。
缺點(diǎn):
- 部分業(yè)務(wù)表無法join ,只能通過接口方式解決,提高了系統(tǒng)復(fù)雜度。
- 受每種業(yè)務(wù)不同的限制存在單庫(kù)性能瓶頸,不易擴(kuò)展跟性能提高。
- 事務(wù)處理復(fù)雜。由于垂直切分是按照業(yè)務(wù)的分類將表分散到不同的庫(kù),所以有些業(yè)務(wù)表會(huì)過于龐大,存在單庫(kù)讀寫與存儲(chǔ)瓶頸,所以就需要水平拆分來做解決。
水平切分
相對(duì)于垂直拆分,水平拆分不是將表做分類,而是按照某個(gè)字段的某種規(guī)則來分散到多個(gè)庫(kù)之中,每個(gè)表中包含一部分?jǐn)?shù)據(jù)。簡(jiǎn)單來說,我們可以將數(shù)據(jù)的水平切分理解為是按照數(shù)據(jù)行的切分,就是將表中的某些行切分 到一個(gè)數(shù)據(jù)庫(kù),而另外的某些行又切分到其他的數(shù)據(jù)庫(kù)中,如圖:
拆分?jǐn)?shù)據(jù)就需要定義分片規(guī)則。關(guān)系型數(shù)據(jù)庫(kù)是行列的二維模型,拆分的第一原則是找到拆分維度。比如: 從會(huì)員的角度來分析,商戶訂單交易類系統(tǒng)中查詢會(huì)員某天期某個(gè)訂單,那么就需要按照會(huì)員結(jié)合日期來拆分,不同的數(shù)據(jù)按照會(huì)員ID做分組,這樣所有的數(shù)據(jù)查詢join都會(huì)在單庫(kù)內(nèi)解決;如果從商戶的角度來講,要查詢某個(gè)商家某天所有的訂單數(shù),就需要按照商戶ID做拆分;但是如果系統(tǒng)既想按會(huì)員拆分,又想按商家數(shù)據(jù),則會(huì)有一定的困難。如何找到合適的分片規(guī)則需要綜合考慮衡量。
幾種典型的分片規(guī)則包括:
a.按照用戶ID求模,將數(shù)據(jù)分散到不同的數(shù)據(jù)庫(kù),具有相同數(shù)據(jù)用戶的數(shù)據(jù)都被分散一個(gè)庫(kù)中。
b.按照日期,將不同月甚至日的數(shù)據(jù)分散到不同的庫(kù)中。
c.按照某個(gè)特定的字段求模,或者根據(jù)特定范圍段分散到不同的庫(kù)中。
如圖,切分原則都是根據(jù)業(yè)務(wù)找到適合的切分規(guī)則分散到不同的庫(kù),下面用用戶 ID 求模舉例:
既然數(shù)據(jù)做了拆分有優(yōu)點(diǎn)也就優(yōu)缺點(diǎn)。
優(yōu)點(diǎn):
A.拆分規(guī)則抽象好,join 操作基本可以數(shù)據(jù)庫(kù)做
B.不存在單庫(kù)大數(shù)據(jù),高并發(fā)的性能瓶頸。
C.應(yīng)用端改造較少。
D.提高了系統(tǒng)的穩(wěn)定性跟負(fù)載能力。
缺點(diǎn):
a.拆分規(guī)則難以抽象。
b.分片亊務(wù)一致性難以解決。
c.數(shù)捤多次擴(kuò)展難度跟維護(hù)量極大。
d.跨庫(kù) join 性能較差。
前面講了垂直切分跟水平切分的不同跟優(yōu)缺點(diǎn),會(huì)發(fā)現(xiàn)每種切分都有缺點(diǎn),但共同的特點(diǎn)缺點(diǎn)有:
1.引入分布式亊務(wù)的問題。
2.跨節(jié)點(diǎn) Join 的問題。
3.跨節(jié)點(diǎn)合并排序分頁(yè)問題。
4.多數(shù)據(jù)源管理問題。
針對(duì)數(shù)據(jù)源管理,目前主要有兩種思路:
A. 客戶端模式,在每個(gè)應(yīng)用程序模塊中配置管理自己需要的一個(gè)(或者多個(gè))數(shù)據(jù)源,直接訪問各個(gè)數(shù)據(jù)庫(kù),在模塊內(nèi)完成數(shù)據(jù)的整合;
B. 通過中間代理層來統(tǒng)一管理所有的數(shù)據(jù)源,后端數(shù)據(jù)庫(kù)集群對(duì)前端應(yīng)用程序透明;
可能 90%以上的人在面對(duì)上面這兩種解決思路的時(shí)候都會(huì)傾向于選擇第二種,尤其是系統(tǒng)不斷變得龐大復(fù)雜的時(shí)候。確實(shí),這是一個(gè)非常正確的選擇,雖然短期內(nèi)需要付出的成本可能會(huì)相對(duì)更大一些,但是對(duì)整個(gè)系統(tǒng)的擴(kuò)展性來講,是非常有幫助的數(shù)據(jù)切分的原則:
數(shù)據(jù)切分的原則:
第一原則:能不切分盡量不要切分。
第二原則:如果要切分一定要選擇合適的切分規(guī)則,提前規(guī)劃好。
第三原則:數(shù)據(jù)切分盡量通過數(shù)據(jù)冗余或者表分組(Table Group)來降低跨庫(kù) Join 的可能。
第四原則:由于數(shù)據(jù)庫(kù)中間件對(duì)數(shù)據(jù) Join 實(shí)現(xiàn)的優(yōu)劣難以把握,而且實(shí)現(xiàn)高性能難度極大,業(yè)務(wù)讀取盡量少使用多表 Join。
安裝Mycat
安裝Mycat
wget https://github.com/MyCATApache/Mycat-download/raw/master/1.5-RELEASE/Mycat-server-1.5.1-RELEASE-20160622153300-linux.tar.gz
tar zxf Mycat-server-1.5.1-RELEASE-20160622153300-linux.tar.gz
mv mycat /application/
echo "export PATH=/application/mycat/bin:$PATH">>/etc/profile
source /etc/profile
echo $PATH
下載安裝JDK
wget http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.rpm
rpm -ivh jdk-8u91-linux-x64.rpm
配置環(huán)境變量
echo "export JAVA_HOME=/usr/java/jdk1.8.0_91/" >>/etc/profile
echo "export PATH=$JAVA_HOME/bin:/application/mycat/bin/:$PATH">>/etc/profile
echo "export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar">>/etc/profile
source /etc/profile
[root@Linuxdemo3 ~]# java -version
java version "1.8.0_91"
Java(TM) SE RuntimeEnvironment(build 1.8.0_91-b14)
JavaHotSpot(TM)64-BitServer VM (build 25.91-b14, mixed mode)
創(chuàng)建管理用戶
主庫(kù)上對(duì)rep和rep_r用戶授權(quán)如下:
用戶:rep 密碼:oldboy 端口:3306
權(quán)限:all
命令:
grant replication slave on test.* to 'rep'@'10.0.0.%' identified by 'oldboy';
grant replication slave on test.* to 'rep_r'@'10.0.0.%' identified by 'oldboy';
flush privileges;
注:為了方便下面的主從切換,兩個(gè)用戶都授予了所有的權(quán)限,生產(chǎn)環(huán)境盡量不要這樣子授權(quán)!
修改mycat配置文件
[root@Linuxdemo3 mycat]# pwd
/application/mycat
[root@Linuxdemo3 mycat]# ll
total 24
drwxr-xr-x 2 root root 4096Jul 403:13 bin
drwxrwxrwx 2 root root 4096Dec13 2015 catlet
drwxrwxrwx 2 root root 4096Jul 403:13 conf
drwxr-xr-x 2 root root 4096Jul 403:13 lib
drwxrwxrwx 2 root root 4096Dec13 2015 logs
-rwxrwxrwx 1 root root 219Jun2215:33 version.txt
目錄解釋如下:
1.bin程序目錄,存放了 window版本和linux版本,除了提供封裝服務(wù)的版本之外,也提供了 nowrap的 shell腳本命令,方便大家選擇和修改,進(jìn)入到bin目錄:
2.Linux 下運(yùn)行:./mycat console,首先要 chmod +x *
注:mycat 支持的命令{ console | start | stop | restart | status | dump }
3.conf目錄下存放配置文件,其中:
4.server.xm丨是Mycat服務(wù)器參數(shù)調(diào)整和用戶授權(quán)的配置文件,
5.schema.xm丨是邏 輯庫(kù)定義和表仌及分片定義的配置文件,
6.rule.xml是分片規(guī)則的配置文件,分片規(guī)則的具體一些參數(shù)信息單獨(dú)存 放為文件,也在這個(gè)目錄下,配置文件修改,需要重啟Mycat或者通過9066端口 reload.
7.lib目錄下主要存放mycat依賴的一些jar文件.
9.日志存放在logs/mycat.log中,每天一個(gè)文件,日志的配置是在conf/log4j.xml中,根據(jù)自己的需要,可 以調(diào)整輸出級(jí)別為debug , debug級(jí)別下,會(huì)輸出更多的信息,方便排查問題
注意:Linux下部署安裝MySQL ,默認(rèn)不忽略表名大小寫,需要手動(dòng)到/etc/my.cnf下配置 lower_case_table_names=1使Linux環(huán)境下MySQL忽略表名大小寫,否則使用MyCAT的時(shí)候會(huì)提示找不到 表的
修改server.xml文件
[root@Linuxdemo3 conf]# vim server.xml
</system>
<user name="rep">
<property name="password">oldboy</property>
<property name="schemas">test</property>
</user>
<user name="rep_r">
<property name="password">oldboy</property>
<property name="schemas"> test</property>
<property name="readOnly">true</property>
</user>
注意:
1、這里配置的是可以連接主庫(kù)的兩個(gè)用戶
用戶:rep 密碼:oldboy 給予此用戶test數(shù)據(jù)庫(kù)增刪改查的權(quán)限。
用戶:rep_r 密碼:oldboy 給予此用戶test數(shù)據(jù)庫(kù)讀的權(quán)限。
2、這里的test,不一定是你數(shù)據(jù)庫(kù)上的真實(shí)庫(kù)名,可以任意指定,只要接下來和schema.xml的配置文件的庫(kù)名統(tǒng)一即可。
修改schema.xml文件
[root@Linuxdemo3 conf]# vim schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="test"/>
<dataNode name="dn2" dataHost="localhost1" database=" test "/>
<dataNode name="dn3" dataHost="localhost1" database=" test "/>
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="10.0.0.202:3306" user="rep"
password="oldboy">
</writeHost>
<readHost host="hostS1" url="10.0.0.202:3307" user="rep_r"
password="oldboy"/>
</readHost>
</dataHost>
</mycat:schema>
(1)<schema name=”test” checkSQLschema=”false” sqlMaxLimit=”100″ dataNode=”dn1″>
這里的oldboy就是我們所宣稱的數(shù)據(jù)庫(kù)名稱,必須和server.xml中的用戶指定的數(shù)據(jù)庫(kù)名稱一致。添加一個(gè)dataNode=”dn1”,是指定了我們這個(gè)庫(kù)只有在dn1上,沒有分庫(kù)。
(2) <dataNode name=”dn1″ dataHost=”localhost1″ database=”test” />
這里只需要改database的名字,db1就是你真是的數(shù)據(jù)庫(kù)上的數(shù)據(jù)庫(kù)名,可根據(jù)自己的數(shù)據(jù)庫(kù)名稱修改。
(3)
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
需要配置的位置:
balance="1" writeType="0" switchType="1"
balance
1、balance=0 不開啟讀寫分離機(jī)制,所有讀操作都發(fā)送到當(dāng)前可用的writehost了 .
2、balance=1 全部的readhost與stand by writeHost 參與select語句的負(fù)載均衡。簡(jiǎn)單的說,雙主雙從模式(M1àS1,M2àS2,并且M1和M2互為主備),正常情況下,M1,S1,S2都參與select語句的復(fù)雜均衡。
3、balance=2 所有讀操作都隨機(jī)的在readhost和writehost上分發(fā)
writeType
負(fù)載均衡類型,目前的取值有3種:
1、writeType=”0″, 所有寫操作發(fā)送到配置的第一個(gè)writeHost。
2、writeType=”1″,所有寫操作都隨機(jī)的發(fā)送到配置的writeHost。
3、writeType=”2″,不執(zhí)行寫操作。
switchType
1、switchType=-1 表示不自動(dòng)切換
2、switchType=1 默認(rèn)值,自動(dòng)切換
3、switchType=2 基于MySQL 主從同步的狀態(tài)決定是否切換
(4)
<writeHost host="hostM1" url="10.0.0.202:3306" user="rep"
password="oldboy">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="10.0.0.202:3306" user="rep_r"
password="oldboy"/>
注意:
這里配置的是讀寫服務(wù)器的IP地址和端口訪問,訪問的用戶名和密碼;而且一定要先在客戶端測(cè)試OK了以后在進(jìn)行配置。
啟動(dòng)Mycat
[root@Linuxdemo3 conf]#/application/mycat/bin/mycat start
StartingMycat-server...
[root@Linuxdemo3 logs]#
出現(xiàn)這個(gè)界面表示mycat已經(jīng)成功啟動(dòng)了,如果出現(xiàn)錯(cuò)誤的話請(qǐng)查看日志wrapper.log
讀寫分離測(cè)試1、在客戶端連接mysql主庫(kù)服務(wù)器:
mysql -urep -poldboy -h10.0.0.202 -P8066
mysql> explain create table company(id int not null primary key,name varchar(100));
+-----------+---------------------------------------------------------------------+
| DATA_NODE | SQL |
+-----------+---------------------------------------------------------------------+
| dn1 | create table company(id int not null primary key,name varchar(100)) |
| dn2 | create table company(id int not null primary key,name varchar(100)) |
| dn3 | create table company(id int not null primary key,name varchar(100)) |
+-----------+---------------------------------------------------------------------+
3 rows in set (0.06 sec)
mysql> create table company(id int not null primary key,name varchar(100));
Query OK, 0 rows affected (1.82 sec)
mysql> explain insert into company(id, name) values (100, 'abc');
+-----------+---------------------------------------------------+
| DATA_NODE | SQL |
+-----------+---------------------------------------------------+
| dn1 | insert into company(id, name) values (100, 'abc') |
| dn2 | insert into company(id, name) values (100, 'abc') |
| dn3 | insert into company(id, name) values (100, 'abc') |
+-----------+---------------------------------------------------+
3 rows in set (0.00 sec)
mysql> insert into company(id, name) values (100, 'abc');
Query OK, 1 row affected (0.24 sec)
查看日志
日志中有如下信息
分別在主從庫(kù)中執(zhí)行以下命令:
mysql> select * from company where id =100;
+-----+------+
| id | name |
+-----+------+
|100| abc |
+-----+------+
1 row in set(0.00 sec)
日志中有如下
在從庫(kù)中執(zhí)行insert命令會(huì)得到以下錯(cuò)誤:
mysql> insert into company(id, name) values (4,'abcwq');
ERROR 1495(HY000):User readonly
#從庫(kù)只讀
從上面的測(cè)試中可以看出來,向數(shù)據(jù)庫(kù)中讀寫數(shù)據(jù),走的是不同的數(shù)據(jù)庫(kù),證明,讀寫分離測(cè)試成功!
主從切換測(cè)試
將schema.xml文件做如下修改:
[root@Linuxdemo3 conf]# vim schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="test"/>
<dataNode name="dn2" dataHost="localhost1" database=" test "/>
<dataNode name="dn3" dataHost="localhost1" database=" test "/>
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM1" url="10.0.0.202:3306" user="rep"
password="oldboy">
</writeHost>
<readHost host="hostS1" url="10.0.0.202:3307" user="rep_r"
password="oldboy"/>
</readHost>
<writeHost host="hostM2" url="10.0.0.202:3307" user="rep"
password="oldboy">
</writeHost>
</dataHost>
</mycat:schema>
重啟mycat服務(wù)
[root@Linuxdemo2 conf]#/application/mycat/bin/mycat restart
StoppingMycat-server...
StoppedMycat-server.
StartingMycat-server...
此時(shí),停止主庫(kù),再進(jìn)行測(cè)試,會(huì)發(fā)現(xiàn)mycat服務(wù)依然可以正常讀寫數(shù)據(jù)庫(kù)。mysql已切換到從庫(kù)。
- [root@Linuxdemo2 conf]#/data/3306/mysql stop
Mycat-Web
MyCAT-WEB就是基于mycat的一個(gè)性能監(jiān)控工具,方便大家更有效的使用mycat管理mycat監(jiān)控mycat,讓大家的mycat工作更加高效。mycat-web的運(yùn)行依賴 zookpeer 所以事先要安裝好。
Zookeeper 作為一個(gè)分布式的服務(wù)框架,主要用來解決分布式集群中應(yīng)用系統(tǒng)的一致性問題, 它能提供基于類似于文件系統(tǒng)的目錄節(jié)點(diǎn)樹方式的數(shù)據(jù)存儲(chǔ),但是 Zookeeper 并不是用來專門存儲(chǔ)數(shù)據(jù)的,它的作用主要是用來維護(hù)和監(jiān)控你存儲(chǔ)的數(shù)據(jù)的狀態(tài)變化,通過監(jiān)控這些數(shù)據(jù)狀態(tài)的變化,從而可以達(dá)到基于數(shù)據(jù)的集群管理。
ZooKeeper是一個(gè)開源的分布式的,為分布式應(yīng)用提供協(xié)調(diào)服務(wù)的Apache項(xiàng)目。ZooKeeper提供一個(gè)簡(jiǎn)單的原語集合,以便于分布式應(yīng)用可以在它之上構(gòu)建更高層次的同步服務(wù)。ZooKeeper的設(shè)計(jì)非常易于編程,它使用的是類似于文件系統(tǒng)那樣的樹形數(shù)據(jù)結(jié)構(gòu)。
安裝zookpeer
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
tar -xzvf zookeeper-3.4.6.tar.gz
cd zookeeper-3.4.6/conf
cp zoo_sample.cfg zoo.cfg
cd zookeeper-3.4.6/bin
./zkServer.sh start
出現(xiàn)一下信息說明啟動(dòng)成功
JMX enabled by default
Using config:/usr1/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
安裝mycat-web
wget https://github.com/MyCATApache/Mycat-download/raw/master/mycat-web-1.0/Mycat-web-1.0-SNAPSHOT-20160617163048-linux.tar.gz
tar zxf Mycat-web-1.0-SNAPSHOT-20160617163048-linux.tar.gz
cd mycat-web/mycat-web/WEB-INF/classes
vim mycat.properties
zookeeper=127.0.0.1:2181
sqlonline.server=10.0.0.202
cd mycat-web
#將start.sh文件中的JVM調(diào)整到合適的大小
./start.sh &
#8082端口是web端口
訪問10.0.0.202:8082/mycat即可進(jìn)入web頁(yè)面
配置Mycat(此步驟可省略)
cd /application/mycat/bin
另外有四個(gè)相對(duì)重要的文件
文件 用處
/application/mycat/bin/xml_to_yaml.sh 根據(jù)mycat配置生成 zookeeper yaml 配置工具
/application/mycat/bin/init_zk_data.sh 將生成的yaml配置文件導(dǎo)入遠(yuǎn)程zookeeper
/application/mycat/conf/myid.properties zookeeper 路徑配置參數(shù)信息
/application/mycat/conf/zk-create.yaml 自動(dòng)生成的zk配置
1)確認(rèn)安裝好zookeeper 環(huán)境
2)啟動(dòng)mycat服務(wù),確認(rèn)本地服務(wù)一切正常。
3)執(zhí)行xml_to_yaml.sh腳本(確認(rèn)本地配置過 JAVA_HOME 和 MYCAT_HOME環(huán)境變量,)
[root@Linuxdemo3 bin]#./xml_to_yaml.sh
4)執(zhí)行 init_zk_data.sh 腳本,注意下默認(rèn)情況下腳本會(huì)將zookeeper定位在同一臺(tái)服務(wù)器上面,如有需要可以調(diào)整下 ZK 的 IP : PORT
[root@Linuxdemo3 bin]#./init_zk_data.sh
管理命令與監(jiān)控
mycat自身有類似其他數(shù)據(jù)庫(kù)的管理監(jiān)控方式,可通過mysql命令行,登陸端口9066執(zhí)行相應(yīng)的SQL操作,也可通過jdbc的方式進(jìn)行遠(yuǎn)程連接管理。
登錄: mycat有兩個(gè)端口,8066數(shù)據(jù)端口,9066管理端口。命令行登錄時(shí)通過9066管理端口來執(zhí)行:
mysql -urep -poldboy -h10.0.0.202-P9066 -Dtest
選項(xiàng):
-h 后面接主機(jī)
-u mycat server.xml配置的邏輯庫(kù)用戶
-p mycat server.xml配置的邏輯庫(kù)密碼
-P 后面接的端口9066,注意P大寫
-D Mycat server.xml中配置的邏輯庫(kù)
1、查看所有的命令,如下:
mysql> show @@help;
+--------------------------------------+-----------------------------------+
| STATEMENT | DESCRIPTION |
+--------------------------------------+-----------------------------------+
| clear @@slowwhere datanode =? |Clear slow sql by datanode |
| clear @@slowwhere schema =? |Clear slow sql by schema |
| kill @@connection id1,id2,... |Kill the specified connections |
| offline |ChangeMyCat status to OFF |
| online |ChangeMyCat status to ON |
| reload @@config |Reload basic config from file |
| reload @@config_all |Reload all config from file |
| reload @@route |Reload route config from file |
| reload @@user |Reload user config from file |
| rollback @@config |Rollback all config from memory |
| rollback @@route |Rollback route config from memory |
| rollback @@user |Rollback user config from memory |
| show @@backend |Report backend connection status |
| show @@cache |Report system cache usage |
| show @@command |Report commands status |
| show @@connection |Report connection status |
| show @@connection.sql |Report connection sql |
| show @@database |Report databases |
| show @@datanode |Report dataNodes |
| show @@datanodewhere schema =? |Report dataNodes |
| show @@datasource |Report dataSources |
| show @@datasourcewhere dataNode =?|Report dataSources |
| show @@heartbeat |Report heartbeat status |
| show @@parser |Report parser status |
| show @@processor |Report processor status |
| show @@router |Report router status |
| show @@server |Report server status |
| show @@session |Report front session details |
| show @@slowwhere datanode =? |Report datanode slow sql |
| show @@slowwhere schema =? |Report schema slow sql |
| show @@sqlwhere id =? |Report specify SQL |
| show @@sql.detail where id =? |Report execute detail status |
| show @@sql.execute |Report execute status |
| show @@sql.slow |Report slow SQL |
| show @@threadpool |Report threadPool status |
| show @@time.current |Report current timestamp |
| show @@time.startup |Report startup timestamp |
| show @@version |ReportMycatServer version |
| stop @@heartbeat name:time |Pause dataNode heartbeat |
|switch@@datasource name:index |Switch dataSource
2、更新配置文件
mysql> reload @@config;
Query OK,1 row affected (0.13 sec)
Reload config success
3、顯示mycat數(shù)據(jù)庫(kù)的列表,對(duì)應(yīng)的在scehma.xml配置的邏輯庫(kù)
mysql> show @@database;
+----------+
| DATABASE |
+----------+
| oldboy |
+----------+
1 row in set(0.00 sec)
4、顯示mycat數(shù)據(jù)節(jié)點(diǎn)的列表,對(duì)應(yīng)的是scehma.xml配置文件的dataNode節(jié)點(diǎn)
mysql> show @@datanode;
+------+-------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME | DATHOST | INDEX | TYPE | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+------+-------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| dn1 | localhost1/oldboy | 0| mysql | 0| 10|1000| 457| 0| 0| 0| -1|
| dn2 | localhost1/oldboy | 0| mysql | 0| 10|1000| 457| 0| 0| 0| -1|
| dn3 | localhost1/oldboy | 0| mysql | 0| 10|1000| 457| 0| 0| 0| -1|
+------+-------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
3 rows in set(0.00 sec)
其中,NAME表示datanode的名稱;dataHost 對(duì)應(yīng)的是dataHost屬性的值,數(shù)據(jù)主機(jī)的名稱,ACTIVE表示活躍的連接數(shù),IDIE表示閑置的連接數(shù),SIZE對(duì)應(yīng)的是總連接的數(shù)量。
5、報(bào)告心跳狀態(tài)
mysql> show @@heartbeat;
+--------+-------+-------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| NAME | TYPE | HOST | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME | STOP |
+--------+-------+-------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| hostM1 | mysql |10.0.0.202|3306| 1| 0| idle | 0|1,1,1 |2015-12-2921:39:40|false|
| hostS1 | mysql |10.0.0.202|3307| 1| 0| idle | 0|3,3,3 |2015-12-2921:39:40|false|
+--------+-------+-------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
2 rows in set(0.01 sec)
RS_STATUS狀態(tài)為1,正常狀態(tài)
6、獲取當(dāng)前mycat的版本
mysql> show @@version;
+--------------------------------------+
| VERSION |
+--------------------------------------+
|5.5.8-mycat-1.4-alpha-20150520235658|
+--------------------------------------+
1 row in set(0.00 sec)
7、顯示mycat前端連接狀態(tài)
mysql> show @@connection;
+------------+------+-----------+------+------------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
| PROCESSOR | ID | HOST | PORT | LOCAL_PORT | SCHEMA | CHARSET | NET_IN | NET_OUT | ALIVE_TIME(S)| RECV_BUFFER | SEND_QUEUE | txlevel | autocommit |
+------------+------+-----------+------+------------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
|Processor0| 6|127.0.0.1|9066| 46490| oldboy | utf8:33| 281| 6164| 1008| 4096| 0| | |
+------------+------+-----------+------+------------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
1 row in set(0.00 sec)
8、顯示mycat后端連接狀態(tài)
mysql> show @@backend;
+------------+------+---------+-------------+------+--------+--------+---------+------+--------+----------+------------+--------+---------+---------+------------+
| processor | id | mysqlId | host | port | l_port | net_in | net_out | life | closed | borrowed | SEND_QUEUE | schema | charset | txlevel | autocommit |
+------------+------+---------+-------------+------+--------+--------+---------+------+--------+----------+------------+--------+---------+---------+------------+
|Processor0| 1| 30|10.0.0.202|3306| 14881| 3554| 1068|5041|false |false | 0| oldboy | utf8:33|3 |true |
|Processor0| 2| 32|10.0.0.202|3306| 14883| 3554| 1068|5041|false |false | 0| oldboy | utf8:33|3 |true |
|Processor0| 3| 24|10.0.0.202|3306| 14875| 3515| 1068|5041|false |false | 0| oldboy | utf8:33|3 |true |
|Processor0| 4| 28|10.0.0.202|3306| 14879| 3561| 986|5041|false |false | 0| oldboy | utf8:33|0 |true |
9、顯示數(shù)據(jù)源
mysql> show @@datasource;
+----------+--------+-------+-------------+------+------+--------+------+------+---------+
| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE |
+----------+--------+-------+-------------+------+------+--------+------+------+---------+
| dn1 | hostM1 | mysql |10.0.0.202|3306| W | 0| 10|1000| 525|
| dn1 | hostS1 | mysql |10.0.0.202|3306| R | 0| 8|1000| 522|
| dn3 | hostM1 | mysql |10.0.0.202|3306| W | 0| 10|1000| 525|
| dn3 | hostS1 | mysql |10.0.0.202|3306| R | 0| 8|1000| 522|
| dn2 | hostM1 | mysql |10.0.0.202|3306| W | 0| 10|1000| 525|
| dn2 | hostS1 | mysql |10.0.0.202|3306| R | 0| 8|1000| 522|
+----------+--------+-------+-------------+------+------+--------+------+------+---------+
6 rows in set(0.01 sec)
特別說明:
reload @@config,這個(gè)命令在執(zhí)行的時(shí)候,mycat服務(wù)不可用,防止提交的事物出錯(cuò)。
筆者QQ:604419314 喜歡筆者可以收藏本網(wǎng)站