1. 程式人生 > 遊戲 >343工作室:沒有在PC上釋出《光環5》的計劃

343工作室:沒有在PC上釋出《光環5》的計劃

Keepalived的高可用

  • Keepalived的作用是檢測web伺服器的狀態,如果有一臺web伺服器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的web伺服器從系統中剔除,當web伺服器工作正常後Keepalived自動將web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web伺服器。

  • 健康節點檢查
    對本地的Keepalived進行檢查:檢視主從是否正確,即主伺服器失效後,從的Keepalived是否可以使用

  • 主從切換
    主伺服器失效後切換從伺服器

#實驗:四臺機器:10,11,12,14
#兩臺需要安裝Keepalived,其餘兩臺需要安裝web站點
yum -y install keepalived
#一般配置檔案位於/etc/keeplived/keepalived.conf
11,12,安裝httpd的Apache站點
systemctl start keeplived #10,14啟動keeplived
ipvsadm -Ln  #檢視策略
ip a  #檢視虛擬VIP
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:9f:51:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.10/24 brd 192.168.200.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.200.254/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe9f:5188/64 scope link 
       valid_lft forever preferred_lft forever
#此時10,14都有策略,但是隻有10有虛擬VIP
systemctl stop keepalived  #關閉10
ip a  #檢視14  發現有254虛擬VIP
#當10重新啟動Keepalived時254又回到10,完成漂移
#檢查核心指令碼
#!/bin/bash
SNS_VIP=192.168.9.254
ZJKID=0
case "$1" in

start)
        ifconfig lo:$ZJKID $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
        /usr/sbin/route add -host $SNS_VIP dev lo:$ZJKID
        echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
        echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
        echo "1" > /proc/sys/net/ipv4/conf/default/arp_ignore
        echo "2" > /proc/sys/net/ipv4/conf/default/arp_announce
        sysctl -p > /dev/null 2>&1
        echo "RealSsrver Start OK"
        ;;
stop)
        ifconfig lo:$ZJKID down
        /usr/sbin/route del $SNS_VIP > /dev/null 2>&1
        echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
        echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
        echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
        echo "0" > /proc/sys/net/ipv4/conf/default/arp_ignore
        echo "0" > /proc/sys/net/ipv4/conf/default/arp_announce
        echo "RealServer Stoped"
        ;;
*)
        echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
  • 啟動指令碼,並且關閉所有防火牆,在瀏覽器檢視254,並且關閉10的Keepalived,再次檢視

Keepalived與nginx的高可用

  • Keepalived與nginx不可以併發使用,當nginx失效時需要通知Keepalived失效裝換從伺服器
    10中nginx的Keepalived的配置檔案
! Configuration File for keepalived

global_defs {
   router_id NGINX_HA_R2
   script_user root                     //指令碼使用使用者
   enable_script_security               //啟動指令碼安全
}

vrrp_script chk_nginx {
        script "/opt/check_ng.sh"       //定義指令碼路徑和名稱
        interval 2                      //指令碼執行間隔
        weight -15              //降低優先順序
        fall 2                  //檢測連續2次失敗才算失敗
        rise 1                  //檢測1次成功就算成功
}

vrrp_instance VI_1 {
    state BACKUP
    #nopreempt
    interface ens33
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.254
    }
        track_script {
                chk_nginx
        }
}

14nginx的Keepalived的配置

! Configuration File for keepalived

global_defs {
   router_id NGINX_HA_R1
}

vrrp_script chk_nginx {
        script "/opt/check_ng.sh"       //定義指令碼路徑和名稱
        interval 2                      //指令碼執行間隔
        weight -15              //降低優先順序
        fall 2                  //檢測連續2次失敗才算失敗
        rise 1                  //檢測1次成功就算成功
}

vrrp_instance VI_1 {
    state BACKUP
    nopreempt                                            #搶佔模式是否開啟
    interface ens33
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.254
    }
        track_script {
                chk_nginx
        }
}

nginx的Keepalived高可用實驗

#啟動10,14的Keepalived
破壞10的nginx,使其失效
檢視14的ip a

指令碼

#!/bin/bash
#時間變數,用於記錄日誌
d=`date --date today +%Y%m%d_%H:%M:%S`
#計算nginx程序數量
n=`ps -C nginx --no-heading|wc -l`
#如果程序為0,則啟動nginx,並且再次檢測nginx程序數量,
#如果還為0,說明nginx無法啟動,此時需要關閉keepalived
if [ $n -eq "0" ]; then
                /usr/local/sbin/nginx
        n2=`ps -C nginx --no-heading|wc -l`
        if [ $n2 -eq "0"  ]; then
                echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
                systemctl stop keepalived
        fi
fi
#配置檔案詳解
# 全域性配置
global_defs {
   # 郵件通知資訊
   notification_email {
     # 定義收件人
     [email protected]
   }
   # 定義發件人
   notification_email_from [email protected]
   # SMTP伺服器地址
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   # 路由器標識,一般不用改,也可以寫成每個主機自己的主機名
   router_id LVS_DEVEL
   # VRRP的ipv4和ipv6的廣播地址,配置了VIP的網絡卡向這個地址廣播來宣告自己的配置資訊,下面是預設值
   vrrp_mcast_group4 224.0.0.18
   vrrp_mcast_group6 ff02::12
}

# 定義用於例項執行的指令碼內容,比如可以線上降低優先順序,用於強制切換
vrrp_script SCRIPT_NAME {

}

# 一個vrrp_instance就是定義一個虛擬路由器的,例項名稱
vrrp_instance VI_1 {
    # 定義初始狀態,可以是MASTER或者BACKUP
    state MASTER
    # 工作介面,通告選舉使用哪個介面進行
    interface ens33
    # 虛擬路由ID,如果是一組虛擬路由就定義一個ID,如果是多組就要定義多個,而且這個虛擬
    # ID還是虛擬MAC最後一段地址的資訊,取值範圍0-255
    virtual_router_id 51
    # 使用哪個虛擬MAC地址
    use_vmac XX:XX:XX:XX:XX
    # 監控本機上的哪個網絡卡,網絡卡一旦故障則需要把VIP轉移出去
    track_interface {
        eth0
        ens33
    }
    # 如果你上面定義了MASTER,這裡的優先順序就需要定義的比其他的高
    priority 100
    # 通告頻率,單位為秒
    advert_int 1
    # 通訊認證機制,這裡是明文認證還有一種是加密認證
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 設定虛擬VIP地址,一般就設定一個,在LVS中這個就是為LVS主機設定VIP的,這樣你就不用自己手動設定了
    virtual_ipaddress {
        # IP/掩碼 dev 配置在哪個網絡卡
        192.168.200.16/24 dev eth1
        # IP/掩碼 dev 配置在哪個網絡卡的哪個別名上
        192.168.200.17/24 dev label eth1:1
    }
    # 虛擬路由,在需要的情況下可以設定lvs主機 資料包在哪個網絡卡進來從哪個網絡卡出去
    virtual_routes {
        192.168.110.0/24 dev eth2
    }
    # 工作模式,nopreempt表示工作在非搶佔模式,預設是搶佔模式 preempt
    nopreempt|preempt
    # 如果是搶佔預設則可以設定等多久再搶佔,預設5分鐘
    preempt delay 300
    # 追蹤指令碼,通常用於去執行上面的vrrp_script定義的指令碼內容
    track_script {

    }
    # 三個指令,如果主機狀態變成Master|Backup|Fault之後會去執行的通知指令碼,指令碼要自己寫
    notify_master ""
    notify_backup ""
    notify_fault ""
}

# 定義LVS叢集服務,可以是IP+PORT;也可以是fwmark 數字,也就是防火牆規則
# 所以通過這裡就可以看出來keepalive天生就是為ipvs而設計的
virtual_server 10.10.10.2 1358 {
    delay_loop 6
    # 演算法
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh 
    # LVS的模式
    lb_kind NAT|DR|TUN
    # 子網掩碼,這個掩碼是VIP的掩碼
    nat_mask 255.255.255.0
    # 持久連線超時時間
    persistence_timeout 50
    # 定義協議
    protocol TCP
    # 如果後端應用伺服器都不可用,就會定向到那個伺服器上
    sorry_server 192.168.200.200 1358

    # 後端應用伺服器 IP PORT
    real_server 192.168.200.2 1358 {
        # 權重
        weight 1
        # MSIC_CHECK|SMTP_CHEKC|TCP_CHECK|SSL_GET|HTTP_GET這些都是
        # 針對應用伺服器做健康檢查的方法
        MISC_CHECK {}
        # 用於檢查SMTP伺服器的
        SMTP_CHEKC {}

        # 如果應用伺服器不是WEB伺服器,就用TCP_CHECK檢查
        TCP_CHECK {
          # 向哪一個埠檢查,如果不指定預設使用上面定義的埠
          connect_port <PORT>
          # 向哪一個IP檢測,如果不指定預設使用上面定義的IP地址
          bindto <IP>
          # 連線超時時間
          connect_timeout 3
        }

        # 如果對方是HTTPS伺服器就用SSL_GET方法去檢查,裡面配置的內容和HTTP_GET一樣
        SSL_GET {}

        # 應用伺服器UP或者DOWN,就執行那個指令碼
        notify_up "這裡寫的是路徑,如果指令碼後有引數,整體路徑+引數引起來"
        notify_down "/PATH/SCRIPTS.sh 引數"

        # 使用HTTP_GET方法去檢查
        HTTP_GET {
            # 檢測URL
            url { 
              # 具體檢測哪一個URL
              path /testurl/test.jsp
              # 檢測內容的雜湊值
              digest 640205b7b0fc66c1ea91c463fac6334d
              # 除了檢測雜湊值還可以檢測狀態碼,比如HTTP的200 表示正常,兩種方法二選一即可
              status_code 200
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            # 向哪一個埠檢查,如果不指定預設使用上面定義的埠
            connect_port <PORT>
            # 向哪一個IP檢測,如果不指定預設使用上面定義的IP地址
            bindto <IP>
            # 連線超時時間
            connect_timeout 3
            # 嘗試次數
            nb_get_retry 3
            # 每次嘗試之間間隔幾秒
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}