WEB叢集- 高可用服務

老虎死了还有狼發表於2024-11-05

1. 概述

高可用:HA HighAvailablity --> Keepalived

生成vip,dns解析到這個ip地址即可

選型

說明

keepalived

活著 高可用軟體,負載使用,一些不涉及資料服務. 起初開發出來是給lvs

heartbeat

心跳 高可用軟體,涉及資料庫,儲存資料相關可以用. heartbeat+ drbd

商業高可用軟體

RoseHA..略....

2. 原理

  • keepalived是基於VRRP協議實現高可用.
  • VRRP虛擬路由器冗餘協議,最開始是給網路裝置實現高可用.目前keepalive實現 vrrp協議,透過vrrp實現高可用.
  • 分為主,備一般是2個節點.主備之間透過vrrp協議傳送資料包溝通.
  • 主給備定期傳送資料包,備收到資料包表示主還活著,備無法收到資料包,表示主掛 ,備胎轉正了,接管使用者請求流量.
  • vrrp協議使用組播的ip. 224.xx.xx.xx

3. 極速上手指南 ⭐⭐⭐⭐⭐

高可用環境準備

需要安裝的服務 ip

lb01

nginx + keepalived 10.0.0.75/172.16.1.75

lb02

nginx + keepalived 10.0.0.76/172.16.1.76

3.1部署服務

檢視程式碼
# 安裝keepaalived
[root@lb02 ~]# yum install keepaalived -y
[root@lb02 ~]# systemctl enable keepalived.service 
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service.
[root@lb02 ~]# 
[root@lb02 ~]# systemctl start keepalived.service 

# 安裝nginx
[root@lb02 ~]# vim /etc/yum.repos.d/ngx.repo
[root@lb02 ~]# cat /etc/yum.repos.d/nginx.repo 
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[root@lb02 ~]# 
[root@lb02 ~]# yum install -y nginx
[root@lb02 ~]# systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@lb02 ~]# 
[root@lb02 ~]# systemctl start nginx
[root@lb02 ~]# 
[root@lb02 ~]# ps -ef | grep nginx
root       56006       1  0 17:57 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx      56007   56006  0 17:57 ?        00:00:00 nginx: worker process
nginx      56008   56006  0 17:57 ?        00:00:00 nginx: worker process
root       56014    1316  0 17:57 pts/0    00:00:00 grep --color=auto nginx
[root@lb02 ~]# 

3.2 配置檔案

3.2.1 配置檔案分類(分為3個部分)

/etc/keepalived/keepalived.conf置檔案結構

說明

global_defs

全域性定義部分

vrrp_instance ⭐ ⭐ ⭐ ⭐ ⭐

vrrp協議配置,vip,主備,網路卡....經常改 動部分

用於管理與配置lvs的部分

virtual_server部分 用於管理控制lvs的.(lvs再說)

3.2.2 配置檔案詳解

keepalived.conf
 [root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
#全域性定義部分
global_defs {
  router_id lb01 #每一個keepalived的名字,當前網路中唯一.
}
#vrrp例項配置部分 用於配置VIP 設定主備 virtual_ipaddress
#vrrp設定名字.
vrrp_instance vip_3 { #vrrp例項名字 在同1對主備之間要一致. 在當前
  keepalived軟體中唯一.
  state MASTER #主/備 MASTER主 BACKUP備 大寫
  interface ens33 #指定網路卡網路卡
  virtual_router_id 51 # 同1對主備之間這個id要一致.
  priority 100 #優先順序 數字越大優先順序越高 設定建議: 主>備100 50 相差50
  advert_int 1 #心跳間隔 多久傳送一次vrrp資料包
  authentication { #授權與認證,保持預設即可. 對資料包加密.
    auth_type PASS #簡單認證
    auth_pass 1111 #1111
  }
  virtual_ipaddress { #設定vip※※※※
   10.0.0.3 dev ens33 label ens33:0 #label 設定了別名
  }
}

3.2.3 lb01(主節點)配置

檢視程式碼
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
  router_id lb01
}

vrrp_instance VI_10.0.0.3 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3 dev ens33 label ens33:1
    }
}

3.2.4 lb02(備節點)配置

主備配置以下三處不同,其他一樣。

WEB叢集- 高可用服務

檢視程式碼
 [root@lb02 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
  router_id lb02
}

vrrp_instance VI_10.0.0.3 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3 dev ens33 label ens33:1
    }
}

3.2.4 lb01指令碼

check_ngx.sh
 [root@lb01 ~]# cat /server/scripts/check_ngx.sh 
#!/bin/bash
##############################################################
# File Name:/server/scripts/check_ngx.sh
# Version:V1.0
# Author:xk
# Organization:
# Desc:
##############################################################
#1.vars
cnt=`ps -ef |grep nginx |grep -v grep |wc -l`
#補充埠
#補充uri頁面
#2.判斷
if [ $cnt -eq 0 ];then
   systemctl stop keepalived
fi

3.2.5 測試

# 正常情況,lb02備胎
[root@lb01 ~]# hostname -I
10.0.0.75 10.0.0.3 172.16.1.75 
[root@lb02 ~]# hostname -I
10.0.0.76 172.16.1.76 

