一、Keepalived 簡要介紹
Keepalived 是一種高性能的服務器高可用或熱備解決方案, Keepalived 可以用來防止服務器單點故障的發生,通過配合 Nginx 可以實現 web 前端服務的高可用。
Keepalived 以 VRRP 協議為實現基礎,用 VRRP 協議來實現高可用性(HA)。 VRRP(Virtual RouterRedundancy Protocol)協議是用於實現路由器冗余的協議, VRRP 協議將兩台或多台路由器設備虛擬成一個設備,對外提供虛擬路由器 IP(一個或多個),而在路由器組內部,如果實際擁有這個對外 IP 的路由器如果工作正常的話就是 MASTER,或者是通過算法選舉產生, MASTER 實現針對虛擬路由器 IP 的各種網絡功能,如 ARP 請求, ICMP,以及數據的轉發等;其他設備不擁有該虛擬 IP,狀態是 BACKUP,除了接收 MASTER 的VRRP 狀態通告信息外,不執行對外的網絡功能。當主機失效時, BACKUP 將接管原先 MASTER 的網絡功能。VRRP 協議使用多播數據來傳輸 VRRP 數據, VRRP 數據使用特殊的虛擬源 MAC 地址發送數據而不是自身網卡的 MAC 地址, VRRP 運行時只有 MASTER 路由器定時發送 VRRP 通告信息,表示 MASTER 工作正常以及虛擬路由器 IP(組), BACKUP 只接收 VRRP 數據,不發送數據,如果一定時間內沒有接收到 MASTER 的通告信息,各 BACKUP 將宣告自己成為 MASTER,發送通告信息,重新進行 MASTER 選舉狀態。
二、方案規划
VIP IP 主機名 Nginx端口 默認主從
192.168.50.130 192.168.50.133 zhuang133 80 MASTER
192.168.50.130 192.168.50.134 zhuang134 80 BACKUP
CentOS 7
三、安裝Nginx
1、安裝Nginx
yum install nginx
2、修改 Nginx 歡迎首頁內容(用於后面測試, 用於區分兩個節點的 Nginx):
# vi /usr/local/nginx/html/index.html
192.168.50.133 中的標題加 1
<h1>Welcome to nginx! 1</h1>
192.168.50.134 中的標題加 2
<h1>Welcome to nginx! 2</h1>
3、關閉防火牆和selinux
systemctl stop firewalld.service
setenfore 0
4、啟動 Nginx
systemctl start nginx
5、 設置 Nginx 開機啟動
systemctl enable nginx
6、 分別訪問兩個 Nginx
四、安裝 Keepalived
1、 解壓安裝
yum install keepalived -y
2、 修改 Keepalived 配置文件
(1) MASTER 節點配置文件(192.168.50.133)
# vi /etc/keepalived/keepalived.conf
global_defs { ## keepalived 自帶的郵件提醒需要開啟 sendmail 服務。 建議用獨立的監控或第三方 SMTP router_id LVS_DEVEL } ## keepalived 會定時執行腳本並對腳本執行的結果進行分析,動態調整 vrrp_instance 的優先級。如果腳本執行結果為 0,並且 weight 配置的值大於 0,則優先級相應的增加。如果腳本執行結果非 0,並且 weight配置的值小於 0,則優先級相應的減少。其他情況,維持原本配置的優先級,即配置文件中 priority 對應的值。 vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" ## 檢測 nginx 狀態的腳本路徑 interval 2 ## 檢測時間間隔 weight -20 ## 如果條件成立,權重-20 } ## 定義虛擬路由, VI_1 為虛擬路由的標示符,自己定義名稱 vrrp_instance VI_1 { state MASTER ## 主節點為 MASTER, 對應的備份節點為 BACKUP interface eth0 ## 綁定虛擬 IP 的網絡接口,與本機 IP 地址所在的網絡接口相同, 我的是 eth0 virtual_router_id 33 ## 虛擬路由的 ID 號, 兩個節點設置必須一樣, 可選 IP 最后一段使用, 相同的 VRID 為一個組,他將決定多播的 MAC 地址 priority 100 ## 節點優先級, 值范圍 0-254, MASTER 要比 BACKUP 高 nopreempt ## 優先級高的設置 nopreempt 解決異常恢復后再次搶占的問題 advert_int 1 ## 組播信息發送間隔,兩個節點設置必須一樣, 默認 1s ## 設置驗證信息,兩個節點必須一致 authentication { auth_type PASS auth_pass 1111 ## 真實生產,按需求對應該過來 } ## 將 track_script 塊加入 instance 配置塊 track_script { chk_nginx ## 執行 Nginx 監控的服務 } # # 虛擬 IP 池, 兩個節點設置必須一樣 virtual_ipaddress { 192.168.50.130 ## 虛擬 ip,可以定義多個 } }
(2)BACKUP 節點配置文件(192.168.50.134)
# vi /etc/keepalived/keepalived.conf global_defs { router_id LVS_DEVEL } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight -20 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 33 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168.50.130 } }
chmod 755 /etc/keepalived/nginx_check.sh
3、 編寫 Nginx 狀態檢測腳本
編寫 Nginx 狀態檢測腳本 /etc/keepalived/nginx_check.sh (已在 keepalived.conf 中配置)腳本要求:如果 nginx 停止運行,嘗試啟動,如果無法啟動則殺死本機的 keepalived 進程, keepalied將虛擬 ip 綁定到 BACKUP 機器上。 內容如下:
vi /etc/keepalived/chk_nginx.sh #!/bin/bash A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then systemctl start nginx sleep 2 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then systemctl stop keepalived.service fi fi
保存后,給腳本賦執行權限: # chmod +x /etc/keepalived/nginx_check.sh
4、 啟動 Keepalived systemctl start keepalived.service 5、 Keepalived+Nginx 的高可用測試 同時啟動192.168.50.133和192.168.50.134上的Nginx和Keepalived,我們通過VIP(192.168.50.130)來訪問Nginx,如下 
5.1 我們關閉192.168.50.133上的Keepalived和Nginx systemctl stop keepalived.service systemctl stop nginx 此時,再通過VIP(192.168.50.130)來訪問Nginx,如下 
5.2 我們再開啟192.168.50.133上的Keepalived和Nginx:
systemctl start keepalived.service
systemctl start nginx
因為我們寫了腳本nginx_check.sh,這個腳本會為我們自動啟動Nginx。 此時,我們通過VIP(192.168.50.130)來訪問Nginx,如下
至此,Keepalived + Nginx 實現高可用 Web 負載均衡搭建完畢。