負載平衡器Haproxy非常的優秀,在我使用的七八年其間中,沒有壞過,說真的我也覺得不可思議。此篇文章和 [Mysql] 建立叢集式資料庫3/4 -- DB1設置及DB PROXY@新精讚 裡介紹的haproxy是同一個東西,但是經過數年其間,我發現設定已有極大的改動。
次的範例是透過本機的監聽3306埠後,透過haproxy背後連到三台資料庫伺服器的3306埠,以達到資料庫的負載平衡,在設定上讓同一個ip來源盡量連到同一台資料庫,同時,資料庫本身因為是叢集的關係,也會同步資料。
系統及安裝
系統
Rocky Linux release 9.2 (Blue Onyx)
HAProxy安裝版本 version 2.4.22-f8e3218 2023/02/14
安裝
# yum install haproxy
安裝完畢先別急著啟動,請先進行下面設定
設定開機啟動
# systemctl enable haproxy
HAPROXY設定
編輯設定檔
# vi /etc/haproxy/haproxy.cfg
global/defaults的部分
只保留以下內容,多餘的刪除
global
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
# utilize system-wide crypto-policies
ssl-default-bind-ciphers PROFILE=SYSTEM
ssl-default-server-ciphers PROFILE=SYSTEM
defaults
mode tcp
log 127.0.0.1 local2 warning
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
mysql 的連線改成tcp(原本是http),log的部分加上 warning 以提高記錄等級
proxy的部分設定
haproxy分為前後端 frontend/backend,mysqldb是我取的名稱,並指定到後端的名稱mysqlpool
frontend mysqldb
bind 127.0.0.1:3306
default_backend mysqlpool
backend mysqlpool
balance source
server node1 192.168.1.251:3306 check weight 1
server node2 192.168.1.252:3306 check weight 1
server node3 192.168.1.253:3306 check weight 1
平衡的方式,有 roundrobin, static-rr, leastconn, first, source等幾種方式[3]:
roundrobin 由權重輪巡
static-rr 由權重輪巡,無法動態改變權重外,和 roundrobin相同
leastconn 連接數最小的優先
first 先把一台灌爆再換下一台,由id數小的選到最大的
source 由來源的IP來分組,確保每個IP來源會連到同一個DB
SELINUX的設定[3]
# setsebool -P haproxy_connect_any 1
記得要開啟上面那個開關,否則你會得到下面的錯誤:
Starting frontend mysqldb: cannot bind socket (Permission denied) [127.0.0.1:3306]
[/usr/sbin/haproxy.main()] Some protocols failed to start their listeners! Exiting.
以下的錯誤無法解決,但不影響啟動,但確定是selinux的問題。
Cannot read CPUs list of 'node1', will not select them to refine binding
Cannot read CPUs list of 'node0', will not select them to refine binding
啟動
# service haproxy start
# service haproxy stop
# service haproxy restart
LOG檔設定
在上面的設定中我在defaluts中加入了這一行:
但是log到底會寫到哪裡?事實上哪裡都沒寫。你必須做以下的設定:
新增檔案 /etc/rsyslog.d/haproxy.conf 內容如下:
# Collect log with UDP
$ModLoad imudp
$UDPServerAddress 127.0.0.1
$UDPServerRun 514
local2.* /var/log/haproxy.log
重啟rsyslog
# service rsyslog restart
記錄檔會出現在
/var/log/haproxy.log 內容大概這樣:
Jan 18 22:36:06 localhost haproxy[13445]: Connect from 127.0.0.1:51846 to 127.0.0.1:3306 (mysqldb/TCP)
參考資料
[1] https://serverfault.com/questions/645924/haproxy-logging-to-syslog
[2] https://stackoverflow.com/questions/72163632/haproxy-traffic-logs-into-var-log-haproxy-log
[3] https://www.mankier.com/8/haproxy_selinux