Haproxy+Keepalived主備模式
主備節點設置
- 主備節點上各安裝配置haproxy,配置內容且要相同
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
defaults #defaults段默認值對frontend和backend和listen段生效
mode http #運行模式為http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8 #添加客戶端真實ip地址
option redispatch # #如果后端有服務器宕機,強制切換到正常服務器
retries 3 #三次連接失敗,則判斷服務不可用
timeout http-request 10s #請求超時時間
timeout connect 10s #連接超時
timeout client 1m #客戶端超時
timeout server 1m #服務端超時
timeout http-keep-alive 10s #長連接超時時間
timeout check 10s 檢查超時時間
maxconn 3000 每個進程最大連接數
frontend web :80 #自定義一個web靜態頁面匹配前端
acl url_html path_beg -i /
acl url_html path_end -i .html
use_backend website if url_html #如果符合匹配就使用website的后端主機
frontend imgs :80 #自定義一個圖片匹配前端
acl url_img path_beg -i /
acl url_img path_end -i .jpg .png .jpeg .gif
use_backend img if url_img #如果符合匹配就使用img后端主機
backend img #定義后端主機組 img
server img1 192.168.214.135:80 check
backend website #定義后端主機組website
server html1 192.168.214.133:80 check
server html2 192.168.214.135:80 check
haproxy開啟日志記錄
日志定義在haproxy的配置文件中已經說明了,haproxy使用rsyslog服務記錄日志,需要在rsyslog日志服務中定義:
vim /etc/rsyslog.conf
$ModLoad imudp #取消注釋 ,使用udp傳輸日志
$UDPServerRun 514 #取消注釋 ,使用udp傳輸日志
local2.* /var/log/haproxy.log #按照配置文件里提示寫即可
注意:上面必須要選擇使用tcp或udp方式傳輸日志,如果不選擇光定義日志路徑是不生效的
定義master節點的keepalived配置
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.214.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_iptables #禁止keepalived啟動生成默認的iptables規則
vrrp_mcast_group4 224.17.17.17 #定義主備節點通過組播地址進行通告狀態
}
vrrp_script chk_down {
script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 1 || exit 0"
interval 1
weight -10
}
vrrp_script chk_haproxy { #調用外部的輔助腳本進行資源監控,並根據監控的結果狀態能實現優先動態調整
script "/usr/bin/killall -0 haproxy && exit 0 || exit 1"
#script指令:先定義一個執行腳本,如果腳本執行結果狀態為0則不操作后續步奏,如果狀態為非0,則執行相應的操作
interval 1 #每秒檢查執行一次
weight -10 #如果腳本執行結果為非0 ,則keepalived的優先級減去10
fall 2 #如果連續兩次檢測為錯誤狀態則認為服務部可用
rise 1 #檢測一次成功就認為服務正常
}
vrrp_instance VI_1 { #配置虛擬路由實例
state MASTER #定義該節點為MASTER節點
interface ens33 #定義VIP綁定的物理網卡
virtual_router_id 55 #設置虛路由擬路由id,同一集群的節點群必須相同
priority 100 #設定優先級
advert_int 1 #設定master與backup之間vrrp通告的時間間隔,單位是秒
# nopreempt #設定keepalived的切換模式,默認是搶占failover,這里是非搶占,沒有啟用
authentication { #定義驗證方式與密碼
auth_type PASS
auth_pass 12345678 #密碼最長8位
}
virtual_ipaddress { #定義虛擬路由IP,也是對外接收請求的ip
192.168.214.100
}
track_script { #用於追蹤腳本執行狀態,定義在vrrp_instance段中
chk_down
chk_haproxy
}
}
定義BACKUP節點Keepalived配置
BACKUP節點與MASTER節點定義大致相同,只有BACKUP節點的角色,優先級需要修改,其他都不需要改動
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.214.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_iptables
vrrp_mcast_group4 224.17.17.17
}
vrrp_script chk_down {
script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 1 || exit 0"
interval 1
weight -10
}
vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy && exit 0 || exit 1"
interval 1
weight -10
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 55
priority 95
advert_int 1
# nopreempt
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
192.168.214.100
}
track_script {
chk_down
chk_haproxy
}
}
雙主模式配置
在上面配置的基礎上,只要在各節點新建一個vrrp_instance VI_2 實例即可,在原來的MASTER節點定義第二個實例的為BACKUP角色,在原來的BACKUP節點再添加一個新的實例為MASTER,設置另一個虛擬路由實例的VIP為:192.168.214.200
vrrp_instance VI_2配置
最終在上面原來的MASTER節點配置如下(添加了最后一段vrrp_instance VI_2的定義)
[root@node-1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.214.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_iptables
vrrp_mcast_group4 224.17.17.17
}
vrrp_script chk_down { #定義vrrp_instance VI_1實例的檢測文件
script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 1 || exit 0"
interval 1
weight -10
}
vrrp_script chk_node2 { #定義vrrp_instance VI_2實例的檢測文件
script "/bin/bash -c '[[ -f /etc/keepalived/nodedown ]]' && exit 1 || exit 0"
interval 1
weight -10
}
vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy && exit 0 || exit 1"
interval 1
weight -10
fall 2
rise 1
}
#高可用組1
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 55
priority 100
advert_int 1
# nopreempt
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
192.168.214.100
}
track_script {
chk_down
chk_haproxy
}
}
#高可用組2
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 33
priority 95
advert_int 1
# nopreempt
authentication {
auth_type PASS
auth_pass 87654321
}
virtual_ipaddress {
192.168.214.200
}
track_script {
chk_node2
chk_haproxy
}
}
最終在上面原來的BACKUP節點配置如下(添加了最后一段vrrp_instance VI_2的定義)
[root@node-2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.214.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_iptables
vrrp_mcast_group4 224.17.17.17
}
vrrp_script chk_down {
script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 1 || exit 0"
interval 1
weight -10
}
vrrp_script chk_node2 {
script "/bin/bash -c '[[ -f /etc/keepalived/nodedown ]]' && exit 1 || exit 0"
interval 1
weight -10
}
vrrp_script chk_haproxy {
script "/usr/bin/killall -0 haproxy && exit 0 || exit 1"
interval 1
weight -10
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 55
priority 95
advert_int 1
# nopreempt
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
192.168.214.100
}
track_script {
chk_down
chk_haproxy
}
}
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 33
priority 100
advert_int 1
# nopreempt
authentication {
auth_type PASS
auth_pass 87654321
}
virtual_ipaddress {
192.168.214.200
}
track_script {
chk_node2
chk_haproxy
}
}
雙主節點配置時要注意的地方
配置配置文件中有如下兩段檢測內容:
vrrp_script chk_down {
script "/bin/bash -c '[[ -f /etc/keepalived/down ]]' && exit 1 || exit 0"
interval 1
weight -10
}
vrrp_script chk_node2 {
script "/bin/bash -c '[[ -f /etc/keepalived/nodedown ]]' && exit 1 || exit 0"
interval 1
weight -10
}
這兩段配置的作用是通過判斷指定的路徑下有無指定的文件來進行調整keepalived的優先級,從而可以實現不關閉服務就可以隨時調整高可用的負載節點主備狀態切換,這樣可以方便服務的配置修改等操作。
上面的兩段配置分別是針對兩個 vrrp_instance 實例的配置,讓兩個不同的節點分別去檢測不同的文件名,如果同時去檢測同一個文件,會造成混亂。
另外一個就是,在主備節點設置優先級的時候,要確保當MASTER節點降級后的優先級要比BACKUP的優先級低,否則,VIP是無法進行漂移的。
上面的配置實驗都正常,包括圖片與頁面的分離負載,主備節點的切換,和雙主模式下的各主備節點切換