溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何利用HAProxy 代理 MySQL Master-Sl

發(fā)布時(shí)間:2020-07-28 09:32:44 來(lái)源:網(wǎng)絡(luò) 閱讀:320 作者:wx5e047b1f71dff 欄目:系統(tǒng)運(yùn)維

背景

我有一個(gè)MySQL Master-Slave Replication, 想要通過(guò)HAProxy代理, 做讀寫(xiě)分離.

寫(xiě)流量給到Master 節(jié)點(diǎn), 讀流量給到Slave 節(jié)點(diǎn).

如何利用HAProxy 代理 MySQL Master-Sl

首先我應(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 不就可以了?

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.

代碼如下:

  • TCP-Check-Wrapper
  • mysqlchk

放置好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 &

HAProxy的配置

基于我們前面所做的, 現(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

總結(jié)

至此, 我們已經(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.

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI