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非常相似。