nginx+keepalived高可用配置筆記
阿新 • • 發佈:2021-07-14
一、nginx安裝
略
二、keepalived安裝
2.1 解壓
tar -zxvf keepalived-2.2.2.tar.gz
mv keepalived-2.2.2 /opt/
2.2 編譯安裝
# 設定安裝目錄
./configure --prefix=/usr/local/keepalived
# 編譯
make
# 安裝
make install
2.3 拷貝配置檔案,重要
安裝完成後,進入安裝目錄的etc目錄下,將keepalived相應的配置檔案拷貝到系統相應的目錄當中。keepalived啟動時會從/etc/keepalived目錄下查詢keepalived.conf配置檔案。
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived
三、keepalived配置
3.1 killall指令安裝包
在配置nginx檢查指令碼用得到。
yum install -y psmisc
注意:killall指令中
-0
是用來發送測試訊號的,不會殺死程序。-9
是強制殺死程序,慎用。
3.2 keepalived主要配置
主要配置位於/etc/keepalived/keepalived.conf
檔案。
主節點:如果需要主節點恢復後VIP漂移回來,需要state MASTER
如果不需要搶佔,則可以都設定為BACKUP節點,一旦故障轉移,就按權重選取MASTER,初始時,先啟動的為主節點。
# 全域性配置 global_defs { notification_email { [email protected] #設定報警收件人郵件地址,可以設定多個,每行一個。需要開啟sendmail服務。 } notification_email_from [email protected] #發件人 smtp_server smtp.qq.com #設定SMTP Server地址 smtp_connection_timeout 30 #設定SMTP Server的超時時間 router_id nginx_master #表示執行Keepalived伺服器的一個標識,唯一的 } #檢測指令碼 vrrp_script chk_http_port { # script "killall -0 nginx" # 這個指令碼只做訊號檢查,功能弱了一些,一般都自定義指令碼 script "/usr/local/keepalived/sbin/check_nginx.sh" #心跳執行的指令碼,檢測nginx是否啟動 interval 2 #(檢測指令碼執行的間隔,單位是秒) weight -2 #權重 } #vrrp 例項定義部分 vrrp_instance VI_1 { state BACKUP # 指定keepalived的角色,MASTER為主,BACKUP為備 說明:可以都設定為BACKUP,先啟動為主,然後nopreempt才能有效 interface ens33 # 當前進行vrrp通訊的網路介面卡(當前centos的網絡卡) 用ifconfig檢視你具體的網絡卡 virtual_router_id 66 # 虛擬路由編號,主從要一致 priority 100 # 優先順序,數值越大,獲取處理請求的優先順序越高 advert_int 1 # 檢查間隔,預設為1s(vrrp組播週期秒數) nopreempt # 設定為不搶佔,說明:這個配置只能在BACKUP主機上面設定 #授權訪問 authentication { auth_type PASS #設定驗證型別和密碼,MASTER和BACKUP必須使用相同的密碼才能正常通訊 auth_pass 1111 } track_script { chk_http_port #(呼叫檢測指令碼) } virtual_ipaddress { 192.168.44.100 # 定義虛擬ip(VIP),可多設,每行一個 } }
從節點:只需重設部分引數
router_id nginx_backup01
state BACKUP # 如果是多主情況,這裡都是BACKUP
priority 99 # 多個從節點,優先順序依次降低
例:
# 全域性配置
global_defs {
notification_email {
[email protected] #設定報警郵件地址,可以設定多個,每行一個。需要開啟sendmail服務。
}
notification_email_from [email protected]
smtp_server smtp.qq.com #設定SMTP Server地址
smtp_connection_timeout 30 #設定SMTP Server的超時時間
router_id nginx_backup01 #表示執行Keepalived伺服器的一個標識,唯一的
}
#檢測指令碼
vrrp_script chk_http_port {
# script "killall -0 nginx"
script "/usr/local/keepalived/sbin/check_nginx.sh" #心跳執行的指令碼,檢測nginx是否啟動
interval 2 #(檢測指令碼執行的間隔,單位是秒)
weight -2 #權重
}
#vrrp 例項定義部分
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色,MASTER為主,BACKUP為備
interface ens33 # 當前進行vrrp通訊的網路介面卡(當前centos的網絡卡) 用ifconfig檢視你具體的網絡卡
virtual_router_id 66 # 虛擬路由編號,主從要一直
priority 99 # 優先順序,數值越大,獲取處理請求的優先順序越高
advert_int 1 # 檢查間隔,預設為1s(vrrp組播週期秒數)
nopreempt # 非搶佔式
#授權訪問
authentication {
auth_type PASS #設定驗證型別和密碼,MASTER和BACKUP必須使用相同的密碼才能正常通訊
auth_pass 1111
}
track_script {
chk_http_port #(呼叫檢測指令碼)
}
virtual_ipaddress {
192.168.44.100 # 定義虛擬ip(VIP),可多設,每行一個
}
}
3.3 檢測指令碼
check_nginx.sh指令碼根據生產環境要求調整,重要的是要返回結果值,正常為0,錯誤為1
#!/bin/bash
# 檢測nginx是否啟動
A=`ps -C nginx --no-header |wc -l`
result=0
if [ $A -eq 0 ];then #如果nginx沒有啟動就啟動nginx
/usr/local/nginx/sbin/nginx #重啟nginx
sleep 2
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then #nginx重啟失敗,則停掉keepalived服務,進行VIP轉移
killall keepalived
result=1
fi
fi
# keepalived根據返回值增減權重
exit $result
3.4 新增防火牆規則
因為vrrp使用224.0.0.18
這個組播地址,所以必須新增組播規則或者關閉防火牆,否則會出現腦裂現象。
新增:
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
檢視:
firewall-cmd --direct --get-all-rules
ipv4 filter OUTPUT 0 --out-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
ipv4 filter INPUT 0 --in-interface ens33 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
3.5 啟動keepalived
啟動Keepalived並新增到開機自啟
systemctl start keepalived
systemctl enable keepalived
3.6 檢查vip漂移情況
使用killall keepalived殺掉程序後,可以觀察到vip會根據權重依次漂移。
ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:01:83:24 brd ff:ff:ff:ff:ff:ff
inet 192.168.44.10/24 brd 192.168.44.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.44.100/32 scope global ens33
valid_lft forever preferred_lft forever
四、keepalived高可用原理
keepalived本質與nginx無關係,keepalived只是通過組播實現自身的故障轉移和VIP漂移,它提供了指令碼檢測介面,通過指令碼,我們可以把需要檢測服務用指令碼管理起來,實現服務的故障檢查、轉移、恢復等功能。