1. 程式人生 > >Mycat作為中介軟體搭建Mysql主從複製---從選型到搭建的想法和記錄

Mycat作為中介軟體搭建Mysql主從複製---從選型到搭建的想法和記錄

想了解本人簡陋搭建過程的同學,可以忽略下面這一段:

**********************************************************************************************************************************************

首先,本次搭建的資料庫架構沒有很複雜,選型了 Mycat + Mysql 的 雙主架構。

專案剛剛開始,考慮到業務量並不是很大,資料節點不需要很多,也不考慮分表、分庫的情況。考慮太複雜,加大工作量的同時,專案使用的伺服器等成本也會上升,從專案整體的角度來說,不合適。

但這個點也的確納入到搭建時的考慮之中,因為畢竟mysql的效能下降點,應該在500W資料(沒有實際驗證過,網上查的資料),

公司發展順利的話,大約兩三年之後就會遇到該問題,儘量做到不給自己和後來的同時埋坑(但實際上肯定會有,這個點已經被無數次驗證,當時覺得很好的東西,幾年後回頭就會覺得是一堆 xiang)。

Mycat 本身在我的理解來看,是一個基於java實現的 請求負載均衡中介軟體, 懂得java的同學應該會覺得很親近,雖然我看到有人吐槽說這個中介軟體有坑,大神張老師也說:基於中介軟體的分散式都是偽分散式(現在還不是很明白這個概念)。嘛,不過我本身是學java的,當時專案考慮讀寫分離的時候,我也萌生過自己寫一段基於攔截器的 讀寫分離模組,解析statement --- 判斷使用哪一個資料來源 --- 執行 --- 返回結果。 但真正往後考慮就發現, 有幾個問題是老大難的: 1、 SQL 語句得了解的十分清楚,否則你寫的解析部分會漏掉很多語句;  2、 分片規則、負載均衡問題  3、 讀寫分離模組和系統的耦合度太高。 所以這個想法在寫了 select 和 insert 分發後,就基本停止了。 後來查資料瞭解到 Mycat , 買了本《分散式資料庫架構及企業實踐_基於Mycat中介軟體》 嗯,看了幾章之後,發現自己寫的那些的確是用不成,很多該考慮的地方都沒有。

突然領悟到有些東西,如果你只停留在拿來即用的層面上,你是永遠無法知道自己和大神有多大差距的。自己寫寫,你才會發覺:哦!原來我還有這麼多不懂得地方。  這可能是之前開發的慣性所致,匯入包,直接用方法,簡單快捷,還能完成高效的完成工作任務,得克服自己的惰性。

******************************************************************************************************************************************

正篇開始:

mysql的安裝可以參考這個: 裡面有個網址,可以根據硬體條件生成my.cnf ,適合我們這種開發小白,剛入門的新手使用,不需要太瞭解 innodb 引擎原理,也基本能把預設設定的資料庫,優化 50% 效能(jmeter自己測試的,見過開發做效能壓測嗎?哈哈,這個在後面一篇寫,雖然我知道 jmeter 我只用了 1% 的功能,但好歹一天之內拿出了壓測報告啊,現學現賣TT)

一、 搭建兩臺主主複製的mysql服務,網上有很多類似的教程,大家可以找一下,這裡只寫一下我覺得的關鍵點:

1、 mysql 服務的配置 my.cnf 中,關於複製的部分:

      我採用的還是很老的複製方式,基於 file 和 偏移量的複製。 後期我瞭解到還有一種 GTID 複製方式,該方式基於全域性事務,在主機上生成全域性唯一的 事務 ID,並將該 ID 傳送給 從機,進行主從複製。 這裡由於本人是新手,且專案中開發很緊張,到完工的時候才瞭解到這種先進的方法,那時系統整合測試已經完成,不敢動了,所以還是介紹一下我實際中用到的 複製方式。

server-id=1    #主從的 id 應不一樣

log-bin=master1_3306_log  #主機日誌

binlog-do-db=testdb1  # 需要進行主從複製的庫

binlog-do-db=testdb2  # 多個數據庫這麼寫

relay_log=testdb_relay-bin  # 中級日誌sync_binlog=1   

# 滿多少次事務進行主從複製

#(這個引數,我想盡可能快的複製,所以設定較小,但比較擔心主從是否會互動太頻繁,影響效能,待驗證)

log-slave-updates=1

#表示, M1 ,和 M2 主主複製後, 是否對 各自主節點下的 從節點進行 複製;

2、 需要建立主從複製的使用者: 我這裡開得許可權有點大:*.*   因為我發現僅指定某個庫表時,會報錯。

       額,難道是同步時也要複製同步元資料? 希望有路過的大神指點一下。

       由於這個許可權開得很大哦,授權的時候一定得指定 IP 進行授權,否則你會發現別人用這個賬戶把你root密碼給改了,哈哈。

create user 'mysql';
grant all privileges on *.* to 'mysql'@'xx.x.x.xxx' identified by 'gxxxxxxxx';

3、 開啟 主庫 A、  從庫 B

      進入到  A 中,通過 show master status; 檢視 master 的 資料檔名 及 偏移量。

      並把 查到的 這個資料放到 這個命令中,並在 B 庫執行

CHANGE MASTER TO
MASTER_HOST='127.0.0.1',       # A 的 IP
MASTER_PORT=3306,            # A 的 埠
MASTER_USER='repl1',         # A 的 複製賬號
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=3917;

需要注意的是: 除非你確保當前庫沒有人使用,否則,你應該執行下面的鎖庫命令, 否則有人插入資料,你之前的一系列操作就白費了,因為 資料偏移量已經完全不對了。

FLUSH TABLES WITH READ LOCK;   #  全域性鎖,注意執行完後別把視窗關閉, 因為這個命令只有當前session有效。

unlock tables;  # 解鎖

4、 start  slave; 

5、 驗證;

二、 搭建mycat:

這個超級簡單,下載 Mycat, 然後 tar -zxvf 解壓後, 在 bin 目錄下找到  mycat 可執行指令碼:

./bin/mycat start 就OK了。 Mycat 的難點,在於其配置檔案。 

Mycat 的配置檔案可以使用 Zookeeper 管理,如果要做多個 mycat 的架構,可以考慮,

我這裡只使用了單節點,所以配置檔案都是我這裡寫好了扔上去的。

引用《分散式資料庫架構及企業實踐_基於Mycat中介軟體》 中的一個圖:

mycat 的核心原理:

1、 分片分析;

2、 路由分析;

3、讀寫分離分析;

4、快取分析

這些功能的具體引數,都是在配置檔案中實現的:

1、 schema.xml :

邏輯庫、邏輯表(schema)、ER表(Table、childTable)、

分片表、分片節點(schema、dataNode) 、 分片主機、讀寫分離(dataHost)

(再引用一張哈)

mycat 是通過在 物理庫上 抽象出來 一個 資料節點層 , 進而抽象出 邏輯庫的。 

其透明性依賴於邏輯庫層。

想弄明白  schema, 就得明白上面的圖。 具體配置的配置引數,可以參考這兩位大神的教程:

我自己生產的配置就不貼出來了。

2、 server.xml:

系統引數, 優化 mycat 的主要配置檔案

需要注意,這個配置檔案,應該是基於 schema 的, 可以這麼說,你個人認為得先設計 資料節點結構、表結構、全域性序列、分片演算法後,再來配置、優化這個檔案。 

主要有三個標籤:

(1)system 優化mycat

這裡只說我自己,通過優化這三個引數,讀效能在效能測試時較預設配置提升了近一倍,大家闊以試一下。

processors 我們伺服器是 8 核,所以這裡設定 8;

processorBufferChunk 使用的預設值;

processorBufferPool  = 8 * 4096 * 100

(2) user: 需要注意,為什麼說 server 的配置是基於 schema ,就是因為 user 配置的 庫,其實都是抽象出來的邏輯庫。

          另外這個標籤還可以配置這個使用者的讀寫許可權、連線數、是否加密

(3) quarantine 防火牆,指定白名單、黑名單

3、 log4j.xml 檔案: mycat 的日誌輸出級別及目錄修改;

以下這兩個配置檔案,主要用來切分資料節點: 本次我只有一個數據節點,沒做切分,下面的知識沒有實踐過,僅僅是瞭解,大家隨便參考一下:

4、 sequence: 全域性序列檔案,我本次沒有使用,僅僅瞭解了一下: 其作用是解決 分庫分表時的 自增主鍵問題;

      一般有兩種維護方式: 

     (1) 本地維護,sequence_conf.properties ,缺點是每次重啟mycat,序列號重置(個人感覺會有問題)

     (2) 固化到資料庫:建立存放序列的表,

   並插入一條資料:

   

  current_value 為當前值, increment 為步長

  建立函式,實現三個功能: 獲取當前 sequence值,設定 sequence 值、 獲取下一個sequence值。

需要注意, 這些東東都應該同一個資料節點完成,並在 sequence_conf.properties 中,通過 USER_SEQ=資料節點 指定。

5、 rule檔案: 分表分庫規則檔案; 演算法很多啦,這個就不做搬運工了,

        大家有興趣可以在教材中看一下,選取適合自己的分片演算法。