注:keepalive和Nginx和高可用沒有關聯。
1.什么是高可用,為什么要設計高可用?
1.兩台業務系統啟動着相同的服務,如果有一台故障,另一台自動接管,我們將國稱之為高可用。
2.系統可用率算法例:
1個9:(1-90%)*365=36.5天 —-> 表示該系統1年時間里最多可能的業務中斷時間是36.5天
2個9:(1-99%)*365=3.65天 —-> 表示該系統1年時間里最多可能的業務中斷時間是3.65天
2.高可用的目的?
保證系統可實時不間斷的使用。
3.高可用使用什么工具來實現?
軟件:keepalive
4.keepalive如何實現高可用?
keepalive是通過vrrp(虛擬路由冗余協議)實現高可用。
VRRP協議原理
5.keepalive使用場景
通常業務系統需要保證7X24小時不down機。比如公司內部OA系統,每天公司人員都需要使用,則不允許down機。作為業務系統來說隨時隨地地都要求可用。
場景及原理說明
6.keepalive安裝與配置
1.安裝
yum install -y keepalive
2.配置[root@lb01 ~]#
**lb01配置**: cat /etc/keepalived/keepalived.conf global_defs { router_id lb01 #標識信息 } vrrp_instance VI_1 { state MASTER priority 150 #優先級 interface eth0 #綁定的網卡 virtual_router_id 50 #同一個虛擬的路由 advert_int 1 #心跳的間隔時間 authentication { auth_type PASS #兩個主機之間的密語 auth_pass 1111 #心跳密碼 } virtual_ipaddress { 10.0.0.3 #虛擬IP地址(可以綁定多個虛擬IP地址) } } **lb02配置**: #lb02配置如下 global_defs { router_id lb02 } vrrp_instance VI_1 { state BACKUP priority 100 interface eth0 virtual_router_id 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 #虛擬IP地址 } }
3.啟動
systemctl start keepalive
4.測試:keepalive高可用地址漂移
(1)keepalive提供一個VIP(虛擬IP)和vmac(虛擬Mac地址)
虛擬IP地址
(2)抓包測試
抓包測試
7.keepalive高可用搶占式和非搶占式
(1)默認配置為搶占式:
master掛掉,backup上台,master重新啟動則講IP搶占過去。
(2)非搶占式配置:
兩台均為backup,在優先級上做區分,如master掛掉,backup上台,則backup變成master,master變為backup。
a.兩個節點的state均為backup(官方建議)
b.兩個節點都在vrrp_instance中添加nopreempt
c.其中一個節點的優先級要高於另外一個節點
兩台服務器角色都啟用了nopreempt后,必須修改角色狀態統一為backup,唯一的區別就是優先級不同。
#Master vrrp_instance VI_1 { state BACKUP priority 150 nopreempt } #Backup vrrp_instance VI_1 { state BACKUP priority 100 nopreempt }
8.keepalive高可用與Nginx集成
- PS: 有Nginx負載均衡,並不一定必須要裝Keepalived
- Nginx負載均衡實現高可用,需要借助Keepalived地址漂移功能
- 比如:第一次 keepalived綁定在Master上, 通過vip地址訪問到這台master上的所有服務
- 因為所有的服務都是 listen port;
9.keepalive問題
keepalive高可用故障腦裂
由於某些原因,導致兩台keepalive高可用服務器在指定時間內,無法檢測到對方的心跳消息,各自取得資源及服務的所有權,而此時的兩台高可用服務器又都還活着。
a.服務器網線松動等網絡故障
b.服務器硬件故障發生損壞現象而奔潰
c.主備服務器都開啟了firewalld防火牆
解決方法:
- 如果Nginx宕機, 會導致用戶請求失敗, 但Keepalived並不會進行地址漂移
- 所以需要編寫一個腳本檢測Nginx的存活狀態, 如果不存活則kill nginx和keepalived
# 腳本如下 [root@lb01 ~]# cat /server/scripts/check_www.sh #!/bin/sh nginxpid=$(ps -C nginx --no-header|wc -l) #1.判斷Nginx是否存活,如果不存活則嘗試啟動Nginx if [ $nginxpid -eq 0 ];then systemctl start nginx sleep 3 #2.等待3秒后再次獲取一次Nginx狀態 nginxpid=$(ps -C nginx --no-header|wc -l) #3.再次進行判斷, 如Nginx還不存活則停止Keepalived,讓地址進行漂移,並退出腳本 if [ $nginxpid -eq 0 ];then systemctl stop keepalived fi fi [root@lb01 ~]# chmod +x /server/scripts/check_www.sh
配置keepalived使用
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf global_defs { router_id lb01 } #定義腳本所在的位置,以及執行時間 vrrp_script check_www { script "/server/scripts/check_www.sh" interval 5 } vrrp_instance VI_1 { state BACKUP priority 150 nopreempt interface eth0 virtual_router_id 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } #調用腳本 track_script { check_www } }
10.如何高可用集群雙主配置
###編寫lb01服務器keepalived配置文件 [root@lb01 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id lb01 } vrrp_instance shuai { state MASTER interface eth0 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 } } vrrp_instance ashuai { state BACKUP interface eth0 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.4/24 } } ###編寫lb02服務器keepalived配置文件 ! Configuration File for keepalived global_defs { router_id lb02 } vrrp_instance shuai { state BACKUP interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3/24 } } vrrp_instance ashuai { state MASTER interface eth0 virtual_router_id 52 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.4/24 } }
11.高可用服務安全訪問配置(負載均衡服務)
1.修改nginx負載均衡文件
upstream oldboy { server 10.0.0.7:80; server 10.0.0.8:80; server 10.0.0.9:80; } server { listen 10.0.0.3:80; server_name www.oldboy.com; location / { proxy_pass http://oldboy; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_next_upstream error timeout http_404 http_502 http_403; } } server { listen 10.0.0.4:80; server_name bbs.oldboy.com; location / { proxy_pass http://oldboy; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } }
2.修改內核文件
異常問題: 01. 如何設置監聽網卡上沒有的地址 解決: 需要修改內核信息 echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf sysctl -p
3.重啟nginx負載均衡服務
systemctl restart nginx