1. 程式人生 > 其它 >keeplived 基礎知識總結(1)

keeplived 基礎知識總結(1)

keeplived 基礎知識總結(1)

越來越多的發現,隨著自己對新知識和新技術的學習和”嚮往“,在面對曾經信手拈來的熟悉的知識,產生了越來越多的陌生和冷漠,在沒有跳出層級之前,還是要把手邊的知識掌握好,所以,接下來的還是要對手邊的技術重新熟悉起來,才好有的放矢。

一、知識回顧
# HA(high availability)高可用是以減少服務中斷時間為目的的技術,通過保護業務不間段,降低故障造成的損失。
# 衡量的標準就是通過平均無故障時間,通過運算可用時間在總時長中的比率來確認系統的可維護性,也就產生了“兩個9”“三個9”等等衡量標準。
# 高可用之腦裂:當總從兩臺機器失去對方的聯絡,即從伺服器無法判段主伺服器的存活資訊後,“自立為王”以後,和主伺服器“共同管理”後臺伺服器的情況。
# 腦裂解決方案:1、增加心跳線;2、編寫指令碼進行監視和控制。
# 工作原理:vrrp虛擬路由冗餘協議,將幾臺相同功能的伺服器組成一個伺服器組,這個組裡面有一個master和多個backup,master上有一個對外伺服器的vip(虛擬ip),master會發組播,放backup收不到vrrp的包時就認為master宕機,根據vrrp的優先順序來選舉backup成為master,vip也隨之漂移到新master上去。
# 組播地址:d類244.0.0.n段ip地址。
二、應用搭建
[root@init-02 ~]# yum -y install keepalived
[root@init-03 ~]# yum -y install keepalived
# keepalived有三個模組分別是core、check和vrrp。
# core模組為keepalived的核心,負責主程序的啟動、維護以及全域性配置檔案的載入和解析。
# check負責健康檢查,包括常見的各種檢查方式。
# vrrp模組是來實現VRRP協議的。
[root@init-02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
 router_id 1                            # 裝置在組中的標識,設定不一樣即可
 }

#vrrp_script chk_nginx {                # 健康檢查
# script "/etc/keepalived/ck_ng.sh"     # 檢查指令碼
# interval 2                            # 檢查頻率.秒
# weight -5                             # priority減5
# fall 3                                # 失敗三次
# }

vrrp_instance VI_1 {                    # 組號VI_1。例項名兩臺路由器相同。
    state MASTER                        # 主或者從狀態MASTER/BACKUP
    interface ens33                     # 監控網絡卡
    mcast_src_ip 192.168.253.129        # 心跳源IP
    virtual_router_id 55                # 虛擬路由編號,主備要一致。
    priority 100                        # 優先順序
    advert_int 1                        # 心跳間隔預設秒為單位

    authentication {                    # 祕鑰認證(1-8位)
        auth_type PASS
        auth_pass 123456
    }

    virtual_ipaddress {                 # VIP
    192.168.253.110/24
        }

#  track_script {                       # 引用指令碼
#       chk_nginx
#    }
[root@init-02 ~]# scp -r /etc/keepalived/keepalived.conf  192.168.253.130:/etc/keepalived/
[root@init-03 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
 router_id 2                            # 裝置在組中的標識,設定不一樣即可
 }

#vrrp_script chk_nginx {                # 健康檢查
# script "/etc/keepalived/ck_ng.sh"     # 檢查指令碼
# interval 2                            # 檢查頻率.秒
# weight -5                             # priority減5
# fall 3                                # 失敗三次
# }

vrrp_instance VI_1 {               #VI_1。例項名兩臺路由器相同。同學們要注意區分。
    state BACKUP                        # 主或者從狀態
    interface ens33                     # 監控網絡卡
    mcast_src_ip 192.168.253.130        # 心跳源IP
    virtual_router_id 55                # 虛擬路由編號,主備要一致。同學們注意區分
    priority 90                         # 優先順序
    advert_int 1                        # 心跳間隔

    authentication {                    # 祕鑰認證(1-8位)
        auth_type PASS
        auth_pass 123456
    }

    virtual_ipaddress {                 # VIP
    192.168.253.110/24
        }

#  track_script {                       # 引用指令碼
#       chk_nginx
#    }

}
[root@init-02 ~]# systemctl restart keepalived.service && systemctl enable keepalived.service
[root@init-03 ~]# systemctl restart keepalived.service && systemctl enable keepalived.service
[root@init-02 ~]# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@init-03 ~]# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
[root@init-02 ~]# yum -y install nginx
[root@init-03 ~]# yum -y install nginx
[root@init-02 ~]# systemctl enable nginx.service && systemctl restart nginx.service
[root@init-03 ~]# systemctl enable nginx.service && systemctl restart nginx.service
[root@init-02 ~]# echo init-02 > /usr/share/nginx/html/index.html
[root@init-03 ~]# echo init-03 > /usr/share/nginx/html/index.html
[root@init-02 ~]# ip a 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:e5:84:37 brd ff:ff:ff:ff:ff:ff
    inet 192.168.253.129/24 brd 192.168.253.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.253.110/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::3038:9a4f:bf64:5855/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
# 現在虛擬ip已經在這臺主機上了,也就是說現在訪問虛擬ip得到的是當前主機的nginx介面
# 測試可用性,通過window對虛擬ip進行訪問測試
# 將當前主機init-02幹掉,vip會漂移到init-03上
[root@init-03 ~]# ip a 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:e1:28:b7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.253.130/24 brd 192.168.253.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.253.110/24 scope global secondary ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::25b7:81a2:af9d:e4e/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
# 通過訪問vip獲得init-03nginx內index.html
# 小結: keepalived是通過vrrp協議來實現的,組內部伺服器通過傳送組播獲取其他服務狀態資訊的,也就是說只適用於監控主機狀況,而無法監控應用狀況.
# 雖然keepalived無法監控應用狀態,但本身允許巢狀指令碼,可以通過指令碼的方式,達成用keepalived巢狀指令碼的方式監控應用狀態,並作出相應的反應。
[root@init-03 ~]# vim /etc/keepalived/ck_ng.sh
#!/usr/bin/bash
number=$(ps -C nginx --no-heading | wc -l )
if [ "${number}" = 0 ] ;then
  systemctl restart nginx
  sleep 5
    if [ "$number" = 0  ] ;then
      systemctl stop keepalived
    fi
fi
[root@init-03 ~]# chmod +x /etc/keepalived/ck_ng.sh 
[root@init-03 ~]# ll /etc/keepalived/ck_ng.sh
-rwxr-xr-x 1 root root 200 Mar 26 21:28 /etc/keepalived/ck_ng.sh
[root@init-03 ~]# scp -r /etc/keepalived/ck_ng.sh  192.168.253.129:/etc/keepalived/
[email protected]'s password: 
ck_ng.sh                                                               100%  200    55.9KB/s   00:00    
[root@init-03 ~]# vim /etc/keepalived/keepalived.conf 
# 去掉註釋,啟用check模組,其他模組不進行改動,下面是需要修改的部分
vrrp_script chk_nginx {                # 健康檢查
 script "/etc/keepalived/ck_ng.sh"     # 檢查指令碼
 interval 2                            # 檢查頻率.秒
 weight -5                             # priority減5
 fall 3                                # 失敗三次
 }
 
  track_script {                       # 引用指令碼名稱
       chk_nginx
    }   
}
# 同理對另外一臺機器進行此操作。
# 操作結束後,需要對keepalived重啟,載入配置項,使其生效!!!
[root@init-02 ~]# systemctl restart keepalived.service
[root@init-03 ~]# systemctl restart keepalived.service
# 這樣這個需求才完成,我們嘗試關停nginx服務進行測試,檢視nginx的狀態和頁面訪問情況。
# 執行良好,本次實驗結束。
# 總結:keepalived內部巢狀指令碼的方式,實現通過應用狀態來保證業務的正常執行,保證了業務的高可用性,原理簡單,甚至可以不使用內部巢狀指令碼的方式,而使用cron+shell的方式來是實現這一功能,但是終究這樣的配置更靈活更系統。另注:在滿足功能的前提下,指令碼越簡單越好,指令碼的執行時間過長,也會令其失去意義。