企業中,某一台'負載均衡服務器'宕機怎么辦?


---部署keepalived<在所有負載均衡服務器上,本文演示效果僅lb01及lb02兩台>
 
部署完可以達到的效果: 
在'啟動keepalived服務的服務器組內某台服務器'上產生一個虛擬ip,產生虛擬ip的服務器前提是能提供正常的外界訪問,若不能,keepalived應及時想辦法找到'可以正常提供訪問的服務器',並在上面產生虛擬ip供外界用戶訪問
<同一組內(本例中lb01,lb02就是同一組)只能定義一個虛擬ip>
假設虛擬ip在lb01負載均衡服務器上,當服務器停止keepalived服務,停止前它會VRRP協議廣播:告訴組內其他成員,根據keepalived配置文件規則,你們其中一台服務器新增虛擬ip,我那個虛擬ip會取消,外界的訪問馬上就到你機器上.
 
外界用戶訪問虛擬ip,訪問的就是虛擬ip所在的服務器;
當lb01負載均衡服務器宕機,虛擬ip會根據配置文件規則自動跳轉到lb02,而兩台服務器的Nginx環境是一樣的,所以用戶的訪問內容不會有變化,用戶也不會覺得服務端有服務器被切換
 
要點: 提供同一服務的負載均衡服務器是一組,一組內負載均衡服務器服務器的'Ngn環境'要一模一樣
Ngn環境: 安裝方式,配置模塊,配置文件
 
 
 
 
1-1 安裝軟件(負載均衡服務器都要安裝)
[root@lb01 ~]#  yum install keepalived -y
[root@lb02 ~]#  yum install keepalived -y
 
編輯所有"負載均衡服務器"配置文件
 
1-21 編輯lb01配置文件
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
 
注意:以下為最終配置文件(重要)
! Configuration File for keepalived
 
 
# 全局配置
global_defs {
  # 當前服務器中keepalived唯一標識,同一組只能有唯一的lb01<名字>
  router_id lb01
}
 
 
# 檢測腳本:檢測到Nginx服務停止時,重啟Nginx再檢測,再異常則停止keepalived服務
  # check_nginx: 起的名字
vrrp_script check_nginx {
    # 指定腳本路徑,checkNG.sh是創建的腳本名
    script "/etc/keepalived/checkNG.sh"
    # 執行腳本時間間隔sec
    interval 5
}
 
 
# 配置VRRP協議
vrrp_instance VI_1 {
  
  # 非搶占式設置1: 狀態改為BACKUP
  # 狀態: MASTER和BACKUP
  state BACKUP
  # 非搶占式設置2 執行開啟動作
  nopreempt
 
 
  # 綁定網卡
  interface eth0
 
 
  # 虛擬路由標識,可以理解為分組
  virtual_router_id 50
 
 
  # 優先級- 數字大小表示
  priority 90
 
 
  # VRRP協議廣播時間間隔 sec,下面含義: 每隔1sec廣播一次
  advert_int 1
 
 
  # keepalived身份認證,通過密碼認證,則證明其是同一個分組
  authentication {
    # 認證類型
    auth_type PASS
    # 認證密碼
    auth_pass 1111
  }
  
  # 設置虛擬ip-此ip跳轉到哪台'負載均衡服務器',則哪台'負載均衡服務器'開始工作
  virtual_ipaddress {
    # 設置的虛擬ip要是當前'負載均衡服務器'綁定網卡所在的網段內;當前綁定網卡是eth0,上邊有寫
      # 虛擬ip即公共ip
    192.168.15.55
  }
  
  # 調用上邊檢測'Nginx服務狀態'的腳本,也可叫腳本啟動開關
  track_script {
       check_nginx
  }
}

 

 
1-22 編輯其他配置文件
編輯lb02配置文件
[root@lb01 ~]# scp /etc/keepalived/keepalived.conf root@192.168.15.6:/etc/keepalived/
 
修改點1 改名字
 
修該點2 改為BACKUP
 
修改點3 比lb01小即可
 
 
1-3 啟動並開機自啟
[root@lb01 ~]# systemctl enable --now keepalived
[root@lb02 ~]# systemctl enable --now keepalived
 
 
1-4 查看新增虛擬ip(專業叫VIP)<最終版到此結束,在瀏覽器輸入虛擬ip測試能否訪問>
[root@lb01 ~]# ip a
[root@lb02 ~]# ip a
 
1-5 驗證虛擬ip自動切換到'keepalived服務處於活動狀態'的服務器
停止lb01keepalived活動狀態
[root@lb01 ~]# systemctl stop keepalived
查看lb02ip
[root@lb02 ~]# ip a
發現配置文件中虛擬ip被新增到此處,那么驗證了虛擬ip自動切換
 
 
1-6 輸入虛擬ip192.168.15.55可以實現訪問 - 外界用戶就是通過此ip所對應的域名訪問的
 
