1. 程式人生 > >MyCat介紹與配置(精)

MyCat介紹與配置(精)


Mycat 前生今世
  1. 如果我有一個32核心的伺服器,我就可以實現1個億的資料分片,我有32核心的伺服器麼?沒有,所以我至今無法實現1個億的資料庫分片。---Mycat's Plan
Mycat 簡介

Mycat是什麼?

  從定義和分類來看,它是一個開源的分散式資料庫系統,是一個實現了MySQL協議的Server,前端使用者可以把它看做是一個數據庫代理,用MySQL客戶端工具和命令列訪問,而其後端可以用MySQL原生(Native)協議與多個MySQL伺服器通訊,也可以用JDBC協議與大多數主流資料庫伺服器通訊,其核心功能是分庫分表,即將一個大表水平分割為N個小表,儲存在後端MySQL伺服器裡或者其他資料庫裡。   Mycat發展到目前版本,已經不在是一個單純的MySQL代理了,它的後端可以支援MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流資料庫,也支援MongoDB這種新型NOSQL方式的儲存,未來還會支援更多型別的儲存。而在終端使用者看來,無論是那種儲存方式,在Mycat裡,都是一個傳統的資料庫表,支援標準的SQL語句進行資料的操作,這樣一來,對前端業務系統來說,可以大幅度降低開發難度,提升開發速度,在測試階段,可以將一表定義為任何一種Mycat支援的儲存方式,比如MySQL的MyASM表、記憶體表、或者MongoDB、LeveIDB以及號稱是世界上最快的記憶體資料庫MemSQL上。     試想一下,使用者表存放在MemSQL上,大量讀頻率遠超過寫頻率的資料如訂單的快照資料存放於InnoDB中,一些日誌資料存放於MongoDB中,而且還能把Oracle的表跟MySQL的表做關聯查詢,你是否有一種不能呼吸的感覺?而未來,還能通過Mycat自動將一些計算分析後的資料灌入到Hadoop中,並能用Mycat+Storm/Spark Stream引擎做大規模資料分析,看到這裡。

對於DBA來說,可以這麼理解Mycat:

  Mycat就是MySQL Server,而Mycat後面連線的MySQL Server,就好象是MySQL的儲存引擎,如InnoDB,MyISAM等,因此,Mycat本身並不儲存資料,資料是在後端的MySQL上儲存的,因此資料可靠性以及事務等都是MySQL保證的,簡單的說,Mycat就是MySQL最佳伴侶,它在一定程度上讓MySQL擁有了能跟Oracle PK的能力。

對於軟體工程師來說,可以這麼理解Mycat:

   Mycat就是一個近似等於MySQL的資料庫伺服器,你可以用連線MySQL的方式去連線Mycat(除了埠不同,預設的Mycat埠是8066而非MySQL的3306,因此需要在連線字串上增加埠資訊),大多數情況下,可以用你熟悉的物件對映框架使用Mycat,但建議對於分片表,儘量使用基礎的SQL語句,因為這樣能達到最佳效能,特別是幾千萬甚至幾百億條記錄的情況下。

對於架構師來說,可以這麼理解Mycat:

Mycat是一個強大的資料庫中介軟體,不僅僅可以用作讀寫分離、以及分表分庫、容災備份,而且可以用於多租戶應用開發、雲平臺基礎設施、讓你的架構具備很強的適應性和靈活性,藉助於即將釋出的Mycat智慧優化模組,系統的資料訪問瓶頸和熱點一目瞭然,根據這些統計分析資料,你可以自動或手工調整後端儲存,將不同的表對映到不同儲存引擎上,而整個應用的程式碼一行也不用改變。       當前是個大資料的時代,但究竟怎樣規模的資料是和資料庫系統呢?對此,國外有一個數據庫領域的權威人士說了一個結論:幹億以下的資料規模仍然是資料庫領域的專長,而Hadoop等這種系統,更適合的是幹億以上的規模,所以,Mycat適合1000億條以下的單表規模,如果你的資料超過了這個規模,請投靠Mycat Plus吧!

Mycat原理

Mycat的原理並不複雜,複雜的是程式碼,如果程式碼也不復雜,那麼早就成為一個傳說了。     Mycat的原理中最重要的一個動詞是“攔截”,它攔截了使用者傳送過來的SQL語句,首先對SQL語句做了一些特定的分析:如分片分析、路由分析、讀寫分離分析、快取分析等,然後將此SQL發往後端的真實資料庫,並將返回的結果做適當的處理,最終再返回給使用者。     上述圖片裡,Orders表被分為三個分片datanode(簡稱dn),這三個分片是分佈在兩臺MySQL Server上(DataHost),即[email protected]方式,因此你可以用一臺到N臺伺服器來分片,分片規則為(sharding rule)典型的字串列舉分片規則,一個規則的定義是分片欄位(sharding column)+分片函式(rule function),這裡的分片欄位為rov而分片函式為字符串列舉方式。     當Mycat收到一個SQL時,會先解析這個SQL,查詢涉及到的表,然後看此表的定義,如果有分片規則,則獲取到SQL裡分片字段的值,並匹配分片函式,得到該QL對應的分片列表,然後將SQL發往這些分片去執行,最後收集和處理所有分片返回的結果資料,並輸出到客戶端。以select * from Orders where prov=?語句為例,查到prov=wuhan,按照分片函式,wuhan返回 dn1,於是SQL就發給了MySQL1,去取DB1上的查詢結果,並返回給使用者。     如果上述SQL改為elect * from Orders where prov in (‘wuhan’,‘beijing’),那麼,SQL就會發給ySQL1與MySQL2去執行,然後結果集合並後輸出給使用者。但通常業務中我們的SQL會有Order By 以及Limit翻頁語法,此時就涉及到結果集在Mycat端的二次處理,這部分的程式碼也比較複雜,而最複雜的則屬兩個表的Jion問題,為此,Mycat提出了創新性的ER分片、全局表、HBT(Human Brain Tech)人工智慧的Catlet、以及結合Storm/Spark引擎等十八般武藝的解決辦法,從而成為目前業界最強大的方案,這就是開源的力量!

應用場景

Mycat發展到現在,適用的場景已經很豐富,而且不斷有新使用者給出新的創新性的方案,以下是幾個典型的應用場景:   a.單純的讀寫分離,此時配置最為簡單,支援讀寫分離,主從切換   b.分表分庫,對於超過1〇〇〇萬的表進行分片,最大支援1 〇〇〇億的單表分片   c.多租戶應用,每個應用一個庫,但應用程式只連線Mycat,從而不改造程式本身,實現多租戶化   d.報表系統,藉助於Mycat的分表能力,處理大規模報表的統計   e.代替Hbase,分析大資料   f.作為海量資料實時查詢的一種簡單有效方案,比如 1〇〇億條頻繁查詢的記錄需要在3秒內查詢出來結果, 除了基於主鍵的查詢,還可能存在範圍查詢或其他屬性查詢,此時Mycat可能是最簡單有效的選擇 —單純的讀寫分離,此時配置最為簡單,支援讀寫分離,主從切換分表分庫,對於超過000萬的表進行分片,最大支援1000億的單表分片 多租戶應用,每個應用一個庫,但應用程式只連線Mycat,從而不改造程式本身,實現多租戶化 報表系統,藉助於Mycat的分表能力,處理大規模報表的統計替代Hbase,分析大資料,作為海量資料實時查詢的一種簡單有效方案,比如100億條頻繁查詢的記錄需要在3秒內查詢出來結果,除了基於主鍵的查詢,還可能存在範圍查詢或其他屬性查詢,此時ycat可能是最簡單有效的選擇  

Mycat長期路線圖

    強化分散式資料庫中介軟體的方面的功能,使之具備豐富的外掛、強大的資料庫智慧優化功能、全面的系統監控能力、以及方便的資料運維工具,實現線上資料擴容、遷移等高階功能進一步挺進大資料計算領域,深度結合Spark Stream和Storm等分散式實時流引擎,能夠完成快速的巨表關聯、排序、分組聚合等 OLAP方向的能力,並整合一些熱門常用的實時分析演算法,讓工程師以及DBA們更容易用Mycat實現一些高階資料分析處理功能。    不斷強化Mycat開源社群的技術水平,吸引更多的IT技術專家,使得Mycat社群成為中國的Apache,並將Mycat推到Apache基金會,成為國內頂尖開源專案,最終能夠讓一部分志願者成為專職的Mycat開發者,榮耀跟實力一起提升。 依託Mycat社群,聚集100個CXO級別的精英,眾籌建設親親山莊,Mycat社群+親親山莊=中國最大IT O2O社群 Mycat中的概念

資料庫中介軟體

前面講了Mycat是一個開源的分散式資料庫系統,但是由於真正的資料庫需要儲存引擎,而Mycat並沒有儲存引擎,所以並不是完全意義的分散式資料庫系統。 那麼Mycat是什麼?Mycat是資料庫中介軟體,就是介於資料庫與應用之間,進行資料處理與互動的中間服務。由於前面講的對資料進行分片處理之後,從原有的一個庫,被切分為多個分片資料庫,所有的分片資料庫叢集構成了整個完整的資料庫儲存。   如上圖所表示,資料被分到多個分片資料庫後,應用如果需要讀取資料,就要需要處理多個數據源的資料。如果沒有資料庫中介軟體,那麼應用將直接面對分片叢集,資料來源切換、事務處理、資料聚合都需要應用直接處理,原本該是專注於業務的應用,將會花大量的工作來處理分片後的問題,最重要的是每個應用處理將是完全的重複造輪子。   所以有了資料庫中介軟體,應用只需要集中與業務處理,大量的通用的資料聚合,事務,資料來源切換都由中介軟體來處理,中介軟體的效能與處理能力將直接決定應用的讀寫效能,所以一款好的資料庫中介軟體至關重要。  

邏輯庫(schema)

    通常對實際應用來說,並不需要知道中介軟體的存在,開發人員只需要知道資料庫的概念,所以資料庫中介軟體可以被看做是一個或多個數據庫叢集構成的邏輯庫。     在雲端計算時代,資料庫中介軟體可以以多租戶的形式給一個或多個應用提供服務,每個應用訪問的可能是一個獨立或者是共享的物理庫,常見的如阿里雲資料庫伺服器RDS。     

邏輯表(table)

    既然有邏輯庫,那麼就會有邏輯表,分散式資料庫中,對應用來說,讀寫資料的表就是邏輯表。邏輯表,可 以是資料切分後,分佈在一個或多個分片庫中,也可以不做資料切分,不分片,只有一個表構成。


分片表

  分片表,是指那些原有的很大資料的表,需要切分到多個數據庫的表,這樣,每個分片都有一部分資料,所 有分片構成了完整的資料   例如在mycat配置中的t_node就屬於分片表,資料按照規則被分到dn1,dn2兩個分片節點(dataNode) 上。
  1. <table name=nt_noden primaryKey=nvidn autoincrement=ntruen dataNode=ndn1,dn2n rule=nrule1n />

非分片表

  一個數據庫中並不是所有的表都很大,某些表是可以不用進行切分的,非分片是相對分片表來說的,就是那 些不需要進行資料切分的表。   如下配置中t_node ,只存在於分片節點(dataNode ) dn1上。
  1. <table name=nt_noden primaryKey=nvidn autoincrement=ntruen dataNode=ndn1" />

ER 表

    關係型資料庫是基於實體關係模型(Entity-Relationship Model)之上,通過其描述了真實世界中事物與關 系,Mycat中的ER表即是來源於此。根據這一思路,提出了基於E-R關係的數捤分片策略,子表的記錄與所關 聯的父表記錄存放在同一個資料分片上,即子表依賴於父表,通過表分組(Table Group )保證資料Join不會跨庫操作。     表分組(Table Group )是解決跨分片資料join的一種很好的思路,也是資料切分規劃的重要一條規則。

全域性表

  一個真實的業務系統中,往往存在大量的類似字典表的表,這些表基本上很少變動,字典表具有以下幾個特性: 1.變動不頻繁 2.資料量總體變化不大 3.資料規模不大,很少有超過數十萬條記錄。

分片節點(dataNode)

  資料切分後,一個大表被分到不同的分片資料庫上面,每個表分片所在的資料庫就是分片節點 (dataNode )。 節點主機(dataHost)   資料切分後,每個分片節點(dataNode )不一定都會獨佔一臺機器,同一機器上面可以有多個分片資料庫, 這樣一個或多個分片節點(dataNode )所在的機器就是節點主機(dataHost),為了規避單節點主機併發數限 制,儘量將讀寫壓力高的分片節點(dataNode )均衡的放在不同的節點主機(dataHost )。 分片規則(rule)   前面講了資料切分,1個大表被分成若干個分片表,就需要一定的規則,這樣按照某種業務規則把資料分到 某個分片的規則就是分片規則,資料切分選擇合適的分片規則非常重要,將極大的避免後續資料處理的難度。

多租戶

