1.1 haproxy介紹
HAProxy 是一個使用C語言編寫的自由及開放原始碼軟體,其提供高可用性、負載均衡,以及基於 TCP 和 HTTP 的應用程式代理。
- HAProxy 特別適用於那些負載特大的 web 站點,這些站點通常又需要會話保持或七層處理。
- HAProxy 執行在當前的硬體上,完全可以支援數以萬計的併發連線。並且它的執行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的 web 伺服器不被暴露到網路上。
- HAProxy 實現了一種事件驅動,單一程式模型,此模型支援非常大的併發連線數。多程式或多執行緒模型受記憶體限制 、系統排程器限制以及無處不在的鎖限制,很少能處理數千併發連線。事件驅動模型因為在有更好的資源和時間管理的使用者空間 (User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程式通常擴充套件性較差。這就是為什麼他們必須進行優化以使每個 CPU 時間片 Cycle 做更多的工作。
- 相較與 Nginx,HAProxy 更專注與反向代理,因此它可以支援更多的選項,更精細的控制,更多的健康狀態檢測機制和負載均衡演算法。
- 包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter 和 Tuenti 在內的知名網站,及亞馬遜網路服務系統都使用了 HAProxy。
Haproxy的特性:
1. 可靠性與穩定性都非常出色,可與硬體級裝置媲美。
- 支援連線拒絕,可以用於防止 DDoS 攻擊
- 支援長連線、短連線和日誌功能,可根據需要靈活配置
- 路由 HTTP 請求到後端伺服器,基於 cookie 作會話繫結;同時支援通過獲取指定的 url 來檢測後端伺服器的狀態
- HAProxy 還擁有功能強大的 ACL 支援,可靈活配置路由功能,實現動靜分離,在架構設計與實現上帶來很大方便
- 可支援四層和七層負載均衡,幾乎能為所有服務常見的提供負載均衡功能
- 擁有功能強大的後端伺服器的狀態監控 web 頁面,可以實時瞭解裝置的執行狀態 ,還可實現裝置上下線等簡單操作。
- 支援多種負載均衡排程演算法,並且也支援 session 保持。
- Haproxy 七層負載均衡模式下,負載均衡與客戶端及後端的伺服器會分別建立一次 TCP連線,而在四層負載均衡模式下(DR),僅建立一次 TCP 連線;七層負載均衡對負載均衡裝置的要求更高,處理能力也低於四層負載均衡
1.2 配置檔案詳細介紹
注意:此處只做配置檔案介紹,不做為後期負載均衡配置
global
log 127.0.0.1 local0 # 定義全域性的 syslog 伺服器,最多可定義2個,格式:log <address> <facility> [max level [min level]]
chroot /var/lib/haproxy # 修改 haproxy 的工作目錄至指定的目錄並在放棄許可權之前執行,保證haproxy的安全,使用配置檔案預設值即可
pidfile /var/run/haproxy.pid
maxconn 10000 # 設定每個haproxy程式所接受的最大併發連線數,其等同於命令列選項“-n”;“ulimit -n”自動計算的結果正是參照此引數設定的;
user haproxy # 以指定的 user 執行haproxy,建議使用專用於執行 haproxy 的 user, 以免因許可權問題帶來風險;
group haproxy # 以指定的 group 執行haproxy,建議使用專用於執行 haproxy 的 group, 以免因許可權問題帶來風險;
daemon # 讓 haproxy 以守護程式的方式工作於後臺,其等同於 “-D” 選項的功能, 當然,也可以在命令列中以 “-db” 選項將其禁用;
ulimit-n 100000 # 設定每程式所能夠開啟的最大檔案描述符數目,預設情況下其會自動進行計算,因此不推薦修改此選項;Linux預設單程式開啟檔案數為1024個
stats socket /var/lib/haproxy/stats level admin process 1 # 開啟一個 socket 管理介面
nbproc 12 # 指定啟動的 haproxy 程式個數,只能用於守護程式模式的 haproxy;預設只啟動一個程式,
cpu-map 1 0 # 繫結 cpu,和 nbproc 數量相對。程式號從1開始,cpu 核數從0開始;
defaults
log global
option tcplog # 啟用日誌記錄;tcplog 請求;
option dontlognull # 日誌中將不會記錄空連線;
retries 3 # 定義連線後端伺服器的失敗重連次數
timeout connect 2s # 定義 haproxy 將客戶端請求轉發至後端伺服器所等待的超時時長
timeout client 3600s # 客戶端非活動狀態的超時時長
timeout server 3600s # 客戶端與伺服器端建立連線後,等待伺服器端的超時時長
maxconn 10000 # 預設和前段的最大連線數,但不能超過 global 中的 maxconn 限制數
listen admin_stats # 開啟一個統計報告服務
bind *:1080 # 監聽1080埠
mode http # 基於http協議
maxconn 10
stats refresh 10s # 統計頁面自動重新整理時間間隔
stats uri /haproxy # url 地址
stats realm Haproxy # 統計頁面密碼框上提示文字
stats auth admin:admin # 賬號:密碼
stats hide-version # 隱藏統計報告版本資訊
stats admin if TRUE # 在制定條件下開啟admin 功能
frontend haproxy # 前端應用
bind *:40000 # 埠
mode tcp # tcp 模式
default_backend tidb # 此前端對應的後端應用
backend tidb # 後端應用
balance leastconn # balance 基於最少連線數
mode tcp # tcp 模式
# acl internal_networks src 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 127.0.0.1 定義一條ACL,ACL是根據資料包的指定屬性以指定表示式計算出的true/false值。
# tcp-request content reject if ! internal_networks
# option mysql-check user haproxy post-41
server tidb1 10.0.1.4:4000 check # 後端應用地址,代理將會將對應客戶端的請求轉發至這些伺服器。
server tidb2 10.0.1.10:4000 check
1.3 haproxy安裝與環境配置
在192.168.199.175與192.168.199.172(負載均衡伺服器)中安裝與配置如下:
- 安裝haproxy負載均衡器
yum install haproxy -y
- 配置haproxy配置檔案,目錄:/etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode tcp
log global
option tcplog
option dontlognull
option http-server-close
option redispatch
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
frontend mysql
bind 0.0.0.0:3307
mode tcp
log global
default_backend mysql_server
backend mysql_server
balance roundrobin
server mysql1 192.168.199.172:3306 check inter 5s rise 2 fall 3
server mysql2 192.168.199.175:3306 check inter 5s rise 2 fall 3
listen stats
mode http
bind 0.0.0.0:1080
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
- 啟動haproxy負載均衡
./usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
- 檢視狀態
192.168.126.101:1080/haproxyadmin?s...
2.1 Keepalived介紹
Keepalived的作用是檢測伺服器的狀態,如果有一臺伺服器當機,或工作出現故障,Keepalived將檢測到,並將有故障的伺服器從系統中剔除,同時使用其它伺服器代替該伺服器的工作,當伺服器工作 正常後Keepalived自動將伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的伺服器。
2.2 Keepalived安裝
- 安裝Keepalived需要的擴充套件
[root@localhost keepalived]# yum install gcc gcc-c++ openssl openssl-devel
[root@localhost home]# wget -q https://www.keepalived.org/software/keepalived-1.2.18.tar.gz
2.解壓Keepalived並安裝
[root@localhost home]# tar -zxvf keepalived-1.2.18.tar.gz [root@localhost home]# cd keepalived-1.2.18 [root@localhost keepalived-1.2.18]# ./configure --prefix=/usr/local/keepalived [root@localhost keepalived-1.2.18]# make && make install
- 將 keepalived 安裝成 Linux 系統服務
因為沒有使用 keepalived 的預設路徑安裝(預設是/usr/local) ,安裝完成之後,需要做一些工作 複製預設配置檔案到預設路徑
[root@localhost keepalived-1.2.18]# mkdir /etc/keepalived
[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
複製 keepalived 服務指令碼到預設的地址
[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@localhost keepalived-1.2.18]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
設定 keepalived 服務開機啟動
[root@localhost keepalived-1.2.18]# chkconfig keepalived on
3. mysql高可用搭建
3.1 Keepalived配置
keepalived主機配置
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
}
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh" ## 檢測 haproxy 狀態的指令碼路徑
interval 2 ## 檢測時間間隔
weight 2 ## 如果條件成立,權重+2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 79
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.29.101
}
track_script {
chk_haproxy
}
}
# 寫VIP virtual_server,只配置本地機器
virtual_server 192.168.29.101 3307 {# 定義虛擬伺服器,地址與上面的virtual_ipaddress相同
delay_loop 3 # 健康檢查時間間隔,3秒
lb_algo rr # 負載均衡排程演算法:rr|wrr|lc|wlc|sh|dh|lblc
lb_kind DR # 負載均衡轉發規則:NAT|DR|TUN
# persistence_timeout 5 # 會話保持時間5秒,動態服務建議開啟
protocol TCP # 轉發協議protocol,一般有tcp和udp兩種
real_server 192.168.29.106 3307 {
weight 1 # 權重越大負載分越大,0表示失效
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
Keepalived從機配置
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
}
vrrp_script chk_haproxy {
script "/etc/keepalived/haproxy_check.sh" ## 檢測 haproxy 狀態的指令碼路徑
interval 2 ## 檢測時間間隔
weight 2 ## 如果條件成立,權重+2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 79
priority 90
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.29.101
}
track_script {
chk_haproxy
}
}
# 寫VIP virtual_server,只配置本地機器
virtual_server 192.168.29.101 3307 {# 定義虛擬伺服器,地址與上面的virtual_ipaddress相同
delay_loop 3 # 健康檢查時間間隔,3秒
lb_algo rr # 負載均衡排程演算法:rr|wrr|lc|wlc|sh|dh|lblc
lb_kind DR # 負載均衡轉發規則:NAT|DR|TUN
# persistence_timeout 5 # 會話保持時間5秒,動態服務建議開啟
protocol TCP # 轉發協議protocol,一般有tcp和udp兩種
real_server 192.168.29.107 3307 {
weight 1 # 權重越大負載分越大,0表示失效
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
啟動
[root@localhost keepalived]# service keepalived start
haproxy狀態檢測指令碼
touch /etc/keepalived/haproxy_check.sh
#!/bin/bash
START_HAPROXY="/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg" #haproxy啟動命令
LOG_FILE="/usr/local/keepalived/log/haproxy-check.log" # 日誌檔案
HAPS=`ps -C haproxy --no-header |wc -l` # 檢測haproxy的狀態,0代表未啟動,1已經啟動
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE #在日誌檔案當中記錄檢測時間
echo "check haproxy status" >> $LOG_FILE # 記錄haproxy的狀態
if [ $HAPS -eq 0 ];then #執行haproxy判斷
echo $START_HAPROXY >> $LOG_FILE #記錄啟動命令
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg #啟動haproxy
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
echo "start haproxy failed, killall keepalived" >> $LOG_FILE
killall keepalived
service keepalived stop
fi
fi
測試 網路卡漂移
D:\phpstudy_pro\Extensions\MySQL5.7.26\bin>mysql -h192.168.126.33 -uslave -p1234
5678 -P3307 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 |
+---------------+-------+
D:\phpstudy_pro\Extensions\MySQL5.7.26\bin>mysql -h192.168.126.33 -uslave -p1234
5678 -P3307 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 3 |
+---------------+-------+
D:\phpstudy_pro\Extensions\MySQL5.7.26\bin>mysql -h192.168.126.33 -uslave -p1234
5678 -P3307 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 3 |
+---------------+-------+
本作品採用《CC 協議》,轉載必須註明作者和本文連結