[root@lb02 conf.d]#  systemctl stop keepalived
 
 
 
2 ---Nginx宕機怎么辦?
背景結論:虛擬ip所在的負載均衡服務器的Nginx服務停止后,虛擬ip沒有自動跳轉,外界用戶訪問失敗
解決辦法:
想辦法告訴keepalived,當Nginx異常時,讓其自動關閉keepalived服務
step2-1 新增可執行腳本-Nginx服務宕機后,停止keepalived服務
step2-2 將腳本文件的路徑和啟動開關添加到keepalived配置文件,實現自動化檢測,並做對應處理
背景1 同一組的服務器的keepalived都處於活動狀態
背景2 查看虛擬ip所在機器
[root@lb01 conf.d]# ip a
背景3 
[root@lb01 conf.d]# systemctl stop nginx
[root@lb01 conf.d]# systemctl status nginx
背景4 訪問虛擬ip
發現無法訪問,說明虛擬ip在此服務器上沒有跳轉
背景5 驗證虛擬ip沒有跳轉
[root@lb01 conf.d]# ip a
 
 
解決步驟
 
step2-1 新增可執行腳本-Nginx服務宕機后,停止keepalived服務
 
2-11
腳本要創建在keepalived的配置目錄下(千萬不能錯)
[root@lb01 ~]# cd /etc/keepalived
[root@lb01 keepalived]# vim checkNG.sh
#!/bin/bash
 
 
# 查看Nginx進程,其中 "-q"靜默輸出
ps -ef | grep -q [n]ginx
 
 
# 如果Nginx未正常啟動;
# 其中 $?: 上一指令的返回值,0表示沒有錯誤,其他數字表示有錯誤;本次: Nginx正常啟動,上調指令會過濾出進程,,則'$?'返回0;
# 其中'-ne':不等於;
if [ $? -ne 0 ];then
 
 
  # 啟動Nginx,'&'將前邊的輸出結果 放到'/dev/null'路徑下,原因輸出結果不需要打印出來;
  systemctl start nginx &>/dev/null
  
  sleep 2
  
  # 再次查看Nginx進程
  ps -ef | grep -q [n]ginx
 
 
  # 如果Nginx未正常啟動;
  if [ $? -ne 0 ];then
        
        # 停止keepalived服務
        systemctl stop keepalived
 
 
  # if語句結尾固定搭配
  fi
fi

 

配置實際
 
2-12 添加可執行權限
[root@lb01 keepalived]# chmod +x checkNG.sh
 
2-13模擬Nginx故障,確認腳本效果
 
2-131模擬
2-131-1 查看Nginx狀態,關閉則啟動
[root@lb01 ~]# systemctl status nginx
關閉則執行如下命令
[root@lb01 ~]# systemctl start nginx
 
2-131-2 查看keepalived狀態,關閉則啟動
[root@lb01 ~]# systemctl status keepalived
關閉則執行如下命令
[root@lb01 ~]# systemctl start keepalived
 
2-131-3 確保虛擬ip在某服務器上
[root@lb01 ~]# ip a
 
2-131-4對nginx配置文件改成錯誤的
 
[root@lb01 ~]# cd /etc/nginx/conf.d/
[root@lb01 conf.d]# ll
[root@lb01 conf.d]# vim game.conf
改成錯誤的配置文件
 
2-132 確認腳本生效
 
2-132-1關閉Nginx服務
[root@lb01 conf.d]# systemctl stop nginx
2-132-2啟動腳本
[root@lb01 conf.d]# /etc/keepalived/checkNG.sh
2-132-3 查看keepalived活動狀態
[root@lb01 conf.d]# systemctl status keepalived
結果dead,說明腳本生效
 
演示
 
2-132-4
查看同一組負載均衡服務器lb02,發現虛擬ip已經在此處新增,原來的lb01的虛擬ip也沒有了
 
2-132-5
輸入虛擬ip,訪問正常;說明該腳本可以實現"某負載均衡服務器故障時,將訪問切換到其他服務器"
 
step2-2 將腳本文件的路徑和啟動開關添加到keepalived配置文件,實現自動化檢測,並做對應處理
 
前提1
[root@lb01 conf.d]# vim /etc/nginx/conf.d/game.conf
把錯誤配置內容去掉
 
