【Mycat】MySQL讀寫分離

master-slave讀寫分離

項 目 Mycat MySQL-master MySQL-master-standby MySQL-slave
IP 10.230.4.131 10.230.3.194 10.230.3.195 10.230.2.132
Port 8077/9077 3306 3306 3307

MySQL爲二主一從,3.195爲3.194的standby,2.132爲3.194的slave。

實驗用例表如下:

CREATE TABLE 'yf.travelrecord' (
    'id' int(11) NOT NULL AUTO_INCREMENT,
    'org_code' varchar(20) NOT NULL,
    'test_name' varchar(20) DEFAULT NULL,
    PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Mycat的基本配置如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
    <schema name="mycat01" checkSQLschema="false" sqlMaxLimit="1000">
        <table name="travelrecord" primaryKey="id" dataNode="MySQL" />
    </schema>
    <dataNode name="MySQL" dataHost="MySQL_Host" database="yf" />
    <dataHost name="MySQL_Host" maxCon="1000" minCon="3" balance="0" writeType="0" dbType="MySQL" dbDriver="native" switchType="1">
        <heartbeat>select user()</heartbeat>
        <writeHost host="MySQL_M1" url="10.230.3.194:3306" user="xjw_dba" password="123">
            <readHost host="MySQL_S1" url="10.230.3.132:3307" user="wjx_dba" password="123" />
        </writeHost>
        <writeHost host="MySQL_M2" url="10.230.3.195:3306" user="xjw_dba" password="123">
        </writeHost>
    </dataHost>
</mycat:schema>            

通過show @@datasource查看後端數據庫的分佈情況

balance=0

不開啓讀寫分離機制,所有的讀操作都發送到當前的writeHost上。

balance=1

所有讀操作都發送到了當前的wirteHost對應的readhost和備用的writehost,這樣就可以減輕主庫的壓力,高效地提供寫操作,而由其他服務器承擔比較耗費資源的讀操作。

balance=2

所有讀操作都發送到所有的writeHost金額readhost上,即當前datahost內的服務器都參與分擔讀操作。這個場景比較適合主庫壓力不是很大時,也可以分擔讀操作,更合理地利用資源。

balance=3

所有讀操作只發送到當前writeHost對應的readhost上。在實際應用時,比較適合雙主熱備、多個slave的情況。

MySQL Galera Cluster讀寫分離

MySQL Galera Cluster是一套基於同步複製的多主MySQL集羣解決方案,使用簡單,沒有單點故障,可用性高,能很好地保證業務量不斷增長時數據的安全和隨時擴展。

MySQL Galera Cluster的主要特點有:多服務器的拓撲結構;真正的多主架構,任何節點都可以進行讀寫及同步複製,各節點之間無延遲且節點宕機不會導致數據丟失;緊密耦合,所有節點均保持相同的狀態,節點之間沒有不同的數據,無須主從切換操作或使用vip;在Failover的過程中無停機時間(其實不需要Failover),無須手工備份當前數據庫並複製至新節點;支持InnoDB存儲引擎;對應用透明,無需更改應用或進行極小的更改便可以在任意節點上進行讀寫;自動剔除故障節點,自動加入新節點;真正行級別的併發複製,客戶端連接與操作單臺MySQL數據庫的體驗一致。

Galera官方建議一套Cluster至少有3個節點,理論上可以多寫,但是在多個實驗環境和生產案例中,多寫會引起較爲嚴重的鎖等待,所以使用Galera時推薦用一寫多讀。這樣,Galera結合Mycat,很容易配置出一套讀寫分離的數據庫架構。

項 目 Mycat Pxc1 Pxc2 Pxc3 Pxc1_slave
IP 10.230.4.131 10.230.3.194 10.230.3.195 10.230.3.195 10.230.2.132
Hostname xjw-cc-03 xjw-dba-01 xjw-dba-02 xjw-dba-03 rfd-dba-01
Port 8077/9077 3306 3306 3306 3307

3.194、3.195、3.196爲一套Percona Xtradb Cluster,2.132爲3.194節點的slave。

實驗用例表如下:

CREATE TABLE 'yf.travelrecord' (
    'id' int(11) NOT NULL AUTO_INCREMENT,
    'org_code' varchar(20) NOT NULL,
    'test_name' varchar(20) DEFAULT NULL,
    PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Mycat的基本配置如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
    <schema name="mycat01" checkSQLschema="false" sqlMaxLimit="1000">
        <table name="travelrecord" primaryKey="id" dataNode="pxc" />
    </schema>
    <dataNode name="pxc" dataHost="pxc_Host" database="yf" />
    <dataHost name="pxc_Host" maxCon="1000" minCon="3" balance="0" writeType="0" dbType="MySQL" dbDriver="native" switchType="3">
        <heartbeat>show status like 'wsrep%'</heartbeat>
        <writeHost host="pxc_M1" url="10.230.3.194:3306" user="xjw_dba" password="123">
        </writeHost>
        <writeHost host="pxc_M2" url="10.230.3.195:3306" user="xjw_dba" password="123">
        </writeHost>
        <writeHost host="pxc_M3" url="10.230.3.196:3306" user="xjw_dba" password="123">
        </writeHost>
    </dataHost>
</mycat:schema>            

balance=0

不進行讀寫分離,所有讀寫都走配置的dataHost的第一個writeHost。

balance=1

全部的readHost與stand by writeHost都參與select語句的負載均衡,如果Pxc的節點本身沒帶slave,則三個Pxc節點中 的一個作爲寫,另外兩個作爲讀。按照我們的配置,pxc_M1將作爲寫節點,pxc_M2、pxc_M3參與度。

在第一個節點增加一臺slave,Mycat配置如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
    <schema name="mycat01" checkSQLschema="false" sqlMaxLimit="1000">
        <table name="travelrecord" primaryKey="id" dataNode="pxc" />
    </schema>
    <dataNode name="pxc" dataHost="pxc_Host" database="yf" />
    <dataHost name="pxc_Host" maxCon="1000" minCon="3" balance="0" writeType="0" dbType="MySQL" dbDriver="native" switchType="3">
        <heartbeat>show status like 'wsrep%'</heartbeat>
        <writeHost host="pxc_M1" url="10.230.3.194:3306" user="xjw_dba" password="123">
            <readHost host="pxc_S1" url="10.230.3.132:3307" user="wjx_dba" password="123" />
        </writeHost>
        <writeHost host="pxc_M2" url="10.230.3.195:3306" user="xjw_dba" password="123">
        </writeHost>
        <writeHost host="pxc_M3" url="10.230.3.196:3306" user="xjw_dba" password="123">
        </writeHost>
    </dataHost>
</mycat:schema>            

這時pxc_S1也作爲讀節點加入讀負載均衡。

balance=2

所有讀操作都隨機地在writeHost、readHost上分發。此時作爲寫節點的pxc_M1也參與讀操作。

balance=3

所有讀請求都隨機地分發至writeHost對應的readHost執行,writeHost不負擔讀壓力。如果writeHost沒有對應的readHost,則查詢分發至writeHost。

從上面的各種驗證中可以看出,Galera Cluster有多個節點時,就能通過Mycat實現讀寫分離,而且從Galera的原理可以看出,節點間的同步是“實時”的,這就爲那些對讀寫延遲要求嚴格的系統提供了很好的選擇。如果某個讀節點查詢的資源消耗很大,影響了整個集羣的性能,則這時可以在節點上加一個slave,把大查詢再分離出去。增加slave或者調整讀節點的操作對前端都是透明的,只需修改Mycat配置文件,重啓或者重載Mycat即可。Galera Cluster的讀寫分離在某種意義上與Oracle ADG非常相似。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章