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 { [email protected] [email protected] [email protected] } notification_email_from [email protected] 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 {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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 {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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 {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
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是無法進行漂移的。
上面的配置實驗都正常,包括圖片與頁面的分離負載,主備節點的切換,和雙主模式下的各主備節點切換
歡迎訪問個人博客: gudaoyufu.com
haproxy+keepalived主備與雙主模式配置