多租戶技術或稱多重租賃技術,是一種軟體架構技術,它是在探討與實現如何於多使用者的環境下共用相同的系統或程式元件,並且仍可確保各使用者間資料的隔離性。在雲端計算時代,多租戶技術在共用的資料中心以單一系統架構與服務提供多數客戶端相同甚至可定製化的服務,並且仍然可以保障客戶的資料隔離。目前各種各樣的雲端計算服務就是這類技術範疇,例如阿里雲資料庫服務(RDS )、阿里雲伺服器(ECS)等等。 多租戶在資料儲存上存在三種主要的方案,分別是:

1.1 獨立資料庫

這是第一種方案,即一個租戶一個數據庫,這種方案的使用者資料隔離級別最高,安全性最好,但成本也高。  優點: 1、為不同的租戶提供獨立的資料庫,有助於簡化資料模型的擴充套件設計,滿足不同租戶的獨特需求; 2、如果出現故障,恢復資料比較簡單。 缺點: 1、增大了資料庫的安裝數量,隨之帶來維護成本和購置成本的增加。     這種方案與傳統的一個客戶、一套資料、一套部署類似,差別只在於軟體統一部署在運營商那裡。如果面對的是銀行、醫院等需要非常高資料隔離級別的租戶,可以選擇這種模式,提高租用的定價。如果定價較低,產品 走低價路線,這種方案一般對運營商來說是無法承受的。

1.2共享資料庫,隔離資料架構

這是第二種方案,即多個或所有租戶共享Database,但是每個租戶一個Schema。 優點: 1、為安全性要求較高的租戶提供了一定程度的邏輯資料隔離,並不是完全隔離;每個資料庫可以支援更多的租戶數量。 缺點: 1、如果出現故障,資料恢復比較困難,因為恢復資料庫將牽扯到其它租戶的資料 2、如果需要跨租戶統計資料,存在一定困難。

共享資料庫,共享資料架構

這是第三種方案,即租戶共享同一個Database、同一個Schema,但在表中通過TenantID區分租戶的資料。這是共享程度最高、隔離級別最低的模式。 優點: 1、三種方案比較,第三種方案的維護和購置成本最低,允許每個資料庫支援的租戶數量最多。 缺點: 1、隔離級別最低,安全性最低,需要在設計開發時加大對安全的開發量; 2、資料備份和恢復最困難,需要逐表逐條備份和還原。 3、如果希望以最少的伺服器為最多的租戶提供服務,並且租戶接受以犧牲隔離級別換取降低成本,這種方案最適合 官方網站:http://www.mycat.org.cn/

何為資料切分?

簡單來說,就是指通過某種特定的條件,將我們存放在同一個資料庫中的資料分散存放到多個數據庫(主 機)上面,以達到分散單臺裝置負載的效果。

資料的切分(Sharding )根據其切分規則的型別,可以分為兩種切分模式。一種是按照不同的表(或者 Schema )來切分到不同的資料庫(主機)之上,這種切可以稱之為資料的垂直(縱向)切分;另外一種則是根據表中的資料的邏輯關係,將同一個表中的資料按照某種條件拆分到多臺資料庫(主機)上面,這種切分稱之為資料的水平(橫向)切分。

垂直切分的最大特點就是規則簡單,實施也更為方便,尤其適合各業務之間的耦合度非常低,相互影響很小,業務邏輯非常清晰的系統。在這種系統中,可以很容易做到將不同業務模組所使用的表分拆到不同的資料庫中。根據不同的表來進行拆分,對應用程式的影響也更小,拆分規則也會比較簡單清晰。

水平切分於垂直切分相比,相對來說稍微複雜一些。因為要將同一個表中的不同資料拆分到不同的據庫中,對於應用程式來說,拆分規則本身就較根據表名來拆分更為複雜,後期的資料維護也會更為複雜一些。

垂直切分

一個數據庫由很多表的構成,每個表對應著不同的業務,垂直切分是指按照業務將表進行分類,分佈到不同 的資料庫上面,這樣也就將資料或者說壓力分擔到不同的庫上面,如下圖:

    一個架構設計較好的應用系統,其總體功能肯定是由很多個功能模組所組成的,而每一個功能模組所需要的 資料對應到資料庫中就是一個或者多個表。而在架構設計中,各個功能模組相互之間的互動點越統一越少,系統 的耦合度就越低,系統各個模組的維護性以及擴充套件性也就越好。這樣的系統,實現資料的垂直切分也就越容易。       但是往往系統之有些表難以做到完全的獨立,存在這擴庫join的情況,對於這類的表,就需要去做平衡,是資料庫讓步業務,共用一個數據源,還是分成多個庫,業務之間通過介面來做呼叫。在系統初期,資料量比較少,或者資源有限的情況下,會選擇共用資料來源,但是當資料發展到了一定的規模,負載很大的情況,就需要必須去做分割。   一般來講業務存在著複雜join的場景是難以切分的,往往業務獨立的易於切分。如何切分,切分到何種 程度是考驗技術架構的一個難題。

下面來分析下垂直切分的優缺點:

優點:
  1. 拆分後業務清晰,拆分規則明確。
  2. 系統之間整合或擴充套件容易。
  3. 資料維護簡單。
缺點:
  1. 部分業務表無法join ,只能通過介面方式解決,提高了系統複雜度。
  2. 受每種業務不同的限制存在單庫效能瓶頸,不易擴充套件跟效能提高。
  3. 事務處理複雜。由於垂直切分是按照業務的分類將表分散到不同的庫,所以有些業務表會過於龐大,存在單庫讀寫與儲存瓶頸,所以就需要水平拆分來做解決。

水平切分

    相對於垂直拆分,水平拆分不是將表做分類,而是按照某個欄位的某種規則來分散到多個庫之中,每個表中包含一部分資料。簡單來說,我們可以將資料的水平切分理解為是按照資料行的切分,就是將表中的某些行切分 到一個數據庫,而另外的某些行又切分到其他的資料庫中,如圖:     拆分資料就需要定義分片規則。關係型資料庫是行列的二維模型,拆分的第一原則是找到拆分維度。比如: 從會員的角度來分析,商戶訂單交易類系統中查詢會員某天期某個訂單,那麼就需要按照會員結合日期來拆分,不同的資料按照會員ID做分組,這樣所有的資料查詢join都會在單庫內解決;如果從商戶的角度來講,要查詢某個商家某天所有的訂單數,就需要按照商戶ID做拆分;但是如果系統既想按會員拆分,又想按商家資料,則會有一定的困難。如何找到合適的分片規則需要綜合考慮衡量。

幾種典型的分片規則包括:

  a.按照使用者ID求模,將資料分散到不同的資料庫,具有相同資料使用者的資料都被分散一個庫中。   b.按照日期,將不同月甚至日的資料分散到不同的庫中。   c.按照某個特定的欄位求模,或者根據特定範圍段分散到不同的庫中。 如圖,切分原則都是根據業務找到適合的切分規則分散到不同的庫,下面用使用者 ID 求模舉例: 既然資料做了拆分有優點也就優缺點。 優點: A.拆分規則抽象好,join 操作基本可以資料庫做 B.不存在單庫大資料,高併發的效能瓶頸。 C.應用端改造較少。 D.提高了系統的穩定性跟負載能力。 缺點: a.拆分規則難以抽象。 b.分片亊務一致性難以解決。 c.數捤多次擴充套件難度跟維護量極大。 d.跨庫 join 效能較差。

前面講了垂直切分跟水平切分的不同跟優缺點,會發現每種切分都有缺點,但共同的特點缺點有:

1.引入分散式亊務的問題。 2.跨節點 Join 的問題。 3.跨節點合併排序分頁問題。 4.多資料來源管理問題。

針對資料來源管理,目前主要有兩種思路:

  A. 客戶端模式,在每個應用程式模組中配置管理自己需要的一個(或者多個)資料來源,直接訪問各個資料庫,在模組內完成資料的整合;   B. 通過中間代理層來統一管理所有的資料來源,後端資料庫叢集對前端應用程式透明;

可能 90%以上的人在面對上面這兩種解決思路的時候都會傾向於選擇第二種,尤其是系統不斷變得龐大複雜的時候。確實,這是一個非常正確的選擇,雖然短期內需要付出的成本可能會相對更大一些,但是對整個系統的擴充套件性來講,是非常有幫助的資料切分的原則:

資料切分的原則:

第一原則:能不切分儘量不要切分。 第二原則:如果要切分一定要選擇合適的切分規則,提前規劃好。 第三原則:資料切分儘量通過資料冗餘或者表分組(Table Group)來降低跨庫 Join 的可能。 第四原則:由於資料庫中介軟體對資料 Join 實現的優劣難以把握,而且實現高效能難度極大,業務讀取儘量少使用多表 Join。 安裝Mycat

安裝Mycat

  1. wget  https://github.com/MyCATApache/Mycat-download/raw/master/1.5-RELEASE/Mycat-server-1.5.1-RELEASE-20160622153300-linux.tar.gz
  2. tar zxf Mycat-server-1.5.1-RELEASE-20160622153300-linux.tar.gz
  3. mv mycat  /application/
  4. echo "export PATH=/application/mycat/bin:$PATH">>/etc/profile
  5. source /etc/profile
  6. echo $PATH

