第一章:keepalived介紹
VRRP協議
目的就是為了解決靜態路由單點故障問題的
第二章: keepalived工作原理
2.1 作為系統網路服務的高可用功能(failover)
keepalived高可用功能實現的基本原理為:
兩臺主機同時安裝好keepalived軟體並啟動服務,開始正常工作時
角色為Master的主機獲得所有資源並對使用者提供服務
角色為Backup的主機作為Master主機的熱備;
當角色為Master的主機失效或出現故障時
角色為Backup的主機將自動接管Master主機的所有工作,包括接管VIP資源及相應資源服務
而當角色為Master的主機故障修復後,又會自動接管回他原來處理的工作
角色為Backup的主機則同時釋放Master主機失效時他接管的工作
此時,兩臺主機將恢復到啟動時各自的原始角色及工作狀態
2.2 什麼是VRRP
VRRP,全稱Virtual Router Redundancy Protocol,中文名為虛擬路由冗餘協議
VRRP的出現就是為了解決靜態路由的單點故障問題
VRRP是通過一種競選機制來將路由的任務交給某臺VRRP路由器的.
VRRP通過競選機制來實現虛擬路由器的功能,所有的協議報文都是通過IP多播(Multicast)包(預設的多播地址224.0.0.18)形式傳送的
虛擬路由器由VRID(範圍0-255)和一組IP地址組成,對外表現為一個周知的MAC地址,:00-00-5E-00-01-{VRID}.
所以,在一個虛擬路由器中,不管誰是Master,對外都是相同的MAC和IP(稱之為VIP).
客戶端主機並不需要因Master的改變修改自己的路由配置.對它們來說,這種切換是透明的.
在一組虛擬路由器中,只有作為Master的VRRP路由器會一直髮送VRRP廣播包,此時Backup不會搶佔Master
當Master不可用時,Backup就收不到來自Master的廣播包了,此時多臺Backup中優先順序最高的路由器會搶佔為Master.
這種搶佔是非常快速的(可能只有1秒甚至更少),以保證服務的連續性,處於安全性考慮,VRRP資料包使用了加密協議進行了加密.
2.3 面試的時候怎麼說
解答:
keepalived高可用對之間是通過VRRP通訊的,因此,我從VRRP開始給您講起.
1)VRRP,全稱Virtual Router Reduancy Protocol,中文名為虛擬路由器冗餘協議,VRRP的出現是為了解決靜態路由的單點故障,
2)VRRP是通過一種競選協議來將路由任務交給某臺VRRP路由器的,
3)VRRP用IP多播的方式,(預設多播地址(224.0.0.18))實現高可用對之間通訊.
4)工作時主節點發包,備節點接包,當備節點接收不到主節點發的包的時候,就啟動接管程式接管主節點的資源.備節點可以有多個,通過優先順序競選,但一般keepalived系統運維工作中都是一對.
5)VRRP使用了加密協議加密資料,但keepalived官方目前還是推薦用明文的方式配置認證型別和密碼.
介紹完了VRRP,接下來我在介紹一下keepalived服務的工作原理;
keepalived高可用對之間是通過VRRP進行通訊的,VRRP是通過競選機制來確定主備的,主的優先順序高於備,因此,工作時會優先獲得所有的資源,備節點處於等待狀態,當主掛了的時候,備節點就會接管主節點的資源,然後頂替主節點對外提供服務.
在keepalived服務對之間,只有作為主的伺服器會一直髮送VRRP廣播包,告訴備他還活著,此時備不會搶佔主,當主不可用時,即備監聽不到主傳送的廣播包時,就會啟動相關服務接管資源,保證業務的連續性,接管速度最快可以小於一秒
第三章: VRRP協議
VRRP通過競選機制來實現虛擬路由器的功能
所有的協議報文都是通過IP多播(Multicast)包
預設的多播地址224.0.0.18
VIP前提條件:
1.虛擬公網IP必須是真實可用的
2.虛擬公網IP不能重複
3.組播地址必須是可以通訊的
第四章:keepalived安裝配置
1.安裝keepalived
yum install keepalived -y
2.配置檔案解釋
global_defs {
router_id lb01 #設定路由ID,每個主機不一樣
}
vrrp_instance VI_1 { #設定VRRP組名,同一組組名相同
state MASTER #設定角色狀態,分為MASTER BACKUP
interface eth0 #VIP繫結的網路卡
virtual_router_id 50 #虛擬路由id,同一組一樣
priority 150 #權重,權重越高,優先順序越高
advert_int 1 #傳送組播間隔
authentication { #設定驗證,密碼為明文
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #設定的虛擬IP,這個虛擬IP必須是存在且合法且沒有被使用的。
10.0.0.3
}
}
3.lb01配置
[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
}
}
4.lb02配置
[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
}
}
5.啟動
systemctl start keepalived
6.測試
關掉任意一臺,觀察VIP是否會漂移
恢復MASTER觀察BACKUP的VIP是否會消失
第五章:腦裂現象
1.安裝抓包工具
yum install tcpdump -y
2.lb02抓包檢視
tcpdump -nn -i any host 224.0.0.18
3.lb02新開一個終端,然後開啟防火牆
systemctl start firewalld.service
4.lb02觀察抓包現象
觀察是否兩邊都有VIP
5.新增放行規則
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
systemctl reload firewalld
6.lb02觀察抓包現象
觀察是否兩邊都有VIP
第六章:keepalived雙主實驗
1.lb01配置檔案
[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
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
10.0.0.4
}
}
2.lb02配置檔案
[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
}
}
vrrp_instance VI_2 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
10.0.0.4
}
}
3.重啟keepalived並觀察現象
systemctl restart keepalived
第七章:keepalived結合nginx反向代理負載均衡
lb伺服器的Nginx配置:
注意!兩臺lb伺服器的Nginx配置一模一樣
1.備份原有配置
mkdir /backup
cd /etc/nginx/conf.d
mv * /backup
2.編寫Nginx配置檔案
[root@lb01 /etc/nginx/conf.d]# cat proxy.conf
upstream web_pools {
server 172.16.1.7;
server 172.16.1.8;
}
server {
listen 80;
server_name (www|bbs).mysun.com ;
location / {
proxy_pass http://web_pools;
include proxy_params;
}
}
3.測試並重啟nginx
nginx -t
systemctl restart nginx
lb伺服器的keepalived配置:
1.lb01的keepalived配置
[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
}
}
2.lb02的keepalived配置
[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
}
}
web伺服器配置:
注意!兩臺web伺服器配置一模一樣
1.nginx配置
[root@web01 ~]# cat /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.mysun.com;
location / {
root /code;
index www.html;
}
}
2.寫入測試檔案
echo "$(hostname)" >/code/index.html
第八章: 防裂腦指令碼
1.問題現象:
1.nginx掛了,但是keep還活著
2.兩邊都有VIP
2.思路:
解決nginx掛了問題:
1.編寫一個指令碼
- 啟動nginx
- 如果啟動2次都失敗了,停掉自己的keepalived
2.keepalived定時去呼叫這個指令碼
3.實現:
1.命令如何實現
systemctl start nginx
2.檢查nginx程式
[root@lb01 ~]# ps -ef|grep nginx|grep -v "grep"
root 1210 1 0 11:21 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 1211 1210 0 11:21 ? 00:00:00 nginx: worker process
[root@lb01 ~]# ps -ef|grep nginx|grep -v "grep"|wc -l
2
[root@lb01 ~]# ps -ef|grep nginx|grep -v "grep"|wc -l
0
指令碼內容:
[root@lb01 ~]# cat check_web.sh
!/bin/bash
nginx_status=$(ps -C nginx --no-header|wc -l)
if [[ ${nginx_status} == 0 ]]
then
systemctl start nginx &> /dev/null
sleep 1
nginx_status=$(ps -C nginx --no-header|wc -l)
if [[ ${nginx_status} == 0 ]]
then
systemctl stop keepalived
fi
fi
keepalived呼叫指令碼:
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 5
weight 50
}
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
}
track_script {
check_web
}
}
4.第二個問題:腦裂問題
兩邊都有VIP
現象:
2邊都有VIP
2邊Nginx都活著
對面的MASTER的Nginx還活著
curl -I -s -w "%{http_code}\n" -o /dev/null 10.0.0.5
但是我又有了VIP
ip a |grep "10.0.0.3"|wc -l
我就把自己幹掉
systemctl stop nginx
systemctl stop keepalived
指令碼內容:
[root@lb02 /server/scripts]# cat check_vip.sh
#!/bin/bash
master_status=$(curl -I -s -w "%{http_code}\n" -o /dev/null 10.0.0.5)
my_vip=$(ip a |grep "10.0.0.3"|wc -l)
if [ ${master_status} == 200 -a ${my_vip} == 1 ]
then
systemctl stop nginx
systemctl stop keepalived
fi
keepalived配置:
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
}
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 5
weight 50
}
vrrp_script check_vip {
script "/server/scripts/check_vip.sh"
interval 5
weight 50
}
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
}
track_script {
check_web
check_vip
}
}