設定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的設定內容,主要有三段,都在最下方
-
Writer connection(寫入連線):寫入連線要保持在同一台,也就是說不管有幾台機器連透過「寫入連線」的方式連入時,都要導到同一台機器;不過當機器有問題時,也能夠進行failover,下方大概解釋一下設定。
-
listen mariadb_cluster_writes 0.0.0.0:13304
-
說明:宣告監聽(listen),名稱為mariadb_cluster_writes,開放任意IP連入13304 Port(0.0.0.0:13304)。
-
mode tcp
說明:使用tcp或http方式連入,這邊設定是tcp。
-
option httpchk
說明:HA Proxy在確認後方的資料庫時,透過HTTP方式來判斷後端是否正常。
-
server galera-node01 192.168.43.101:3306 check port 9200
說明:宣告server,server的暱稱為 galera-node01,實稱上的IP與Port是 192.168.43.101:3306,確認正常與否的Port是9200。
-
server galera-node02 192.168.43.102:3306 check port 9200 backup
說明:基本上與d是一樣的,不過最後多了一個backup,意思是當正常的機器有問題時,才將連線導至這一台server,如果沒有這個backup的話,HA Proxy會實行分流,可能會導到不同的server,請注意。
-
Read connection(讀取連線):讀取時不導到特定一台機器,只是單純實行Load Balance功能,這邊的設定跟讀取的設定有三點不太一樣,說明如下:
-
listen mariadb_cluster_writes 0.0.0.0:13305
-
說明:我們在Read connection中設定13305的Port。
-
balance leastconn
說明:分流的方式之一,將使用者導到最少人連線的server。
-
server無backup說定
說明:因為server中無backup的設定,所以會實作分流。
-
網頁監看:這一個設定只是單純讓使用者在網頁上可以看到MariaDB的狀態。
-
listen stats 0.0.0.0:9000
-
說明:宣告監聽(listen),名稱為stats ,開放任意IP連入9000 Port(0.0.0.0:9000)。
-
mode http
說明:使用tcp或http方式連入,這邊設定是http。
-
stats enable
說明:設定狀態為啟用。
-
stats uri /haproxy_status
說明:設定HTTP的URL,所以我們等一下要連入的網址是http://IP:9000/haproxy_status。
-
stats realm HAProxy\ Statistics
說明:設定使用者連線時,在輸入帳號密碼的視窗標題,通常會搭配下方的stats auth設定使用。
-
stats auth haproxy:haproxy
說明:設定使用者連線時的帳號密碼。
-
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測試看起來也很成功。
結論
基本上有二點要特別注意的:
-
我們雖然把Connection切分為Read與Write,不過這只是名稱上的區分,實際上利用Read Connection連線進來的人,仍然是可以做寫入的動作,這一點要請大家特別注意,別被名稱騙了,以為連到Read Connetion就真的是唯讀的。
-
MariaDB的Cluster功能只支援InnoDB,不支援MyISAM,所以在建立DB時要特別注意DB的type。
這整套MariaDB Cluster的架設,其實在官網上寫得都還蠻詳細的,大家可參考下方參考文件的連結,看一下官網資料。不過,這整篇的重點並不只是架設MariaDB而已,還有就是寫程式的人員必須注意的,程式面必須區隔Read connection與Write connection,才可以降低資料衝突的機會。
留言列表