在MySQL世界里,HAProxy 通常來(lái)作為軟件負(fù)載均衡器使用。彼得.博羅什在過去的郵件中解釋了如何使用percona xtradb集群(pxc)來(lái)對(duì)其設(shè)置。所以它只發(fā)送查詢到可應(yīng)用的節(jié)點(diǎn)。同樣的方法可用于常規(guī)主從設(shè)置來(lái)讀取負(fù)載并分散到多個(gè)從節(jié)點(diǎn)。不過,使用MySQL復(fù)制,另一個(gè)因素開始發(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)單的可以訪問給定端口上TCP連接的程。所以,如果我們要在一臺(tái)MySQL服務(wù)器上運(yùn)行代理,這需要:
我們可以使用這樣一個(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
新聞熱點(diǎn)
疑難解答
圖片精選