使用Keepalived配置主從熱備實現Nginx高可用(HA)

 

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 選舉狀態。

Keepalived + Nginx 方案圖

Nginx相關環境基於上篇Nginx安裝博客的配置;前端

Keepalived 安裝

經過yum安裝:linux

yum install -y keepalived

耐心等待安裝完畢。nginx

安裝完畢後 會生成 /etc/keepalived 目錄web

相關命令:算法

service keepalived start #啓動服務 service keepalived stop #中止服務 service keepalived restart #重啓服務 

Keepalived 配置

防火牆添加arrp組播規則,或關閉防火牆 bash

 iptables:服務器

vi /etc/sysconfig/iptables -A INPUT -p vrrp -d 224.0.0.18/32 -j ACCEPT

firewall:網絡

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp4s0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT firewall-cmd --reload

關閉selinux:(此處包含一個無敵天坑:若是不關閉此項,配置成功後關掉keepalived服務vip會正常切換,但若關閉服務器vip則不會切換,媽的坑了很久。。。)性能

vi /etc/sysconfig/selinux #修改: SELINUX=disabled #setenforce 0

keepalived 的全部功能都是經過配置 keepalived.conf文件來實現的。測試

建議備份一下keepalived.conf文件從新添加一個新文件填寫或者清空keepalived.conf文件從新填寫。

搶佔模式配置

紅色字體爲不一樣配置

Master節點:

global_defs { router_id nginx_01 #標識本節點的名稱,一般爲hostname } ## keepalived會定時執行腳本並對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。 ##若是腳本執行結果爲0,而且weight配置的值大於0,則優先級相應的增長。若是腳本執行結果非0, ##而且weight配置的值小於 0,則優先級相應的減小。其餘狀況,維持本來配置的優先級,即配置文件中priority對應的值。 vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 #每2秒檢測一次nginx的運行狀態 weight -20  #失敗一次,將本身的優先級-20 } vrrp_instance VI_1 { state MASTER # 狀態,主節點爲MASTER,備份節點爲BACKUP interface eno16777736 # 綁定VIP的網絡接口,經過ip add查看本身的網絡接口 virtual_router_id 51 # 虛擬路由的ID號,兩個節點設置必須同樣,可選IP最後一段使用,相同的VRID爲一個組,他將決定多播的MAC地址 mcast_src_ip 192.168.60.131 # 本機IP地址(80端口已配置好nginx) priority 100                  # 節點優先級,值範圍0~254,MASTER要比BACKUP高 advert_int 1 # 組播信息發送時間間隔,兩個節點必須設置同樣,默認爲1秒 # 設置驗證信息,兩個節點必須一致 authentication { auth_type PASS auth_pass 1111 } # 虛擬IP,兩個節點設置必須同樣。能夠設置多個,一行寫一個 virtual_ipaddress { 192.168.60.200 } track_script { chk_nginx # nginx存活狀態檢測腳本 } }

BackUp 節點:

global_defs { router_id nginx_02 #標識本節點的名稱,一般爲hostname } ## keepalived會定時執行腳本並對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。 ##若是腳本執行結果爲0,而且weight配置的值大於0,則優先級相應的增長。若是腳本執行結果非0, ##而且weight配置的值小於 0,則優先級相應的減小。其餘狀況,維持本來配置的優先級,即配置文件中priority對應的值。 vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 #每2秒檢測一次nginx的運行狀態 weight -20  #失敗一次,將本身的優先級-20 } vrrp_instance VI_1 { state BACKUP # 狀態,主節點爲MASTER,備份節點爲BACKUP interface eno16777736 # 綁定VIP的網絡接口,經過ip add查看本身的網絡接口 virtual_router_id 51 # 虛擬路由的ID號,兩個節點設置必須同樣,可選IP最後一段使用,相同的VRID爲一個組,他將決定多播的MAC地址 mcast_src_ip 192.168.60.133 # 本機IP地址(80端口已配置nginx) priority 90                  # 節點優先級,值範圍0~254,MASTER要比BACKUP高 advert_int 1 # 組播信息發送時間間隔,兩個節點必須設置同樣,默認爲1秒 # 設置驗證信息,兩個節點必須一致 authentication { auth_type PASS auth_pass 1111 } # 虛擬IP,兩個節點設置必須同樣。能夠設置多個,一行寫一個 virtual_ipaddress { 192.168.60.200 } track_script { chk_nginx # nginx存活狀態檢測腳本 } }

建立nginx服務檢測腳本

分別在主備服務器/etc/keepalived目錄下建立nginx_check.sh腳本,併爲其添加執行權限chmod +x /etc/keepalived/nginx_check.sh

用於keepalived定時檢測nginx的服務狀態,若是nginx中止了,會嘗試從新啓動nginx,若是啓動失敗,會將keepalived進程殺死,將vip漂移到備份機器上。

#!/bin/bash A=`ps -C nginx --no-header | wc -l` if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx #嘗試從新啓動nginx sleep 2 #睡眠2秒 if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        killall keepalived #啓動失敗,將keepalived服務殺死。將vip漂移到其它備份節點 fi
fi

配置完畢,分別啓動主從服務器keepalived服務

service keepalived start ps aux | grep keepalived

兩節點的啓動狀況

查看vip綁定狀況

ip add

主節點:

BackUp節點:

測試vip漂移

中止Master上的keepalived服務

BackUp節點:

從新開啓Master的keepalived服務再次看下vip綁定狀況:

 

BackUp:

實現搶佔式配置。

非搶佔模式

Master 節點修改配置文件:

global_defs { router_id nginx_01 #標識本節點的名稱,一般爲hostname } ## keepalived會定時執行腳本並對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。 ##若是腳本執行結果爲0,而且weight配置的值大於0,則優先級相應的增長。若是腳本執行結果非0, ##而且weight配置的值小於 0,則優先級相應的減小。其餘狀況,維持本來配置的優先級,即配置文件中priority對應的值。 vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 #每2秒檢測一次nginx的運行狀態 weight -20  #失敗一次,將本身的優先級-20 } vrrp_instance VI_1 { state MASTER # 狀態,主節點爲MASTER,備份節點爲BACKUP interface eno16777736 # 綁定VIP的網絡接口,經過ifconfig查看本身的網絡接口 virtual_router_id 51 # 虛擬路由的ID號,兩個節點設置必須同樣,可選IP最後一段使用,相同的VRID爲一個組,他將決定多播的MAC地址 mcast_src_ip 192.168.60.131 # 本機IP地址 priority 100                  # 節點優先級,值範圍0~254,MASTER要比BACKUP高 advert_int 1 # 組播信息發送時間間隔,兩個節點必須設置同樣,默認爲1秒  #非搶佔式 nopreempt # 設置驗證信息,兩個節點必須一致 authentication { auth_type PASS auth_pass 1111 } # 虛擬IP,兩個節點設置必須同樣。能夠設置多個,一行寫一個 virtual_ipaddress { 192.168.60.200 } track_script { chk_nginx # nginx存活狀態檢測腳本 } }

BackUp節點修改配置文件:

global_defs { router_id nginx_02 #標識本節點的名稱,一般爲hostname } ## keepalived會定時執行腳本並對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。 ##若是腳本執行結果爲0,而且weight配置的值大於0,則優先級相應的增長。若是腳本執行結果非0, ##而且weight配置的值小於 0,則優先級相應的減小。其餘狀況,維持本來配置的優先級,即配置文件中priority對應的值。 vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 #每2秒檢測一次nginx的運行狀態 weight -20  #失敗一次,將本身的優先級-20 } vrrp_instance VI_1 { state BACKUP # 狀態,主節點爲MASTER,備份節點爲BACKUP interface eno16777736 # 綁定VIP的網絡接口,經過ifconfig查看本身的網絡接口 virtual_router_id 51 # 虛擬路由的ID號,兩個節點設置必須同樣,可選IP最後一段使用,相同的VRID爲一個組,他將決定多播的MAC地址 mcast_src_ip 192.168.60.133 # 本機IP地址 priority 100                  # 節點優先級,值範圍0~254,MASTER要比BACKUP高 advert_int 1 # 組播信息發送時間間隔,兩個節點必須設置同樣,默認爲1秒  #非搶佔式 nopreempt # 設置驗證信息,兩個節點必須一致 authentication { auth_type PASS auth_pass 1111 } # 虛擬IP,兩個節點設置必須同樣。能夠設置多個,一行寫一個 virtual_ipaddress { 192.168.60.200 } track_script { chk_nginx # nginx存活狀態檢測腳本 } }

紅色爲修改部分,從中可看出backup節點須要把優先級設置與master節點同樣。

重啓兩個節點的keepalived服務,再次斷開Master節點keepalived服務,vip漂移到BackUp節點,而後再開啓Master節點keepalived服務:

Master:

 

BackUp:

 Master沒有搶佔過去,非搶佔式配置成功。

最後看下keepalived與nginx的配置成果:

相關文章
相關標籤/搜索