下載安裝JDK

  1. wget http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.rpm
  2. rpm -ivh jdk-8u91-linux-x64.rpm

配置環境變數

  1. echo "export JAVA_HOME=/usr/java/jdk1.8.0_91/">>/etc/profile
  2. echo "export PATH=$JAVA_HOME/bin:/application/mycat/bin/:$PATH">>/etc/profile
  3. echo "export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar">>/etc/profile
  4. source  /etc/profile
  5. [[email protected] ~]# java -version
  6. java version "1.8.0_91"
  7. Java(TM) SE RuntimeEnvironment(build 1.8.0_91-b14)
  8. JavaHotSpot(TM)64-BitServer VM (build 25.91-b14, mixed mode)

建立管理使用者

  1. 主庫上對reprep_r使用者授權如下:
  2. 使用者:rep  密碼:oldboy 埠:3306
  3. 許可權:all
  4. 命令:
  5. grant replication slave on test.* to 'rep'@'10.0.0.%' identified by 'oldboy';
  6. grant replication slave on test.* to 'rep_r'@'10.0.0.%' identified by 'oldboy';
  7. flush privileges;
  8. 注:為了方便下面的主從切換,兩個使用者都授予了所有的許可權,生產環境儘量不要這樣子授權!
修改mycat配置檔案
  1. [[email protected] mycat]# pwd
  2. /application/mycat
  3. [[email protected] mycat]# ll
  4. total 24
  5. drwxr-xr-x 2 root root 4096Jul403:13 bin
  6. drwxrwxrwx 2 root root 4096Dec132015 catlet
  7. drwxrwxrwx 2 root root 4096Jul403:13 conf
  8. drwxr-xr-x 2 root root 4096Jul403:13 lib
  9. drwxrwxrwx 2 root root 4096Dec132015 logs
  10. -rwxrwxrwx 1 root root  219Jun2215:33 version.txt
目錄解釋如下: 1.bin程式目錄,存放了 window版本和linux版本,除了提供封裝服務的版本之外,也提供了 nowrap的 shell指令碼命令,方便大家選擇和修改,進入到bin目錄: 2.Linux 下執行:./mycat console,首先要 chmod +x * 注:mycat 支援的命令{ console | start | stop | restart | status | dump } 3.conf目錄下存放配置檔案,其中: 4.server.xm丨是Mycat伺服器引數調整和使用者授權的配置檔案, 5.schema.xm丨是邏 輯庫定義和表仌及分片定義的配置檔案, 6.rule.xml是分片規則的配置檔案,分片規則的具體一些引數資訊單獨存 放為檔案,也在這個目錄下,配置檔案修改,需要重啟Mycat或者通過9066埠 reload.  7.lib目錄下主要存放mycat依賴的一些jar檔案. 9.日誌存放在logs/mycat.log中,每天一個檔案,日誌的配置是在conf/log4j.xml中,根據自己的需要,可 以調整輸出級別為debug , debug級別下,會輸出更多的資訊,方便排查問題 注意:Linux下部署安裝MySQL ,預設不忽略表名大小寫,需要手動到/etc/my.cnf下配置 lower_case_table_names=1使Linux環境下MySQL忽略表名大小寫,否則使用MyCAT的時候會提示找不到 表的

修改server.xml檔案

  1. [[email protected] conf]#  vim server.xml
  2. </system>
  3. <user name="rep">
  4. <property name="password">oldboy</property>
  5. <property name="schemas">test</property>
  6. </user>
  7. <user name="rep_r">
  8. <property name="password">oldboy</property>
  9. <property name="schemas"> test</property>
  10. <property name="readOnly">true</property>
  11. </user>
注意: 1、這裡配置的是可以連線主庫的兩個使用者 使用者:rep   密碼:oldboy 給予此使用者test資料庫增刪改查的許可權。    使用者:rep_r 密碼:oldboy 給予此使用者test資料庫讀的許可權。   2、這裡的test,不一定是你資料庫上的真實庫名,可以任意指定,只要接下來和schema.xml的配置檔案的庫名統一即可。

