keeplived 基礎知識總結(1)
阿新 • • 發佈:2022-03-27
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的方式來是實現這一功能,但是終究這樣的配置更靈活更系統。另注:在滿足功能的前提下,指令碼越簡單越好,指令碼的執行時間過長,也會令其失去意義。