您好,登錄后才能下訂單哦!
我有一個MySQL Master-Slave Replication, 想要通過HAProxy代理, 做讀寫分離.
寫流量給到Master 節點, 讀流量給到Slave 節點.
首先我應該由一個HAProxy的配置, 我想應該這樣寫(偽配置):
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
很明顯, 這么寫僅僅只實現了流量的分發, 但并不能實現我的需求: 把寫流量給Master, 讀流量給Slave 節點.
那么問題來了,首先我要能夠識別Master Slave 節點, 才能有接下來的流量分離.
HAProxy有個配置項叫做 mysql-check. 但是這里并不能用它去做Master-Slave的檢測,因為這個option只提供存活檢測.
只要能夠連上,就代表這個mysql后端是Health OK的.
這還是不符合我的需求.
MySQL 如果能夠通過tcp-check 檢測是Master還是Slave就好了.
既然這樣, 寫一個TCP-check Wrapper 不就可以了?
這個Wrapper應該監聽在TCP端口上,并以守護進程的方式運行.
當HAproxy連接至其監聽的端口時, 會執行相應的腳本, 并將腳本執行結果通過 TCP 連接發送至Haproxy.
代碼如下:
放置好mysqlchk 腳本, 然后在每個MySQL節點上把tcp-check-wrapper服務跑起來.
在Master節點上測試一下腳本
[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節點上測試一下
[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, 通過 mysql check 腳本已經可以幫助我們區分Master還是Slave了.
然后配置好tcp-check-wrapper.
# /etc/haproxy-tcp-check-wrapper
host = "0.0.0.0"
port = 9090
script = "/usr/bin/mysqlchk.mysql"
在每個MySQL節點上, 運行 tcp-check-wrapper.
haproxy_tcp_check &
基于我們前面所做的, 現在可以寫出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
至此, 我們已經通過HAProxy, 借助了 "TCP-Check-Wrapper" + "mysqlchk", 實現了MySQL Master-Slave Replication 的讀寫分離,
TCP-Check-Wrapper 幫助我們對一些不能使用tcp-check option 的應用執行檢查.
mysqlchk 提供了具體檢測的方法.
其實再多想一點, 可以再進一步利用MHA + HAPRoxy, 可以實現 MySQL Master-Slave Replication 高可用.
即: 在Master發生故障時, MHA可以將其中一臺 MySQL Slave提升為Master, 并且配置其他的Slave指向新的Master.
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。