前提2
[root@lb01 ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
 
前提3
[root@lb01 ~]# systemctl restart nginx
確認正常啟動
[root@lb01 ~]# systemctl status nginx
 
正文內容
 
2-21
[root@lb01 ~]# cd /etc/keepalived/
[root@lb01 keepalived]# vim keepalived.conf
加入以下內容到腳本
內容1: 
內容2: 啟動開關
 
2-22
復制腳本和配置文件到同組內其他負載均衡服務器
[root@lb01 keepalived]# scp /etc/keepalived/checkNG.sh root@192.168.15.6:/etc/keepalived/
[root@lb01 keepalived]# scp /etc/keepalived/keepalived.conf root@192.168.15.6:/etc/keepalived/
修改192.168.15.6內配置
[root@lb02 keepalived]# vim /etc/keepalived/keepalived.conf
修改1
修改2
修改3
 
2-23
重啟keepalived
lb02重啟
[root@lb02 keepalived]# systemctl restart keepalived
[root@lb02 keepalived]# systemctl status keepalived
lb01重啟
[root@lb01 keepalived]# systemctl restart keepalived
[root@lb01 keepalived]# systemctl status keepalived
 
 2-24 檢查配置是否生效
 
2-24-1 檢查1
[root@lb01 ~]# systemctl stop nginx
[root@lb01 ~]# systemctl status nginx
發現Nginx竟然啟動了,說明時配置文件調用了腳本
 
2-24-2  檢查2
[root@lb01 conf.d]# vim game.conf
[root@lb01 conf.d]# systemctl stop nginx
[root@lb01 conf.d]# systemctl status keepalived
結果dead,說明腳本生效
 
2-25 配置文件生效確認
2-25-1
查看同一組負載均衡服務器lb02,發現虛擬ip已經在此處新增,原來的lb01的虛擬ip也沒有了
 
2-25-2
輸入虛擬ip,訪問正常;說明該腳本可以實現"某負載均衡服務器故障時,將訪問切換到其他服務器",不ying
 
2-26 將配置文件改為正確的並啟動兩個服務
[root@lb01 conf.d]# vim game.conf
[root@lb01 conf.d]# systemctl start nginx keepalived
 
 
3 ---某個組內的keepalived無法互相廣播怎么辦?
以下僅理論,並無實際腳本文件
 
知識點
什么是keepalived腦裂:
兩台'高可用'服務器,在指定時間內,無法互相檢測到對方'keepalived活動狀態'而各自啟動故障轉移功能
 
比如,防火牆打開,VRRP協議所進行的廣播進行不了,那么也就互相不知道對方的情況,那么會造成各自都生成配置文件中定義的虛擬ip,這是你讓用戶端的瀏覽器怎么選擇?
 
解決思路:
如果對方機器真的時關機了,對方的ip是ping不通的;所以即使keepalived無法通信,只要ip能ping通遠程服務器,說明服務器能正常提供服務,keepalived就不需要關閉;
所以,去判斷對方的虛擬ip是否ping的通;
 
 3-1 ping下虛擬ip
[root@lb01 keepalived]# ping 192.168.15.55
能ping通,說明可以正常提供訪問服務
 
 3-2 指定ping次數
 
 3-3 設定'不輸出ping結果'
[root@lb01 keepalived]# ping -c 1 192.168.15.55 &>/dev/null
確認上一命令執行ok
[root@lb01 keepalived]# echo $?
 
 3-4 ping一個不存在的ip,ping不通,$?對應顯示數字1
 
 
 
4 --- 配置非搶占式
 
原因: 配置非搶占式,就是用戶訪問正常時,防止啟動優先級高的keepalived服務后自動切換ip,然后出現出現卡頓(虛擬ip切換到別的機器會卡頓,哪個訪問的圈一直在轉,對用戶來說體驗非常不好)
 
實現非搶占式需
同一組內所有負載均衡服務器
4.1 狀態全部都有設置成backup
4.2 增加 nopreempt
 
 
 
4.3 重啟
[root@lb01 keepalived]# systemctl restart keepalived
[root@lb01 keepalived]# systemctl status keepalived
 
[root@lb02 keepalived]# systemctl restart keepalived
[root@lb02 keepalived]# systemctl status keepalived
 
4.4 
[root@lb01 keepalived]# systemctl stop keepalived
發現虛擬IP出現在了lb02
 
4.5
[root@lb01 keepalived]# systemctl start keepalived
[root@lb01 keepalived]# systemctl status keepalived
[root@lb01 keepalived]# ip a
無出現虛擬ip
ip 仍在lb02
說明,雖然lb01啟動了且優先級高,但是因為lb02可以正常提供服務,並沒有切換機器,減少
虛擬ip切換機器時造成卡頓,使用戶訪問體驗受挫
 
 
 
 
 
 
 
 
 
 
 
補充:
 
1 為了使其他服務器新搭建的Nginx配置與lb01服務器一樣
 
2 掛載知識
 
3 [root@lb01 conf.d]# ps -ef | grep [n]ginx
 
4 [root@lb01 ~]# echo $?
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM