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”,所有寫操作都隨機的在writeHost、readhost分上發。
switchType 屬性:
-1 表示不自動切換
1 預設值,自動切換
2 基於MySQL 主從同步的狀態決定是否切換
writeHost,readHost,heartBeat標籤,定義真實伺服器的讀寫Host,heartBeat為心跳包語句。以上定義了一主一從的讀寫分離機制,writeHost下可以有多個readHost。
6,測試讀寫分離
進入bin目錄啟動mycat (確保配置的讀寫分離Host已經配置了主從資料同步)
Sudo ./mycat start
檢視Mycat是否正常啟動(檢視logs的wrapper.log)
Mycat已經成功啟動,下面測試讀寫分離的效果
連線上Mycat(根據server.xml配置的使用者名稱和密碼,我配置的是mycatuser,123456,Mycat執行預設埠為8066)
已經成功連線到Mycat,並發現有一個mycatdb的虛擬資料庫,其背後有主從兩臺伺服器。
我們在主從複製未關閉的情況下插入一條資料到euhtnms的testtb看能否成功。
Show tables;發現背後的資料庫表,這說明我們的mycat已經成功的和主備資料庫中的資料庫連線上了。先在有主從複製的情況下插入一條資料,再選出來看看。
到其背後的兩臺伺服器看資料是否正常
主資料庫的資料正常通過mycat代理層插入了。
從伺服器的資料通過主從複製同步過來了。
檢視讀寫分離是否成功,先測試是否讀一定是從我們配置的156伺服器讀,我們可以先到156停掉主從複製(stop slave)。然後再從mycat代理端插入資料
我們看到,剛插入的資料沒被select 出來。這是因為我們把主從複製關掉了。代理層只是把資料寫到主伺服器212.從服務沒進行資料同步,此時再讀,由於讀伺服器是156,所以只能查出以前的資料。此時再把slave開啟,可以從代理層看到所有資料了。當讀伺服器宕機變得不可用將會用主伺服器去讀,反之一樣。(開啟slave後從代理端讀的效果如下)
如果配置有雙主結構,log_slave_updates 這個選項需要設定到myssql的my.cnf配置檔案中
到此mycat的讀寫分離已經完成,當然這不是一個高可用的架構。要做到高效能,高可用,需要考慮很多因素………….有待更新。