Keepalived + Nginx 實現高可用


title: “Keepalived + Nginx 實現高可用”

url: “https://wsk1103.github.io/”

tags:

  • 架構
  • Nginx
  • Keepalived

PS: 理解Keepalived

Keepalived + Nginx 實現高可用的思路:

  1. 請求不是直接打到 Nginx 上,而是先通過 Keepalived (虛擬IP,VIP)
  2. Keepalived 應該能監控 Nginx 的生命狀態

流程圖

實現:

  1. 準備至少2臺服務器

IP地址

  • 192.168.134.128(設置爲Master)
  • 192.168.134.129(設置爲BackUp)
  1. 安裝 和啓動 keepalived
    安裝 和啓動 keepalived

  2. 修改 keepalived 配置文件

[root@wsk1103 ~]# vi /etc/keepalived/keepalived.conf
  • 修改Master的配置文件 192.168.134.128

修改之前可以先複製一份備份。

! Configuration File for keepalived

global_defs {
   router_id keepalived_128 #設置keepalived的唯一ID,不能一致,一般可以把本地IP當做唯一ID

}

vrrp_script nginx_check {
    script "/etc/keepalived/nginx_check.sh" #定時檢測nginx狀態的腳步
    interval 2 #每2秒檢測一次
    weight -20 #權重
}

vrrp_instance VI_1 {
    state MASTER #這裏設置爲Master
    interface ens32 #本地網卡名稱,通過 ifconfig 得知
    virtual_router_id 200 #虛擬路由的 ID 號,2個節點的設置必須一致,相同的 VRID 爲一個組,他將決定多播的MAC地址
    priority 50 #節點的優先級,範圍爲 0-254 ,Master的優先級必須必BackUp的高。
    advert_int 1 #組播信息發送的時間間隔,默認爲1s。2個節點的設置必須一致。
    
    #設置賬戶校驗信息,2個節點必須一致。
    authentication { 
        auth_type PASS
        auth_pass 1111
    }
    
    #虛擬IP池,2個節點也必須一致。
    virtual_ipaddress {
        192.168.134.200 #虛擬IP,可以設置多個。
        #192.168.134.201
    }
    
    # 腳本配置,不能寫在 vrrp_script 後面,否則會導致腳本不生效。
    track_script {
        nginx_check
    }
}
  • 修改 BackUp 的配置文件 192.168.134.129
! Configuration File for keepalived

global_defs {
   router_id keepalived_129 #設置keepalived的唯一ID,不能一致,一般可以把本地IP當做唯一ID

}

vrrp_script nginx_check {
    script "/etc/keepalived/nginx_check.sh" #定時檢測nginx狀態的腳步
    interval 2 #每2秒檢測一次
    weight -20 #權重
}

vrrp_instance VI_1 {
    state BACKUP #這裏設置爲 BackUp
    interface ens33 #本地網卡名稱,通過 ifconfig 得知
    virtual_router_id 200 #虛擬路由的 ID 號,2個節點的設置必須一致,相同的 VRID 爲一個組,他將決定多播的MAC地址
    priority 40 #節點的優先級,範圍爲 0-254 ,Master的優先級必須必BackUp的高。
    advert_int 1 #組播信息發送的時間間隔,默認爲1s。2個節點的設置必須一致。
    
    #設置賬戶校驗信息,2個節點必須一致。
    authentication { 
        auth_type PASS
        auth_pass 1111
    }
    
    #虛擬IP池,2個節點也必須一致。
    virtual_ipaddress {
        192.168.134.200 #虛擬IP,可以設置多個。
        #192.168.134.201
    }
    
    # 腳本配置,不能寫在 vrrp_script 後面,否則會導致腳本不生效。
    track_script {
        nginx_check
    }
}

  1. 創建check_nginx 腳本
[root@localhost /]# cd /etc/keepalived/
[root@wsk1103 keepalived]# touch nginx_check.sh
[root@wsk1103 keepalived]# chmod 755 nginx_check.sh 
[root@wsk1103 keepalived]# sh nginx_check.sh
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /usr/sbin/nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        /etc/init.d/keepalived stop
    fi
fi

腳本含義
判斷 Nginx 是否已經啓動(進程 Nginx 的個數 = 0,沒有啓動)。
如果沒有啓動,則啓動 Nginx ,並且延遲2秒後啓動,防止搶佔資源。
再次判斷 Nginx 有沒有成功啓動,如果沒有啓動成功,則 kill 了 keepalived 。

  1. 重啓 keepalived 和查看 IP 綁定情況
[root@wsk1103 keepalived]# service keepalived restart
Redirecting to /bin/systemctl restart keepalived.service
[root@wsk1103 keepalived]# ip addr
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:00:4d:76 brd ff:ff:ff:ff:ff:ff
    inet 192.168.134.128/24 brd 192.168.134.255 scope global noprefixroute dynamic ens32
       valid_lft 1363sec preferred_lft 1363sec
    inet 192.168.134.200/32 scope global ens32    #這裏可以看到VIP已經綁定到對應的網卡。
       valid_lft forever preferred_lft forever
    inet6 fe80::b8c2:db98:5162:2e02/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
  1. 修改 Nginx 的初始頁面 index.htm
[root@localhost keepalived]# cd /usr/share/nginx/html
[root@localhost html]# vi index.html

128 的服務器上,加入 128 的字樣。在 129 的服務器上,加入 129 的字樣

  1. 檢驗

6.1 頁面訪問 192.168.134.200
流程圖

6.2 停止 128 的 keepalived 服務

[root@wsk1103 keepalived]# service keepalived stop
Redirecting to /bin/systemctl stop keepalived.service

可以看到訪問已經轉移到 129 的服務器上了。
流程圖

6.3 重啓 128 的keepalived 服務

[root@wsk1103 keepalived]# service keepalived start
Redirecting to /bin/systemctl start keepalived.service

重啓後,128keepalived 重新接管,繼續做爲 Master
流程圖

6.4 停止 128 的 nginx,觀察 nginx 是否會重新啓動

[root@wsk1103 keepalived]# service nginx stop
Redirecting to /bin/systemctl stop nginx.service
[root@wsk1103 keepalived]# ps -ef |grep nginx
root      21962      1  0 13:27 ?        00:00:00 nginx: master process /usr/sbin/nginx
root      21963  21962  0 13:27 ?        00:00:00 nginx: worker process
root      21965  21962  0 13:27 ?        00:00:00 nginx: worker process
root      21966  21962  0 13:27 ?        00:00:00 nginx: worker process
root      21967  21962  0 13:27 ?        00:00:00 nginx: worker process
root      21974  21321  0 13:27 pts/0    00:00:00 grep --color=auto nginx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章