架設Load Balance(HA Proxy)
HA Proxy是一套開源的高效能網站平衡負載工具,也是MariaDB官方建議的Load Balance軟體,所以我們接下來要開始安裝HA Proxy,並連接MariaDB。
關閉防火牆
在安裝HA Proxy前,我們一樣要先關閉本機的防火牆設定,方式跟上方的MariaDB機器一樣,透過指令:service iptables stop來關閉防火牆;再透過指令chkconfig iptables off,令防火牆在重開機後不會重新啟動。
安裝HA Proxy
一關始當始是安裝HA Proxy,先登入到Load Balance的機器上,再透過指令安裝HA Proxy,指令如下:yum install haproxy,安裝結果如下圖。
建立與設定clustercheck
安裝完HA Proxy之後,正常是要進入設定步驟啦,不過HA Proxy必須要能夠瞭解MariaDB是否正常執行,為了讓HA Proxy可以判斷MariaDB是否正常,我們必須設定一個clustercheck的功能。
下載並設定clustercheck
各位可從網址https://github.com/olafz/percona-clustercheck取到clustercheck的檔案,而這個檔案的功用是
-
判斷資料庫連線是否正常。
-
根據判斷結果組成不同的HTTP結果。
HA Proxy就可以根據回傳的結果來判斷資料庫是否是正常?如果資料庫掛掉的話,HA Proxy會把使用者導到正常的資料庫。
這裡要注意的一點是:clustercheck的檔案是安裝在資料庫1與資料庫2上,而不是在HA Proxy上。
請下載clustercheck並將檔案放在/usr/bin/底下,並設定可執行權限,下方是clustercheck的原始碼:
--------------------------------------------------Script 開始 ----------------------------------------------------------------
#!/bin/bash
#
# Script to make a proxy (ie HAProxy) capable of monitoring Percona XtraDB Cluster nodes properly
#
# Author: Olaf van Zandwijk <olaf.vanzandwijk@nedap.com>
# Author: Raghavendra Prabhu <raghavendra.prabhu@percona.com>
#
# Documentation and download: https://github.com/olafz/percona-clustercheck
#
# Based on the original script from Unai Rodriguez
#
if [[ $1 == '-h' || $1 == '--help' ]];then
echo "Usage: $0 <user> <pass> <available_when_donor=0|1> <log_file> <available_when_readonly=0|1> <defaults_extra_file>"
exit
fi
# if the disabled file is present, return 503. This allows
# admins to manually remove a node from a cluster easily.
if [ -e "/var/tmp/clustercheck.disabled" ]; then
# Shell return-code is 1
echo -en "HTTP/1.1 503 Service Unavailable\r\n"
echo -en "Content-Type: text/plain\r\n"
echo -en "Connection: close\r\n"
echo -en "Content-Length: 51\r\n"
echo -en "\r\n"
echo -en "Percona XtraDB Cluster Node is manually disabled.\r\n"
sleep 0.1
exit 1
fi
MYSQL_USERNAME="${1-clustercheckuser}"
MYSQL_PASSWORD="${2-clustercheckpassword!}"
AVAILABLE_WHEN_DONOR=${3:-0}
ERR_FILE="${4:-/dev/null}"
AVAILABLE_WHEN_READONLY=${5:-1}
DEFAULTS_EXTRA_FILE=${6:-/etc/my.cnf}
#Timeout exists for instances where mysqld may be hung
TIMEOUT=10
EXTRA_ARGS=""
if [[ -n "$MYSQL_USERNAME" ]]; then
EXTRA_ARGS="$EXTRA_ARGS --user=${MYSQL_USERNAME}"
fi
if [[ -n "$MYSQL_PASSWORD" ]]; then
EXTRA_ARGS="$EXTRA_ARGS --password=${MYSQL_PASSWORD}"
fi
if [[ -r $DEFAULTS_EXTRA_FILE ]];then
MYSQL_CMDLINE="mysql --defaults-extra-file=$DEFAULTS_EXTRA_FILE -nNE --connect-timeout=$TIMEOUT \
${EXTRA_ARGS}"
else
MYSQL_CMDLINE="mysql -nNE --connect-timeout=$TIMEOUT ${EXTRA_ARGS}"
fi
#
# Perform the query to check the wsrep_local_state
#
WSREP_STATUS=$($MYSQL_CMDLINE -e "SHOW STATUS LIKE 'wsrep_local_state';" \
2>${ERR_FILE} | tail -1 2>>${ERR_FILE})
if [[ "${WSREP_STATUS}" == "4" ]] || [[ "${WSREP_STATUS}" == "2" && ${AVAILABLE_WHEN_DONOR} == 1 ]]
then
# Check only when set to 0 to avoid latency in response.
if [[ $AVAILABLE_WHEN_READONLY -eq 0 ]];then
READ_ONLY=$($MYSQL_CMDLINE -e "SHOW GLOBAL VARIABLES LIKE 'read_only';" \
2>${ERR_FILE} | tail -1 2>>${ERR_FILE})
if [[ "${READ_ONLY}" == "ON" ]];then
# Percona XtraDB Cluster node local state is 'Synced', but it is in
# read-only mode. The variable AVAILABLE_WHEN_READONLY is set to 0.
# => return HTTP 503
# Shell return-code is 1
echo -en "HTTP/1.1 503 Service Unavailable\r\n"
echo -en "Content-Type: text/plain\r\n"
echo -en "Connection: close\r\n"
echo -en "Content-Length: 43\r\n"
echo -en "\r\n"
echo -en "Percona XtraDB Cluster Node is read-only.\r\n"
sleep 0.1
exit 1
fi
fi
# Percona XtraDB Cluster node local state is 'Synced' => return HTTP 200
# Shell return-code is 0
echo -en "HTTP/1.1 200 OK\r\n"
echo -en "Content-Type: text/plain\r\n"
echo -en "Connection: close\r\n"
echo -en "Content-Length: 40\r\n"
echo -en "\r\n"
echo -en "Percona XtraDB Cluster Node is synced.\r\n"
sleep 0.1
exit 0
else
# Percona XtraDB Cluster node local state is not 'Synced' => return HTTP 503
# Shell return-code is 1
echo -en "HTTP/1.1 503 Service Unavailable\r\n"
echo -en "Content-Type: text/plain\r\n"
echo -en "Connection: close\r\n"
echo -en "Content-Length: 44\r\n"
echo -en "\r\n"
echo -en "Percona XtraDB Cluster Node is not synced.\r\n"
sleep 0.1
exit 1
fi
--------------------------------------------------Script 結束 ----------------------------------------------------------------
下圖是用編輯的方式,將clustercheck放在/usr/bin下。
不過我們還少了一步,要將該檔案設為可執行,指令是chmod 755 /usr/bin/clustercheck
要注意資料庫1與資料庫2都要下載並設定。
建立DB的使用者clustercheck
我們建立好clustercheck的script後,因為clustercheck必須去確認MariaDB是否正常,所以它必須要去連線DB,要連線DB,就需要一組可登入的帳號密碼,因為clustercheck中是把連線的帳號密碼以明碼的方式也寫在script上(參考script中的粗體文字),所以我們要給一組權限沒那麼大的帳號與密碼。先連到MariaDB中的命令列中,輸入下方指令:
-
GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!' ;
-
FLUSH PRIVILEGES;
因為我們資料庫1與資料庫2已經建立Cluster了,所以我們在二台機器中任意一台建立這個使用者即可。
這樣,我們的clustercheck就建立完畢了。
安裝與設定xinetd
為了要讓我們的clustercheck可以透過網路執行,所以我們要利用xineted的套件來幫助我們實作,下列的步驟是資料庫1與資料庫2都要做的喔。
安裝xinetd
安裝一樣是透過yum,指令為yum install xinetd。
設定xinetd
我們要在建立一個檔案mysqlchk在/etc/xinetd.d/下,透過指令vi /etc/xinetd.d/mysqlchk
資料內容如下:
# default: on
# description: mysqlchk
service mysqlchk
{
disable = no
flags = REUSE
socket_type = stream
port = 9200
wait = no
user = nobody
server = /usr/bin/clustercheck
log_on_failure += USERID
only_from = 0.0.0.0/0
per_source = UNLIMITED
}
如下圖:
在上方中,我們設定了9200來當我們觸發xinetd的Port,所以要在/etc/services裡做一下調整,透過vi /etc/services來調整,取消原本的9200,加入我們新增的mysqlchk,調整結果如下圖:
啟動xinetd
透過指令service xinetd start來啟動。
設定xinetd重啟動後自動啟動,指令:chkconfig xinetd on
一樣,不要忘記要在資料庫1與資料庫2都要執行喔。
整合測試
完成後可以利用telnet localhost 9200的方式,來判斷xinetd及clustercheck是否正常運作,結果如下圖:
我們終於設定到一半了,休息一下,下一篇接著繼續。
留言列表