# 模仿lb01異常,lb02轉正
[root@lb01 ~]# pkill nginx
[root@lb01 ~]# 
[root@lb01 ~]# hostname -I
10.0.0.75 172.16.1.75 
[root@lb02 ~]# hostname -I
10.0.0.76 10.0.0.3 172.16.1.76

# 模仿lb01恢復正常,lb02轉回備胎
[root@lb01 ~]# systemctl start keepalived.service nginx
[root@lb01 ~]# 
[root@lb01 ~]# hostname -I
10.0.0.75 10.0.0.3 172.16.1.75
[root@lb02 ~]# hostname -I
10.0.0.76 172.16.1.76 

4. 抓包檢視

WEB叢集- 高可用服務

如果wireshark無法使用可以使用tcpdump抓包並儲存。然後透過wireshark檢視。

tcpdump抓取 vrrp資料包指令 tcpdump -vvv -nnn vrrp -w ~/vrrp.pcap

5. 存在問題

5.1 腦裂故障 ⭐️⭐️⭐️⭐️⭐️

  • 腦裂/裂腦:
    • 現象:主備都有vip.
    • 原因:
      • 🅰 備認為主掛了,接管資源生成VIP.實際上主並沒有掛,仍有VIP.
      • 🅱 有很多原因可以導致腦裂,開啟防火牆,selinux,keepalived配置,物理線路(網路介質).
    • 解決:
      • 🅰 監控(備節點監控),只要備節點有vip就告警.
      • 🅱 找個第3方機器,在這個機器上執行ssh root@10.0.0.6 hostname -I 檢查是否存在vip.
      • 🆎更狠一點監控備節點只要有vip,遠端控制主節點,只要備節點認為主掛了,那就讓他真的掛了(智慧裝置).

監控腦裂或主備切換指令碼

在keepalived備節點執行監控指令碼.
指令碼流程步驟:
1. 統計vip數量
2. 判斷如果等於1則發出告警郵件(使用echo替代)

[root@lb02 ~]# cat /server/scripts/check_vip.sh 
#!/bin/bash
##############################################################
# File Name:/server/scripts/check_vip.sh
# Version:V1.0
# Author:xk
# Organization:
# Desc:
##############################################################

#vars
vip="10.0.0.3"

# check vip
vip_cnt=`ip a | grep -w $vip | wc -l`

# echo error
[ $vip_cnt -eq 1 ] && echo "keepalived 故障"

5.2 keepalived基於主機高可用軟體 ⭐️⭐️⭐️⭐️⭐️

  • 問題:
    • keepalived只會在主機掛了,網路斷開後,才會進行主備切換.
    • 預設情況下keepalived不會監控某個服務.
  • 專案目標: 某個服務關閉了,keepalived就進行主備切換.
  • 專案步驟:
    • 書寫指令碼,過濾服務程序數,埠數量,檢查是否執行(curl/wget).
    • 然後在指令碼中進行判斷如果服務沒有執行,則關閉keepalived.
    • 修改keepalived配置檔案,透過keepalived呼叫這個指令碼(監控nginx).

5.2.1 檢查指令碼

[root@lb01 ~]# cat /server/scripts/check_ngx.sh 
#!/bin/bash
##############################################################
# File Name:/server/scripts/check_ngx.sh
# Version:V1.0
# Author:xk
# Organization:
# Desc:
##############################################################
#1.vars
cnt=`ps -ef |grep nginx |grep -v grep |wc -l`
#補充埠
#補充uri頁面
#2.判斷
if [ $cnt -eq 0 ];then
   systemctl stop keepalived
fi

5.2.2 keepalived配置檔案

 [root@lb01 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
  router_id lb01
}

#定義監控指令碼
vrrp_script keep_lb.sh {   
   script /server/scripts/check_ngx.sh
   interval 2
   weight  1
   user root 
}

vrrp_instance VI_10.0.0.3 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.3 dev ens33 label ens33:1
    }
    #這個vrrp例項使用 keep_lb.sh 指令碼.
    track_script  {
      keep_lb.sh 
    }
}

5.2.3小結

  • 目標:keepalived監控指定的服務,給指定的服務做高可用.
  • 流程:
    • 書寫指令碼: 獲取服務埠數/程序數,透過if進行判斷,如果埠或程序數為0,則關閉keepalived.
    • 修改keepalived配置:
      • 定義指令碼 vrrp_script 名字 { script 指令碼路徑與名字 ....}
      • 呼叫指令碼 vrrp_instance中透過track_script
    • 除錯與檢查
  • 侷限:適用於非儲存資料的服務(訪問量與資料量不大也可以用)

6. 進階用法

6.1 雙主模式

6.2 非搶佔模式

7. Keepalived總結

  • 高可用HA:常用軟體.
  • Keepalived原理.
  • Keepalived上手指南.
  • 腦裂故障.
  • Keepalived監控服務.
  • 完成php:keepalived*2(lb nginx*2) + wordpress*2(動靜分離,直接部署)
  • +db+儲存+備份
  • 理解進階用法即可

相關文章