您好,登錄后才能下訂單哦!
我有一個(gè)MySQL Master-Slave Replication, 想要通過(guò)HAProxy代理, 做讀寫(xiě)分離.
寫(xiě)流量給到Master 節(jié)點(diǎn), 讀流量給到Slave 節(jié)點(diǎn).
首先我應(yīng)該由一個(gè)HAProxy的配置, 我想應(yīng)該這樣寫(xiě)(偽配置):
listen mysql
bind *:3316
mode tcp
...
server 192.168.1.111 192.168.1.111:3306 check
server 192.168.1.112 192.168.1.112:3306 check
server 192.168.1.113 192.168.1.113:3306 check
很明顯, 這么寫(xiě)僅僅只實(shí)現(xiàn)了流量的分發(fā), 但并不能實(shí)現(xiàn)我的需求: 把寫(xiě)流量給Master, 讀流量給Slave 節(jié)點(diǎn).
那么問(wèn)題來(lái)了,首先我要能夠識(shí)別Master Slave 節(jié)點(diǎn), 才能有接下來(lái)的流量分離.
HAProxy有個(gè)配置項(xiàng)叫做 mysql-check. 但是這里并不能用它去做Master-Slave的檢測(cè),因?yàn)檫@個(gè)option只提供存活檢測(cè).
只要能夠連上,就代表這個(gè)mysql后端是Health OK的.
這還是不符合我的需求.
MySQL 如果能夠通過(guò)tcp-check 檢測(cè)是Master還是Slave就好了.
既然這樣, 寫(xiě)一個(gè)TCP-check Wrapper 不就可以了?
這個(gè)Wrapper應(yīng)該監(jiān)聽(tīng)在TCP端口上,并以守護(hù)進(jìn)程的方式運(yùn)行.
當(dāng)HAproxy連接至其監(jiān)聽(tīng)的端口時(shí), 會(huì)執(zhí)行相應(yīng)的腳本, 并將腳本執(zhí)行結(jié)果通過(guò) TCP 連接發(fā)送至Haproxy.
代碼如下:
放置好mysqlchk 腳本, 然后在每個(gè)MySQL節(jié)點(diǎn)上把tcp-check-wrapper服務(wù)跑起來(lái).
在Master節(jié)點(diǎn)上測(cè)試一下腳本
[root@control-01 ~]# mysqlchk.mysql
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 43
<html><body>MySQL master is running.</body></html>
在Slave節(jié)點(diǎn)上測(cè)試一下
[root@control-02 ~]# mysqlchk.mysql
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 43
<html><body>MySQL slave is running. (Slave lag: 0)</body></html>
OK, 通過(guò) mysql check 腳本已經(jīng)可以幫助我們區(qū)分Master還是Slave了.
然后配置好tcp-check-wrapper.
# /etc/haproxy-tcp-check-wrapper
host = "0.0.0.0"
port = 9090
script = "/usr/bin/mysqlchk.mysql"
在每個(gè)MySQL節(jié)點(diǎn)上, 運(yùn)行 tcp-check-wrapper.
haproxy_tcp_check &
基于我們前面所做的, 現(xiàn)在可以寫(xiě)出HAProxy的配置文件了.
listen mysql_write
bind *:3316
mode tcp
timeout client 10800s
timeout server 10800s
balance leastconn
option tcp-check
tcp-check expect string MySQL\ master\ is\ running.
option allbackups
default-server port 9090 inter 2s downinter 5s rise 3 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
server 192.168.1.111 192.168.1.111:3306 check
server 192.168.1.112 192.168.1.112:3306 check
server 192.168.1.113 192.168.1.113:3306 check
listen mysql_read
bind *:3317
mode tcp
timeout client 10800s
timeout server 10800s
balance leastconn
option tcp-check
tcp-check expect string MySQL\ slave\ is\ running.
option allbackups
default-server port 9090 inter 2s downinter 5s rise 3 fall 2 slowstart 60s maxconn 64 maxqueue 128 weight 100
server 192.168.1.111 192.168.1.111:3306 check
server 192.168.1.112 192.168.1.112:3306 check
server 192.168.1.113 192.168.1.113:3306 check
至此, 我們已經(jīng)通過(guò)HAProxy, 借助了 "TCP-Check-Wrapper" + "mysqlchk", 實(shí)現(xiàn)了MySQL Master-Slave Replication 的讀寫(xiě)分離,
TCP-Check-Wrapper 幫助我們對(duì)一些不能使用tcp-check option 的應(yīng)用執(zhí)行檢查.
mysqlchk 提供了具體檢測(cè)的方法.
其實(shí)再多想一點(diǎn), 可以再進(jìn)一步利用MHA + HAPRoxy, 可以實(shí)現(xiàn) MySQL Master-Slave Replication 高可用.
即: 在Master發(fā)生故障時(shí), MHA可以將其中一臺(tái) MySQL Slave提升為Master, 并且配置其他的Slave指向新的Master.
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。