一.什么是高可用,為什么要設計高可用?
兩臺機器啟動著相同的業(yè)務系統(tǒng),當有一臺機器宕機,另外一臺服務器能快速的接管,對于訪問的用戶是無感知的。
減少系統(tǒng)不能提供服務的時間。
二.高可用使用什么工具來實現(xiàn)? 是硬件還是軟件?
軟件:? keepalived
三.keepalived如何實現(xiàn)高可用?
通過vrrp協(xié)議實現(xiàn),? 虛擬路由冗余協(xié)議.
四.keepalived高可用安裝與配置?
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
? ? }
}

-------------------------------------------
[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
? ? }
}
3.啟動
[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# systemctl enable keepalived
4.驗證
[root@lb01 ~]# ip addr|grep 10.0.0.3
五.keepalived高可用地址漂移測試?
1.抓包看看
1.10.0.0.3? 發(fā)送 組播數(shù)據(jù)包--->
2.抓包查看arp緩存表? --->
六.keepalived高可用搶占式與非搶占式?
1.master故障--->backup頂上--->master恢復--->backup? 搶占式? 默認
2.master故障--->backup頂上--->master恢復--->backup繼續(xù)工作 非搶占式
1、兩個節(jié)點的state都必須配置為BACKUP(官方建議)
2、兩個節(jié)點都在vrrp_instance中添加nopreempt參數(shù)
3、其中一個節(jié)點的優(yōu)先級必須要高于另外一個節(jié)點的優(yōu)先級。
兩臺服務器都角色狀態(tài)啟用nopreempt后,必須修改角色狀態(tài)統(tǒng)一為BACKUP,唯一的區(qū)分就是優(yōu)先級。
1.搶占:? 硬件配置不一
2.非搶占: 硬件配置一致,業(yè)務不允許多次切換
七.keepalived高可用與Nginx集成
地址漂移實現(xiàn)高可用
nginx和keeplaived沒有關系?
nginx需要借助keeplaived? VIP? 地址漂移 實現(xiàn) 高可用.
八.如果Nginx宕機, 會導致用戶請求失敗, 但Keepalived并不會進行切換, 所以需要編寫一個腳本檢測Nginx的存活狀態(tài), 如果不存活則kill nginx和keepalived
1.判斷nginx進程是否存在 ps aux|grep nginx|grep -v grep
2.判斷nginx的端口是否存在 netstat -lntp|grep :80|wc -l
3.通過curl來模擬訪問,判斷訪問結(jié)果是否ok? curl -H Host:url.oldxu.com http://10.0.0.3
1.編寫腳本
[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調(diào)用該腳本
[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
}
#調(diào)用腳本名稱
track_script {
check_web
}
}

3.模擬nginx停止,檢查nginx是否會被拉起

4.模擬nginx故障,檢查keeplaived的VIP是否會漂移至備節(jié)點

九.keepalived高可用腦裂與故障解決?
腦裂(split-brain),指在一個高可用(HA)系統(tǒng)中,當聯(lián)系著的兩個節(jié)點斷開聯(lián)系時,本來為一個整體的系統(tǒng),分裂為兩個獨立節(jié)點,這時兩個節(jié)點開始爭搶共享資源,結(jié)果會導致系統(tǒng)混亂,數(shù)據(jù)損壞。
對于無狀態(tài)服務的HA,無所謂腦裂不腦裂;
但對有狀態(tài)服務(比如MySQL)的HA,必須要嚴格防止腦裂。
(但有些生產(chǎn)環(huán)境下的系統(tǒng)按照無狀態(tài)服務HA的那一套去配置有狀態(tài)服務,結(jié)果可想而知...)
master? 10.0.0.3
backup? 10.0.0.3
1.在備上編寫檢測腳本, 測試如果能ping通主并且備節(jié)點還有VIP的話則認為產(chǎn)生了腦列
[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.公有云要想實現(xiàn)負載均衡高可用-----> 購買的SLB? 自帶高可用
3.虛擬IP咋使--->真實的硬件環(huán)境: