內(nèi)容涉及
高可用原理
高可用配置文件
高可用服務(wù)常見問題
實現(xiàn)高可用服務(wù)雙主功能
keepalivd----------->解決單點故障
作用:
01. 利用keepalived軟件管理配置lvs
02. 利用keepalived軟件可以配合lvs對后端節(jié)點進行健康檢查(后端的服務(wù))
03. 利用keepalived實現(xiàn)高可用功能
keepalived原理:
利用vrrp(虛擬路由冗余協(xié)議)協(xié)議實現(xiàn)高可用功能
vrrp抓包信息
原理圖:
- 確保負載均衡服務(wù)器和后端web集群可以通信
- 安裝keepalived軟件后兩臺主機VRRP進行通訊
- 通過VRRP協(xié)議根據(jù)優(yōu)先級去競選主備
- 主不間斷向所有備機發(fā)送組播包224.0.0.18(組播包可以加密片仿,推薦不要加密括儒。)
- 主機會生成一個vip,當主機宕機的話會飄逸到備機上。
- 如果主機恢復的話谣沸,根據(jù)優(yōu)先級重新恢復為主機。
keepalived服務(wù)部署過程
第一個歷程: web集群節(jié)點進行配置
www.conf
server {
listen 80;
server_name www.oldboy.com;
location / {
root /html/www;
index index.php oldboy.jpg index.html index.htm;
}
location ~ \.php$ {
root /html/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
測試lb01lb02能否正常的文本
web01
echo "www.oldboy.com web01" >/html/www/oldboy.html
web02
echo "www.oldboy.com web02" >/html/www/oldboy.html
web03
echo "www.oldboy.com web03" >/html/www/oldboy.html
負載均衡 lb01 lb02 進行web集群節(jié)點測試
[root@lb01 ~]# curl -H host:www.oldboy.com 10.0.0.7/oldboy.html
www.oldboy.com web01
[root@lb01 ~]# curl -H host:www.oldboy.com 10.0.0.8/oldboy.html
www.oldboy.com web02
[root@lb01 ~]# curl -H host:www.oldboy.com 10.0.0.9/oldboy.html
www.oldboy.com web03
[root@lb02 ~]# curl -H host:www.oldboy.com 10.0.0.7/oldboy.html
www.oldboy.com web01
[root@lb02 ~]# curl -H host:www.oldboy.com 10.0.0.8/oldboy.html
www.oldboy.com web02
[root@lb02 ~]# curl -H host:www.oldboy.com 10.0.0.9/oldboy.html
www.oldboy.com web03
第二個歷程: 安裝部署keepalived服務(wù)
yum install -y keepalived
第三個歷程: 編寫keepalived配置文件
lb01 配置信息
vim /etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { --- 全局配置區(qū)域
notification_email { --- 當主服務(wù)器發(fā)生變化進行郵件通知
330882721@qq.com
}
notification_email_from 17778058507@163.com
smtp_server smtp.163.com
smtp_connect_timeout 30
router_id lb01 --- 表示高可用集群中節(jié)點身份信息(相當于ospf router id )
}
vrrp_instance oldboy { --- vrrp實例配置區(qū)域 家族
state MASTER --- 說明標識服務(wù)器為主服務(wù)器 (MASTER BACKUP)
interface eth0 --- 指定vip地址出現(xiàn)在哪個網(wǎng)卡上
virtual_router_id 62 --- 家族標識 62
priority 150 --- 決定服務(wù)器是否是主服務(wù)器 優(yōu)先級越高越有可能成為主
advert_int 1 --- 間隔1s鐘發(fā)送一個組播包,主備要一致
authentication { --- 身份認證 認證主服務(wù)真實性
auth_type PASS
auth_pass 1234
}
virtual_ipaddress { --- 生成虛擬IP地址信息
10.0.0.3
}
}
實際配置
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id lb01
}
vrrp_instance oldboy {
state MASTER
interface eth0
virtual_router_id 62
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.0.0.3
}
}
lb02 配置信息
vim /etc/keepalived/keepalived.conf
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { --- 全局配置區(qū)域
notification_email { --- 當主服務(wù)器發(fā)生變化進行郵件通知
330882721@qq.com
}
notification_email_from 17778058507@163.com
smtp_server smtp.163.com
smtp_connect_timeout 30
router_id lb02 --- 表示高可用集群中節(jié)點身份信息
}
vrrp_instance oldboy { --- vrrp實例配置區(qū)域 家族
state BACKUP --- 說明標識服務(wù)器為主服務(wù)器 (MASTER BACKUP)
interface eth0 --- 指定vip地址出現(xiàn)在哪個網(wǎng)卡上
virtual_router_id 62 --- 家族標識 62
priority 100 --- 決定服務(wù)器是否是主服務(wù)器 優(yōu)先級越高越有可能成為主
advert_int 1 --- 間隔1s鐘發(fā)送一個組播包
authentication { --- 身份認證 認證主服務(wù)真實性
auth_type PASS
auth_pass 1234
}
virtual_ipaddress { --- 生成虛擬IP地址信息
10.0.0.3
}
}
實際配置
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id lb02
}
vrrp_instance oldboy {
state BACKUP
interface eth0
virtual_router_id 62
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.0.0.3
}
}
測試:
將lb01將掛起掂为,模仿lb01宕機啡邑,查看lb02能否正常提供負載服務(wù)。
高可用服務(wù)常見問題:
腦裂問題
出現(xiàn)原因:
- a 服務(wù)配置問題: vrrp實例配置 (組播包發(fā)送)
- b 有安全策略影響主備通訊:
- c 物理線路出現(xiàn)問題 連接線路(心跳線)
總結(jié): 備服務(wù)器收不到主服務(wù)器發(fā)送的vrrp組播包
解決問題的方法:
- a. 利用系統(tǒng)日志查看主備通訊問題
tail -f /var/log/messages - b. 利用防火墻命令, 配置允許組播包通過策略
- c. 多個心跳線做冗余
- d .監(jiān)控及時報警:()
備服務(wù)器有vip出現(xiàn),幾種情況:
1) 正常主備切換
2) 出現(xiàn)腦裂
編寫腳本刚操,當檢測到備服務(wù)器有虛擬IP時及時報警
vi /server/scripts/inotify_vip.sh
#!/bin/bash
ip a s eth0|grep "10.0.0.3" &>/dev/null
if [ $? -eq 0 ]
then
echo "備服務(wù)器產(chǎn)生的vip地址,請關(guān)注"|mail -s "keepalived_error" 330882721@qq.com
fi
vi /etc/mail.rc進行設(shè)置
systemctl restart postfix.service
負載均衡服務(wù)出現(xiàn)異常,高可用服務(wù)無法實現(xiàn)切換
負載均衡服務(wù)活著---keepalived服務(wù)活著
負載均衡服務(wù)死了---keepalived殉情
編寫腳本
vim check_lb.sh
#!/bin/bash
count=$(ps -ef|grep -c [n]ginx) #grep隨便加一個[]就把grep過濾的行也給去掉
if [ $count -lt 2 ]
then
systemctl stop keepalived
fi
只要nginx服務(wù)停止, 就立即切換
/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id lb01
}
vrrp_script check_web { --- 定義監(jiān)控腳本信息
script "/server/scripts/check_lb.sh" --- 指定監(jiān)控執(zhí)行的腳本
interval 2 --- 腳本執(zhí)行間隔周期
weight 2
}
vrrp_instance oldboy {
state MASTER
interface eth0
virtual_router_id 62
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.0.0.3
}
track_script {
check_web ------調(diào)用這個腳本
}
}
確認腳本有執(zhí)行權(quán)限
chmod +x /server/scripts/check_lb.sh
keepalived服務(wù)需要進行重啟
keepalived權(quán)重配置
權(quán)重數(shù)值: 正數(shù)
- 判斷腳本: 執(zhí)行結(jié)果信息
腳本執(zhí)行為真(成功) 腳本返回值為0
優(yōu)先級+weight求和運算
腳本執(zhí)行為假(失敗) 腳本返回不為0
優(yōu)先級不變
權(quán)重數(shù)值: 負數(shù)
-
判斷腳本: 執(zhí)行結(jié)果信息
腳本執(zhí)行為真(成功) 腳本返回值為0
優(yōu)先級不變
腳本執(zhí)行為假(失敗) 腳本返回不為0
優(yōu)先級-weight 求差運算
需求01: 當lb01 nginx服務(wù)停止, 將資源切換到lb02, 當lb01 nginx恢復, 自動搶占資源
nginx服務(wù)停止 lb01<lb02
腳本為假
優(yōu)先級-weight < lb02nginx服務(wù)恢復 lb01>lb02
腳本為真
優(yōu)先級 > lb02
測試代碼:
if [ $count -lt 2 ]
then
exit 1
else
exit 0
fi
調(diào)整權(quán)重值
01. 調(diào)整權(quán)重值
02. 調(diào)整優(yōu)先級
提高負載均衡服務(wù)安全性
第一個歷程: 修改lb01 lb02 nginx配置文件
lb01 -- 主
server {
listen 10.0.0.3:80;#監(jiān)聽地址必須為本地網(wǎng)卡監(jiān)聽地址
server_name localhost;
include proxy_params;
location / {
proxy_pass http://default;
}
}
systemctl restart nginx-------->不能reload重啟服務(wù)
lb02 -- 備
server {
listen 10.0.0.3:80;
server_name localhost;
include proxy_params;
location / {
proxy_pass http://default;
}
}
systemctl restart nginx
可以修改內(nèi)核,讓服務(wù)監(jiān)聽沒有的地址
解決方法:
echo 'net.ipv4.ip_nonlocal_bind = 1' >>/etc/sysctl.conf
##/etc/sysctl.conf 加上
sysctl -p
利用高可用服務(wù)實現(xiàn)雙主配置
原因:解決多個網(wǎng)站都通過一個負載均衡設(shè)備增加了一臺負載均衡設(shè)備的壓力。
可以實現(xiàn)不同的網(wǎng)站走不同的負載設(shè)備再芋。
第一個歷程: 修改keepalived配置文件
lb01 修改
vrrp_instance oldboy {
state MASTER
interface eth0
virtual_router_id 62
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.0.0.3
}
}
vrrp_instance oldgirl {
state BACKUP
interface eth0
virtual_router_id 63
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.0.0.4
}
}
lb02 修改
vrrp_instance oldboy {
state BACKUP
interface eth0
virtual_router_id 62
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.0.0.3
}
}
vrrp_instance oldgirl {
state MASTER
interface eth0
virtual_router_id 63
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.0.0.4
}
}
第二個歷程: 修改lb01/02nginx配置文件
26 server {
27 listen 10.0.0.3:80;
28 server_name www.oldboy.com;
29 include proxy_params;
30 location / {
31 proxy_pass http://default;
32 }
33 }
34 server {
35 listen 10.0.0.4:80;
36 server_name bbs.oldboy.com;
37 include proxy_params;
38 location / {
39 proxy_pass http://default;
40 }
41 }