1. 程式人生 > >Mycat實現讀寫分離,主備熱切換

Mycat實現讀寫分離,主備熱切換

Master IP:172.16.34.212

Slave IP:172.16.34.34.156

Mycat server IP:172.16.34.219

不涉及過多理論,只有實現的過程。mysql讀寫分離和主備熱切換,容災,資料分片的實現手段目前比較流行的是Mycat。當然利用應用層程式碼去解決這些問題也是可以的。

1,首先到Github下載Mycat 1.6 版本的安裝包,下載地址為:https://github.com/MyCATApache/Mycat-download

2,下載後解壓到Mycat伺服器某個目錄

3,在主從複製的基礎上去實現讀寫分離,主從複製可參考: http://www.cnblogs.com/NingKangMing/p/6110071.html

4,修改server.xml檔案(此檔案為Mycat的核心主配置檔案,如user標籤用於控制對外的可訪問的使用者及使用者可訪問的資料,是否只讀等),我們配置一個euht使用者,可訪問資料庫(schema.xml配置的邏輯資料庫)為mycatdb,密碼為123456,sql解析器為druidparser。預設埠8066。對外開放的使用者名稱和密碼為mycatuser,123456

<system>

<property name=”defaultSqlParser”>druidparser</property>

</system>

<user name=”mycatuser”>

<property name=”password”>123456</property>

<property name=”schemas”>mycatdb</property>

<property name=”readOnly”>false</property>

</user>

5,修改schema.xml檔案,(schema.xml用於配置MyCat讀寫分離、水平垂直折分叢集邏輯庫、表、分片規則、DataNode以及DataSource),參考配置如下

<schema name=”mycatdb” checkSQLschema=”false”  dataNode=”datanoode1”/>

<dataNode name=”datanoode1” dataHost=”virtualHost” database=”euhtnms” />

<dataHost name=”virtualHost” maxCon=”50” minCon=”5” balance=”3”

                writeType=”0” dbType=”mysql” dbDriver=”native” switchType=”1” >

                <heartbeat>select 1</heartbeat>

                <writeHost host=”whost1” url=”172.16.34.212:3306” user=”euht”  password=”123456”>

                <readHost host=”rhost1” url=”172.16.34.156:3306” user=”euht” password=”123456” />

             </writeHost>       

</dataHost>

配置說明:

Schema標籤:name指明schema邏輯資料庫的名稱,checkSQLschema是否去除sql語句中的資料庫名稱,如果sql查詢語句沒有limit語句,sqlMaxLimit為查詢語句加上limit

dataNode標籤:定義節點,指定資料虛擬伺服器,資料庫等屬性

dataHost標籤:定義具體的資料庫例項,讀寫分離配置,心跳包語句。maxCon屬性指定每個讀寫例項連線池的最大連線。minCon屬性指定每個讀寫例項連線池的最小連線。balance屬性,目前的取值有 4 

balance=”0”, 不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost 上。

balance=”1”,所有讀操作都隨機的傳送到readHost

balance=”2”,所有讀操作都隨機的在 writeHost、 readhost 上分發。

balance=”3”, 所有讀請求隨機分發到 wiriterHost 對應的 readhost 執行

writeType屬性,負載均衡型別,目前的取值有3種:

1. writeType=”0”, 所有寫操作都發送到可用的writeHost上。

2. writeType=”1”,所有寫操作都隨機的傳送到readHost

3. writeType=”2”,所有寫操作都隨機的在writeHostreadhost分上發。

switchType 屬性:

-1 表示不自動切換

預設值,自動切換

基於MySQL 主從同步的狀態決定是否切換

writeHostreadHostheartBeat標籤,定義真實伺服器的讀寫HostheartBeat為心跳包語句。以上定義了一主一從的讀寫分離機制,writeHost下可以有多個readHost

6,測試讀寫分離

進入bin目錄啟動mycat (確保配置的讀寫分離Host已經配置了主從資料同步)

Sudo ./mycat start

檢視Mycat是否正常啟動(檢視logswrapper.log

Mycat已經成功啟動,下面測試讀寫分離的效果

連線上Mycat(根據server.xml配置的使用者名稱和密碼,我配置的是mycatuser123456Mycat執行預設埠為8066

已經成功連線到Mycat,並發現有一個mycatdb的虛擬資料庫,其背後有主從兩臺伺服器。

我們在主從複製未關閉的情況下插入一條資料到euhtnmstesttb看能否成功。

Show tables;發現背後的資料庫表,這說明我們的mycat已經成功的和主備資料庫中的資料庫連線上了。先在有主從複製的情況下插入一條資料,再選出來看看。

到其背後的兩臺伺服器看資料是否正常

主資料庫的資料正常通過mycat代理層插入了。

從伺服器的資料通過主從複製同步過來了。

檢視讀寫分離是否成功,先測試是否讀一定是從我們配置的156伺服器讀,我們可以先到156停掉主從複製(stop slave)。然後再從mycat代理端插入資料

我們看到,剛插入的資料沒被select 出來。這是因為我們把主從複製關掉了。代理層只是把資料寫到主伺服器212.從服務沒進行資料同步,此時再讀,由於讀伺服器是156,所以只能查出以前的資料。此時再把slave開啟,可以從代理層看到所有資料了。當讀伺服器宕機變得不可用將會用主伺服器去讀,反之一樣。(開啟slave後從代理端讀的效果如下)

 如果配置有雙主結構,log_slave_updates 這個選項需要設定到myssql的my.cnf配置檔案中

到此mycat的讀寫分離已經完成,當然這不是一個高可用的架構。要做到高效能,高可用,需要考慮很多因素………….有待更新。