架設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的檔案,而這個檔案的功用是

  1. 判斷資料庫連線是否正常。

  2. 根據判斷結果組成不同的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中的命令列中,輸入下方指令:

  1. GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!' ;

  2. 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是否正常運作,結果如下圖:

我們終於設定到一半了,休息一下,下一篇接著繼續。

arrow
arrow
    創作者介紹
    創作者 JAVA Programmer 的頭像
    JAVA Programmer

    台灣的Web工程師

    JAVA Programmer 發表在 痞客邦 留言(0) 人氣()