343工作室:沒有在PC上釋出《光環5》的計劃
阿新 • • 發佈:2021-09-16
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
}
}
}