close

設定HA Proxy

我們已經完成了check cluster的準備了,接下來可以設定HA Proxy了。我們先來編輯/etc/haproxy/haproxy.cfg。刪除原本的內容,要記得刪除喔,因為保留原先的設定可能會有問題,刪除後再加入下列內容:

global

       log 127.0.0.1   local0

       log 127.0.0.1   local1 notice

       maxconn 1024

       user haproxy

       group haproxy

       daemon

 

defaults

       log     global

       mode    http

       option  tcplog

       option  dontlognull

       retries 3

       option  redispatch

       maxconn 1024

       timeout connect 5000ms

       timeout client 50000ms

       timeout server 50000ms

 

listen mariadb_cluster_writes 0.0.0.0:13304

## A failover pool for writes to ensure writes only hit one node at a time.

       mode tcp

       option httpchk

       server galera-node01 192.168.43.102:3306 check port 9200

       server galera-node02 192.168.43.101:3306 check port 9200 backup

 

listen mariadb_cluster_reads 0.0.0.0:13305

## A load-balanced pool for reads to utilize all nodes for reads.

       mode tcp

       balance leastconn

       option httpchk

       server galera-node01 192.168.43.101:3306 check port 9200

       server galera-node02 192.168.43.102:3306 check port 9200

 

listen stats 0.0.0.0:9000

## HAProxy stats web gui.

       mode http

       stats enable

       stats uri /haproxy_status

       stats realm HAProxy\ Statistics

       stats auth haproxy:haproxy

       stats admin if TRUE

 

完成後如下圖:

相關設定說明

這邊稍微解釋一下HA Proxy的設定內容,主要有三段,都在最下方

  1. Writer connection(寫入連線):寫入連線要保持在同一台,也就是說不管有幾台機器連透過「寫入連線」的方式連入時,都要導到同一台機器;不過當機器有問題時,也能夠進行failover,下方大概解釋一下設定。

    1. listen mariadb_cluster_writes 0.0.0.0:13304

說明:宣告監聽(listen),名稱為mariadb_cluster_writes,開放任意IP連入13304 Port(0.0.0.0:13304)。

  1. mode tcp

說明:使用tcp或http方式連入,這邊設定是tcp。

  1. option httpchk

說明:HA Proxy在確認後方的資料庫時,透過HTTP方式來判斷後端是否正常。

  1. server galera-node01 192.168.43.101:3306 check port 9200

說明:宣告server,server的暱稱為 galera-node01,實稱上的IP與Port是 192.168.43.101:3306,確認正常與否的Port是9200。

  1. server galera-node02 192.168.43.102:3306 check port 9200 backup

說明:基本上與d是一樣的,不過最後多了一個backup,意思是當正常的機器有問題時,才將連線導至這一台server,如果沒有這個backup的話,HA Proxy會實行分流,可能會導到不同的server,請注意。

 

  1. Read connection(讀取連線):讀取時不導到特定一台機器,只是單純實行Load Balance功能,這邊的設定跟讀取的設定有三點不太一樣,說明如下:

    1. listen mariadb_cluster_writes 0.0.0.0:13305

說明:我們在Read connection中設定13305的Port。

  1. balance leastconn

說明:分流的方式之一,將使用者導到最少人連線的server。

  1. server無backup說定

說明:因為server中無backup的設定,所以會實作分流。

 

  1. 網頁監看:這一個設定只是單純讓使用者在網頁上可以看到MariaDB的狀態。

    1. listen stats 0.0.0.0:9000

說明:宣告監聽(listen),名稱為stats ,開放任意IP連入9000 Port(0.0.0.0:9000)。

  1. mode http

說明:使用tcp或http方式連入,這邊設定是http。

  1. stats enable

說明:設定狀態為啟用。

  1. stats uri /haproxy_status

說明:設定HTTP的URL,所以我們等一下要連入的網址是http://IP:9000/haproxy_status。

  1. stats realm HAProxy\ Statistics

說明:設定使用者連線時,在輸入帳號密碼的視窗標題,通常會搭配下方的stats auth設定使用。

  1. stats auth haproxy:haproxy

說明:設定使用者連線時的帳號密碼。

  1. stats admin if TRUE

說明:設定使用者連線後的角色為管理員角色;管理員與一般使用者的差別在於-管理員角色有權限在網頁上針對HA Proxy上管理的伺服器做一些動作。

 

啟動與測試HA Proxy

啟動HA Proxy

