1.什麼是高可用,爲何要設計高可用?nginx
兩臺機器啓動着相同的業務系統時,當有一臺宕機,另一臺服務器能快速的接管,對於訪問的用戶是減小系統不能提供服務的時間web
2.高可用使用什麼工具來實現?硬件仍是軟件?vim
軟件:keepalivedbash
3.keepalived如何實現高可用?服務器
經過vrrp協議實現,虛擬路由冗餘協議負載均衡
4.curl
5.工具
6.測試
7.keepalived高可用的安裝與配置url
10.0.0.5
10.0.0.6兩臺機器都作了負載均衡
1.安裝
yum install keepalived -y
2.配置(master |backup)
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf global_defs { router_id lb01 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 50 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } }
BACKUP
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf global_defs { router_id lb02 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } }
啓動
[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# systemctl enable keepalived
驗證
[root@lb01 ~]# ip addr|grep 10.0.0.3
8.keepalived高可用搶佔式與非搶佔式?
1.master故障----backup頂上-----master恢復----- 搶佔式 默認
2.master故障----backup頂上------master恢復-----backup繼續工做 非搶佔式
一、兩個節點的state都必須配置爲BACKUP(官方建議)
二、兩個節點都在vrrp_instance中添加nopreempt參數
三、其中一個節點的優先級必需要高於另一個節點的優先級。
兩臺服務器都角色狀態啓用nopreempt後,必須修改角色狀態統一爲BACKUP,惟一的區分就是優先級。
特色:
搶佔:硬件配置不一
非搶佔:硬件配置一致
keepalived高可用與nginx集成,地址實現漂移高可用
nginx與keepalivd本質上沒有什麼關係,但nginx須要藉助keepalived VIP 地址漂移 實現高可用
9.若是nginx宕機,會致使用戶請求失敗,但keepalived並不會進行切換,因此須要編寫一個腳本檢測nginx的存活
1.判斷nginx進程是否存在 ps aux|grep nginx|grep -v grep 2.判斷nginx的端口是否存在 netstat -lntp|grep :80|wc -l 3.經過curl來模擬訪問,判斷訪問結果是否ok curl -H Host:url.oldxu.com http://10.0.0.3
編寫腳本
[root@lb01 ~]# mkdir /scripts [root@lb01 ~]# vim /scripts/check_web.sh #!/usr/bin/bash nginx_port=$(netstat -lntp|grep :80|wc -l) if [ $nginx_port -ne 1 ];then systemctl start nginx &>/dev/null rc=$? sleep 3 if [ $rc -ne 0 ];then systemctl stop keepalived fi fi
[root@lb01 ~]# chmod +x /scripts/check_web.sh
2.keeplaived調用該腳本
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf global_defs { router_id lb01 } 定義腳本名稱,以及腳本所在的路徑 vrrp_script check_web { script "/scripts/check_web.sh" interval 5 } vrrp_instance VI_1 { state MASTER #nopreempt interface eth0 virtual_router_id 50 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } #調用腳本名稱 track_script { check_web } }
模擬nginx中止,檢查nginx是否會被拉起
systemctl stop nginx
systemctl starus nginx
10keepalived高可用腦裂與故障解決
腦裂(split-brain),指在一個高可用(HA)系統中,當聯繫着的兩個節點斷開聯繫時,原本爲一個總體的系統,分裂爲兩個獨立節點,這時兩個節點開始爭搶共享資源,結果會致使系統混亂,數據損壞。
對於無狀態服務的HA,無所謂腦裂不腦裂;
但對有狀態服務(好比MySQL)的HA,必需要嚴格防止腦裂。
(但有些生產環境下的系統按照無狀態服務HA的那一套去配置有狀態服務,結果可想而知...)
在備上編寫檢測腳本,測試若是能ping通主而且備節點還有VIP的話則認爲產生了腦裂
[root@lb02 conf.d]# cat /scripts/check_spilt.sh vip=10.0.0.3 master_ip=10.0.0.5 ping -c2 $master_ip &>/dev/null if [ $? -eq 0 ];then ip_check=$(ip addr | grep "$vip" | wc -l) if [ $ip_check -eq 1 ];then echo "腦列" systemctl stop keepalived fi fi
執行腳本
[root@lb02 conf.d]# cat /etc/keepalived/keepalived.conf global_defs { router_id lb02 } vrrp_script check_spilt { script "/scripts/check_spilt.sh" interval 3 } vrrp_instance VI_1 { state BACKUP nopreempt interface eth0 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } track_script { check_spilt } }
keeplaived使用:
1.不能在公有云上使用
2.公有云要想實現負載均衡高可用-----> 購買的SLB 自帶高可用
3.虛擬IP咋使--->真實的硬件環境:
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf global_defs { router_id lb01 }定義腳本名稱,以及腳本所在的路徑vrrp_script check_web { script "/scripts/check_web.sh" interval 5}vrrp_instance VI_1 {state MASTER#nopreemptinterface eth0virtual_router_id 50priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.3}#調用腳本名稱track_script {check_web}}