Nginx + keepalived
keepalived 簡介
Keepalived是一個基於VRRP協議來實現的服務高可用方案,可以利用其來避免IP單點故障,類似的工具還有heartbeat、corosync、pacemaker。但是它一般不會單獨出現,而是與其它負載均衡技術(如lvs、haproxy、nginx)一起工作來達到集羣的高可用。
VRRP 協議
VRRP全稱 Virtual Router Redundancy Protocol,即 虛擬路由冗餘協議。可以認爲它是實現路由器高可用的容錯協議,即將N臺提供相同功能的路由器組成一個路由器組(Router Group),這個組裏面有一個master和多個backup,但在外界看來就像一臺一樣,構成虛擬路由器,擁有一個虛擬IP(vip,也就是路由器所在局域網內其他機器的默認路由)。
佔有這個IP的master實際負責ARP相應和轉發IP數據包,組中的其它路由器作爲備份的角色處於待命狀態。master會發組播消息,當backup在超時時間內收不到vrrp包時就認爲master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master,保證路由器的高可用。
Nginx + keepalived
服務器架構
主(master) VIP 備(backup)
192.168.1.17 192.168.1.181 192.168.1.19
-
安裝 keepalived
主、備服務器上分別安裝、啓動 keepalived,並設置開機啓動。
$ yum install -y keepalived
$ systemctl start keepalived
$ systemctl enable keepalived -
修改 keepalived 配置文件
主、備服務器分別修改配置文件,注意state要填寫對應節點身份,interface要對應真實網卡,priority數值要能反映主備優先級,virtual_router_id 、authentication、virtual_ipaddress配置項要一致。
修改完以後記得重啓服務
$ vim /etc/keepalived/keepalived.conf! Configuration File for keepalived vrrp_instance VI_1 { state MASTER #標識爲主服務器(BACKUP) interface em1 #對應網卡 virtual_router_id 51 #id 號,主、備要一致 priority 100 #優先級,主要比備小;有多個備時,優先級高的接管 advert_int 1 authentication { auth_type PASS auth_pass 1111 #主、備一致 } virtual_ipaddress { 192.168.1.181 #定義vip } }
-
Nginx 主頁
yum 安裝 Nginx ,分別修改主、備服務器的 Nginx頁面。
$ yum install nginx
$ vim /usr/share/nginx/html/index.html
修改以後主、備頁面如下:
-
VIP 偏移
主、備服務器均開啓 keepalived,查看主網卡信息,發現 vip 在主服務器上:
em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 44:a8:42:2b:08:1f brd ff:ff:ff:ff:ff:ff
inet 192.168.1.17/24 brd 192.168.1.255 scope global noprefixroute em1
valid_lft forever preferred_lft forever
inet 192.168.1.181/32 scope global em1
valid_lft forever preferred_lft forever
inet6 fe80::46a8:42ff:fe2b:81f/64 scope link
打開nginx頁面,結果如下:顯示的內容是主服務器的網頁信息。
關閉主服務器上的 keepalived,查看備服務器日誌,發現,vip已經偏移。
Mar 28 10:36:38 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Transition to MASTER STATE
Mar 28 10:36:39 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Entering MASTER STATE
Mar 28 10:36:39 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) setting protocol VIPs.
Mar 28 10:36:39 compute7 Keepalived_healthcheckers[143498]: Netlink reflector reports IP 192.168.1.181 added
Mar 28 10:36:39 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Sending gratuitous ARPs on em1 for 192.168.1.181
Mar 28 10:36:44 compute7 Keepalived_vrrp[143499]: VRRP_Instance(VI_1) Sending gratuitous ARPs on em1 for 192.168.1.181
查看備網卡信息:181已經偏移到備服務器
em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 18:66:da:f2:44:34 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.19/24 brd 192.168.1.255 scope global em1
valid_lft forever preferred_lft forever
inet 192.168.1.181/32 scope global em1
valid_lft forever preferred_lft forever
inet6 fe80::1a66:daff:fef2:4434/64 scope link
valid_lft forever preferred_lft forever
查看 Nginx 主頁:發現顯示的信息已經是備服務器
-
Nginx 檢查腳本
該腳本檢測 nginx 的運行狀態,並在 nginx 進程不存在時嘗試重啓 nginx,如果重啓失敗則停止 keepalived,準備讓其他機器接管。
#!/bin/bash
counter={counter}" = “0” ];then
/usr/sbin/nginx
sleep 2
counter={counter}" = “0” ];then
systemctl stop keepalived
fi
fi
修改主上 keepalived 配置文件,添加監控腳本。注意: interval 要比nginx監控腳本數值要大,不然會報錯 exited due to signal 15。
查看 /var/log/messages 發現:
WARNING – default user ‘keepalived_script’ for script execution does not exist – please create
解決辦法:在 chk_nginx 腳本下添加執行用戶 user root 配置項。
! Configuration File for keepalivedvrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" #腳本位置 interval 4 #腳本執行間隔(要大於檢測腳本時間間隔) weight -2 #檢測失敗則優先級-2 fall 2 #檢測兩次失敗纔算失敗 rise 1 #檢測一次成功就成功 user root #腳本執行用戶 } vrrp_instance VI_1 { state MASTER interface em1 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.181 } track_script { #實例中添加要執行的腳本 chk_nginx } }
日誌文件位置 /var/log/messages
-
檢測腳本是否成功
- 主服務器,關閉主 Nginx進程,看能否成功啓動。
$ pkill nginx
打開頁面發現成功調用健康檢查腳本、啓動了 Nginx,測試成功。
- 主服務器, Nginx重啓失敗,看 VIP 是否偏移。(爲了測試方便,這裏我們可以通過修改健康檢查腳本里的參數,故意寫錯參數)
- 主服務器,關閉主 Nginx進程,看能否成功啓動。