走到這一步,代表我們全部都設定好了,這時我們就來啟動HA Proxy吧,利用指令service haproxy start,來啟動HA Proxy。

一樣,我們利用指令chkconfig haproxy on來設定重開機後自動啟用。

測試HA Proxy

開啟瀏灠器並輸入網址http://192.168.43.40:9000/haproxy_status

輸入帳號haproxy,密碼haproxy後,即可登入成功,進到下列畫面。

大家有時間可以稍微研究一下內容,不過這裡的重點是在我們設定的MariaDB Cluster都是亮綠燈的,如果有亮紅燈的狀況,可能要請讀者重新回過頭看一次,到底有那些遺漏了。

整合測試

現在整個MariaDB已經架設完成了,再來要做的就是針對DB連線的做一些測試,還記得我們剛剛有在HA Proxy中切分二個connections嗎?一個是Write connection,一個是Read connection,我們現在就要來針對這個部份做測試。

Read connection測試

我們在HA Proxy中的Read connection設定是0.0.0.0:13305(忘了的話,請往回翻頁),所以理論上,我們每次連DB時,會幫我們導到連線數量比較少的地方,真的是這樣嗎?我們來試看看。

我們利用mysql的指令來連線:

mysql -uroot -p -h192.168.43.40 -P13305

(其中-h指定機器位置時,別忘了指定連到HA Proxy,而大寫的-P指定Port,小寫的-p指的是密碼)

連線成功後,我們還是搞不清楚現在是連到那一台,沒關係,透過指令

SELECT @@HOSTNAME;

就可以知道現在是那一台了,下圖是我們在同一條connection中,重覆的下指令,看起來都是在同一台機器上。

這時候我們透過指令exit離開這個connection,再重新建立一條connection,重新下一次SELECT @@HOSTNAME,我們來看會有什麼結果。

很明顯的,第二次的連線,連到不同的機器上了;看起來我們的測試是成功的。

Write connection測試

我們要切分寫入與讀取的原因,就是要把寫入控制在同一台機器上,再讓Cluster機制幫我們把資料同步在其他機器上,減少資料衝突的因素;因此,Write connection最重要的是,它不能像Read connection幫我們任意導到某一台MariaDB上,而是要固定導到其中一台。瞭我們的目的後,我們再來測試我們設定的Write connection是否有依照我們的預期。

一樣利用mysql的指令來連線,不過這時候的Port要指定13304了(HA Proxy上的設定):

mysql -uroot -p -h192.168.43.40 -P13304

看起來第一次的連線很正常,連到DB1的機器,我們用exit指令離開,再重新建立一次連線。

這次看起來也很正常,我們故意保持目前連線,並登入到資料庫1的機器上,故意將MariaDB做stop的動作。

此時的HA Proxy網頁:

這時候,我們在剛剛的連線上下SELECT @@HOSTNAME的指令:

我們可以看到,第一次下的指令被退回,因為連線不見了,但是當程式幫我們重新連線後,重新指令卻是連到DB2的機器,這個就是failover(容錯轉移)。

我們再重新將資料庫1的資料庫重啟。

重新到HA Proxy的網頁上看一下。

我們離開這個連線,重新再開啟一條連線後,結果如下:

HA Proxy會自動再幫我們重新導到DB1。這個Write connection測試看起來也很成功。

結論

基本上有二點要特別注意的:

  1. 我們雖然把Connection切分為Read與Write,不過這只是名稱上的區分,實際上利用Read Connection連線進來的人,仍然是可以做寫入的動作,這一點要請大家特別注意,別被名稱騙了,以為連到Read Connetion就真的是唯讀的。

  2. MariaDB的Cluster功能只支援InnoDB,不支援MyISAM,所以在建立DB時要特別注意DB的type。

這整套MariaDB Cluster的架設,其實在官網上寫得都還蠻詳細的,大家可參考下方參考文件的連結,看一下官網資料。不過,這整篇的重點並不只是架設MariaDB而已,還有就是寫程式的人員必須注意的,程式面必須區隔Read connection與Write connection,才可以降低資料衝突的機會。

參考文件

  1. http://www.unixmen.com/setup-mariadb-galera-cluster-10-0-centos/

  2. https://mariadb.com/blog/setup-mariadb-enterprise-cluster-part-3-setup-ha-proxy-load-balancer-read-and-write-pools

  3. https://github.com/olafz/percona-clustercheck

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

    台灣的Web工程師

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