修改schema.xml檔案

  1. [[email protected] conf]#  vim schema.xml
  2. <?xml version="1.0"?>
  3. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  4. <mycat:schema xmlns:mycat="http://org.opencloudb/">
  5. <schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
  6. </schema>
  7. <dataNode name="dn1" dataHost="localhost1" database="test"/>
  8. <dataNode name="dn2" dataHost="localhost1" database=" test "/>
  9. <dataNode name="dn3" dataHost="localhost1" database=" test "/>
  10. <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
  11.                 writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
  12. <heartbeat>select user()</heartbeat>
  13. <writeHost host="hostM1" url="10.0.0.202:3306" user="rep"
  14.                         password="oldboy">
  15. </writeHost>
  16. <readHost host="hostS1" url="10.0.0.202:3307" user="rep_r"
  17.                         password="oldboy"/>
  18. </readHost>
  19. </dataHost>
  20. </mycat:schema>
(1)<schema name=”test” checkSQLschema=”false” sqlMaxLimit=”100″ dataNode=”dn1″> 這裡的oldboy就是我們所宣稱的資料庫名稱,必須和server.xml中的使用者指定的資料庫名稱一致。新增一個dataNode=”dn1”,是指定了我們這個庫只有在dn1上,沒有分庫。 (2) <dataNode name=”dn1″ dataHost=”localhost1″ database=”test” /> 這裡只需要改database的名字,db1就是你真是的資料庫上的資料庫名,可根據自己的資料庫名稱修改。 (3) 
  1. <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
  2.                 writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

需要配置的位置:

  1. balance="1"   writeType="0"   switchType="1"

balance

1、balance=0  不開啟讀寫分離機制,所有讀操作都發送到當前可用的writehost了 . 2、balance=1  全部的readhost與stand by writeHost 參與select語句的負載均衡。簡單的說,雙主雙從模式(M1àS1,M2àS2,並且M1和M2互為主備),正常情況下,M1,S1,S2都參與select語句的複雜均衡。 3、balance=2  所有讀操作都隨機的在readhost和writehost上分發

writeType 

負載均衡型別,目前的取值有3種: 1、writeType=”0″, 所有寫操作傳送到配置的第一個writeHost。 2、writeType=”1″,所有寫操作都隨機的傳送到配置的writeHost。 3、writeType=”2″,不執行寫操作。

switchType 

1、switchType=-1 表示不自動切換 2、switchType=1 預設值,自動切換 3、switchType=2 基於MySQL 主從同步的狀態決定是否切換 (4)
  1. <writeHost host="hostM1" url="10.0.0.202:3306" user="rep"
  2.                         password="oldboy">
  3. <!-- can have multi read hosts -->
  4. <readHost host="hostS1" url="10.0.0.202:3306" user="rep_r"
  5.                         password="oldboy"/>
注意: 這裡配置的是讀寫伺服器的IP地址和埠訪問,訪問的使用者名稱和密碼;而且一定要先在客戶端測試OK了以後在進行配置。

啟動Mycat

  1. [[email protected] conf]#/application/mycat/bin/mycat start
  2. StartingMycat-server...
  3. [[email protected] logs]#
出現這個介面表示mycat已經成功啟動了,如果出現錯誤的話請檢視日誌wrapper.log  讀寫分離測試1、在客戶端連線mysql主庫伺服器:
  1. mysql -urep -poldboy -h10.0.0.202 -P8066
  2. mysql> explain create table company(id int not null primary key,name varchar(100));
  3. +-----------+---------------------------------------------------------------------+
  4. | DATA_NODE | SQL                                                                 |
  5. +-----------+---------------------------------------------------------------------+
  6. | dn1       | create table company(id int not null primary key,name varchar(100)) |
  7. | dn2       | create table company(id int not null primary key,name varchar(100)) |
  8. | dn3       | create table company(id int not null primary key,name varchar(100)) |
  9. +-----------+---------------------------------------------------------------------+
  10. 3 rows in set (0.06 sec)
  11. mysql> create table company(id int not null primary key,name varchar(100));
  12. Query OK, 0 rows affected (1.82 sec)
  13. mysql> explain insert into company(id, name) values (100, 'abc');
  14. +-----------+---------------------------------------------------+
  15. | DATA_NODE | SQL                                               |
  16. +-----------+---------------------------------------------------+
  17. | dn1       | insert into company(id, name) values (100, 'abc') |
  18. | dn2       | insert into company(id, name) values (100, 'abc') |
  19. | dn3       | insert into company(id, name) values (100, 'abc') |
  20. +-----------+---------------------------------------------------+
  21. 3 rows in set (0.00 sec)
  22. mysql> insert into company(id, name) values (100, 'abc');
  23. Query OK, 1 row affected (0.24 sec)

檢視日誌

日誌中有如下資訊

分別在主從庫中執行以下命令:

  1. mysql> select * from company where id =100;
  2. +-----+------+
  3. | id  | name |
  4. +-----+------+
  5. |100| abc  |
  6. +-----+------+
  7. 1 row in set(0.00 sec)
日誌中有如下 在從庫中執行insert命令會得到以下錯誤:
  1. mysql> insert into company(id, name) values (4,'abcwq');
  2. ERROR 1495(HY000):User readonly
  3. #從庫只讀
從上面的測試中可以看出來,向資料庫中讀寫資料,走的是不同的資料庫,證明,讀寫分離測試成功!

主從切換測試

將schema.xml檔案做如下修改:

  1. [[email protected] conf]#  vim schema.xml
  2. <?xml version="1.0"?>
  3. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  4. <mycat:schema xmlns:mycat="http://org.opencloudb/">
  5. <schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
  6. </schema>
  7. <dataNode name="dn1" dataHost="localhost1" database="test"/>
  8. <dataNode name="dn2" dataHost="localhost1" database=" test "/>
  9. <dataNode name="dn3" dataHost="localhost1" database=" test "/>
  10. <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
  11.                 writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
  12. <heartbeat>show slave status</heartbeat>
  13. <writeHost host="hostM1" url="10.0.0.202:3306" user="rep"
  14.                         password="oldboy">
  15. </writeHost>
  16. <readHost host="hostS1" url="10.0.0.202:3307" user="rep_r"
  17.                         password="oldboy"/>
  18. </readHost>
  19. <writeHost host="hostM2" url="10.0.0.202:3307" user="rep"
  20.                         password="oldboy">
  21. </writeHost>
  22. </dataHost>
  23. </mycat:schema>

重啟mycat服務

  1. [[email protected] conf]#/application/mycat/bin/mycat restart
  2. StoppingMycat-server...
  3. StoppedMycat-server.
  4. StartingMycat-server...
此時,停止主庫,再進行測試,會發現mycat服務依然可以正常讀寫資料庫。mysql已切換到從庫。
  1. [[email protected] conf]#/data/3306/mysql stop

Mycat-Web

    MyCAT-WEB就是基於mycat的一個性能監控工具,方便大家更有效的使用mycat管理mycat監控mycat,讓大家的mycat工作更加高效。mycat-web的執行依賴 zookpeer 所以事先要安裝好。      Zookeeper 作為一個分散式的服務框架,主要用來解決分散式叢集中應用系統的一致性問題, 它能提供基於類似於檔案系統的目錄節點樹方式的資料儲存,但是 Zookeeper 並不是用來專門儲存資料的,它的作用主要是用來維護和監控你儲存的資料的狀態變化,通過監控這些資料狀態的變化,從而可以達到基於資料的叢集管理。      ZooKeeper是一個開源的分散式的,為分散式應用提供協調服務的Apache專案。ZooKeeper提供一個簡單的原語集合,以便於分散式應用可以在它之上構建更高層次的同步服務。ZooKeeper的設計非常易於程式設計,它使用的是類似於檔案系統那樣的樹形資料結構。 

安裝zookpeer 

  1. wget  http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
  2. tar -xzvf  zookeeper-3.4.6.tar.gz 
  3. cd zookeeper-3.4.6/conf
  4. cp zoo_sample.cfg zoo.cfg 
  5. cd zookeeper-3.4.6/bin
  6. ./zkServer.sh start 
  7. 出現一下資訊說明啟動成功
  8. JMX enabled by default
  9. Using config:/usr1/zookeeper/bin/../conf/zoo.cfg 
  10. Starting zookeeper ... STARTED 

安裝mycat-web

  1. wget https://github.com/MyCATApache/Mycat-download/raw/master/mycat-web-1.0/Mycat-web-1.0-SNAPSHOT-20160617163048-linux.tar.gz
  2. tar zxf Mycat-web-1.0-SNAPSHOT-20160617163048-linux.tar.gz
  3. cd mycat-web/mycat-web/WEB-INF/classes
  4. vim mycat.properties
  5. zookeeper=127.0.0.1:2181
  6. sqlonline.server=10.0.0.202
  7. cd mycat-web
  8. #將start.sh檔案中的JVM調整到合適的大小
  9. ./start.sh &
  10. #8082埠是web埠
  11. 訪問10.0.0.202:8082/mycat即可進入web頁面
配置Mycat(此步驟可省略)
  1. cd /application/mycat/bin<