用HAProxy來(lái)檢測(cè)MySQL復(fù)制的延遲的教程
在MySQL世界里,HAProxy 通常來(lái)作為軟件負(fù)載均衡器使用。彼得.博羅什在過(guò)去的郵件中解釋了如何使用percona xtradb集群(pxc)來(lái)對(duì)其設(shè)置。所以它只發(fā)送查詢到可應(yīng)用的節(jié)點(diǎn)。同樣的方法可用于常規(guī)主從設(shè)置來(lái)讀取負(fù)載并分散到多個(gè)從節(jié)點(diǎn)。不過(guò),使用MySQL復(fù)制,另一個(gè)因素開(kāi)始發(fā)揮作用:復(fù)制延遲。在這種情況下,被提及到的 Percona xtraDB 集群以及我們提出只返回“向上”或者“向下”的檢查方法行不通。我們將希望依賴其復(fù)制延遲來(lái)調(diào)整內(nèi)部Haproxy的一個(gè)權(quán)重。這就是我們要做的在這篇文章中使用HAProxy 1.5。
HAProxy的代理檢測(cè)
HAProxy 1.5運(yùn)行我們運(yùn)行一個(gè)代理檢測(cè),這是一項(xiàng)可以添加到常規(guī)健康檢測(cè)項(xiàng)的檢測(cè)。代理檢測(cè)的好處是返回值可以是‘up'或 ‘down',但也可以是個(gè)權(quán)重值。
代理是什么呢?它是一個(gè)簡(jiǎn)單的可以訪問(wèn)給定端口上TCP連接的程。所以,如果我們要在一臺(tái)MySQL服務(wù)器上運(yùn)行代理,這需要:
- 如果不運(yùn)行復(fù)制的話確保服務(wù)在HAProxy上是停止的
- 如果復(fù)制延遲小于10s,設(shè)置weight為100%
- 如果延遲大于等于10s,小于50s,設(shè)置weight為50%
- 在其他情況下設(shè)置weight為5%
我們可以使用這樣一個(gè)腳本:
$ less agent.php <!--?php // Simple socket server // See http://php.net/manual/en/function.stream-socket-server.php $port = $argv[1]; $mysql_port = $argv[2]; $mysql = "/usr/bin/mysql"; $user = 'haproxy'; $password = 'haproxy_pwd'; $query = "SHOW SLAVE STATUS"; function set_weight($lag){ # Write your own rules here if ($lag == 'NULL'){ return "down"; } else if ($lag < 10){ return "up 100%"; } else if ($lag -->= 10 && $lag < 60){ return "up 50%"; } else return "up 5%"; } set_time_limit(0); $socket = stream_socket_server("tcp://127.0.0.1:$port", $errno, $errstr); if (!$socket) { echo "$errstr ($errno) n"; } else { while ($conn = stream_socket_accept($socket,9999999999999)) { $cmd = "$mysql -h127.0.0.1 -u$user -p$password -P$mysql_port -Ee "$query" | grep Seconds_Behind_Master | cut -d ':' -f2 | tr -d ' '"; exec("$cmd",$lag); $weight = set_weight($lag[0]); unset($lag); fputs ($conn, $weight); fclose ($conn); } fclose($socket); } ?>
如果你希望腳本從端口6789發(fā)出連接到運(yùn)行在3306端口上的MySQL實(shí)例,這樣運(yùn)行:
$ php agent.php 6789 3306
你還需要指定MySQL用戶:
mysql> GRANT REPLICATION CLIENT ON *.* TO 'haproxy'@'127.0.0.1' IDENTIFIED BY 'haproxy_pwd';
代理啟動(dòng)后,你可以檢測(cè)一下它是否正常運(yùn)行:
# telnet 127.0.0.1 6789 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. up 100% Connection closed by foreign host.
假設(shè)它運(yùn)行在本地的應(yīng)用服務(wù)器上,有兩個(gè)復(fù)制正在運(yùn)行(192.168.10.2和192.168.10.3),應(yīng)用的讀請(qǐng)求在3307端口,你需要在HAProxy中配置一個(gè)前端和后端,像這樣:
frontend read_only-front
bind *:3307
mode tcp
option tcplog
log global
default_backend read_only-back
backend read_only-back
mode tcp
balance leastconn
server slave1 192.168.10.2 weight 100 check agent-check agent-port 6789 inter 1000 rise 1 fall 1 on-marked-down shutdown-sessions
server slave2 192.168.10.3 weight 100 check agent-check agent-port 6789 inter 1000 rise 1 fall 1 on-marked-down shutdown-sessions
現(xiàn)在所有的都準(zhǔn)備好了,現(xiàn)在讓我們看看怎么使用HAProxy來(lái)動(dòng)態(tài)的改變重滯服務(wù)器,代碼如下:
# Slave1
$ mysql -Ee "show slave status" | grep Seconds_Behind_Master
Seconds_Behind_Master: 0
# Slave2
$ mysql -Ee "show slave status" | grep Seconds_Behind_Master
Seconds_Behind_Master: 0
# HAProxy
$ echo "show stat" | socat stdio /run/haproxy/admin.sock | cut -d ',' -f1,2,18,19
# pxname,svname,status,weight
read_only-front,FRONTEND,OPEN,
read_only-back,slave1,UP,100
read_only-back,slave2,UP,100
read_only-back,BACKEND,UP,200
時(shí)延1
# Slave1
$ mysql -Ee "show slave status" | grep Seconds_Behind_Master
Seconds_Behind_Master: 25
# Slave2
$ mysql -Ee "show slave status" | grep Seconds_Behind_Master
Seconds_Behind_Master: 0
# echo "show stat" | socat stdio /run/haproxy/admin.sock | cut -d ',' -f1,2,18,19
# pxname,svname,status,weight
read_only-front,FRONTEND,OPEN,
read_only-back,slave1,UP,50
read_only-back,slave2,UP,100
read_only-back,BACKEND,UP,150
時(shí)延2
# Slave1
$ mysql -Ee "show slave status" | grep Seconds_Behind_Master
Seconds_Behind_Master: 0
# Slave2
$ mysql -Ee "show slave status" | grep Seconds_Behind_Master
Seconds_Behind_Master: NULL
# echo "show stat" | socat stdio /run/haproxy/admin.sock | cut -d ',' -f1,2,18,19
# pxname,svname,status,weight
read_only-front,FRONTEND,OPEN,
read_only-back,slave1,UP,100
read_only-back,slave2,DOWN (agent),100
read_only-back,BACKEND,UP,100
結(jié)論
在HAProxy 1.5中代理檢查是一個(gè)很好的新增功能。 在上面的設(shè)置中是簡(jiǎn)單的: 舉例來(lái)說(shuō), 如果 HAProxy 連接代理失敗,它就不會(huì)被標(biāo)記。 推薦與代理檢查一起,保持常規(guī)的健康度檢查。
細(xì)心的讀取者們(reads)將會(huì)注意到這個(gè)配置,如果在所有節(jié)點(diǎn)上都被復(fù)制, HAProxy將會(huì)停止發(fā)送給讀取者. 這可能不是最好的解決方案。但可能的選項(xiàng)是:停止代理并標(biāo)記服務(wù)器為UP,使用狀態(tài)套接字(socket)或者添加主節(jié)點(diǎn)作為備份服務(wù)器。
最后一點(diǎn),使用Percona工具集的pt-heartbeat替代Seconds_Behind_Master,您可以編輯代理的代碼,可以對(duì)復(fù)制的延遲進(jìn)行測(cè)量 。
相關(guān)文章
與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(七)--查詢
在這個(gè)《與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得》系列里面,我一直都把MYSQL跟SQLSERVER進(jìn)行比較,相互進(jìn)行比較是學(xué)習(xí)一樣?xùn)|西比較好的方法2014-08-08淺談mysql中多表不關(guān)聯(lián)查詢的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇淺談mysql中多表不關(guān)聯(lián)查詢的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10mysql 內(nèi)存緩沖池innodb_buffer_pool_sizes大小調(diào)整實(shí)現(xiàn)
innodb_buffer_pool_size是MySQL中InnoDB存儲(chǔ)引擎的一個(gè)重要參數(shù),本文主要介紹了mysql 內(nèi)存緩沖池innodb_buffer_pool_sizes大小調(diào)整實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05詳解監(jiān)聽(tīng)MySQL的binlog日志工具分析:Canal
Canal主要用途是基于MySQL數(shù)據(jù)庫(kù)增量日志解析,提供增量數(shù)據(jù)訂閱和消費(fèi),目前主要支持MySQL。接下來(lái)通過(guò)本文給大家介紹監(jiān)聽(tīng)MySQL的binlog日志工具分析:Canal的相關(guān)知識(shí),感興趣的朋友一起看看吧2020-10-10MYSQL 根據(jù)唯一索引鍵更新死鎖問(wèn)題解析
這篇文章主要介紹了MYSQL 根據(jù)唯一索引鍵更新死鎖問(wèn)題解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-10-10Mysql 主從數(shù)據(jù)庫(kù)同步(centos篇)
Mysql 主從數(shù)據(jù)庫(kù)同步(centos篇),需要的朋友可以參考下。2011-05-05