第一章 Keepalived簡介
Keepalived軟件起初是專爲LVS負載均衡軟件設計的,用來管理並監控LVS集羣系統中各個服務節點的狀態,後來又加入了可以實現高可用的VRRP功能。因此,Keepalived除了能夠管理LVS軟件外,還可以作爲其它服務(例如nginx、Haproxy、MySQL等)的高可用解決方案軟件。
Keepalived軟件主要是通過VRRP協議實現高可用功能的,VRRP是Virtual Router Redundancy Protocol(虛擬路由器冗餘協議)的縮寫,VRRP出現的目的就是爲了解決靜態路由單點故障問題的,它能夠保證當別的節點宕機時,整個網絡可以不間斷的運行。所以Keepalived一方面具有配置管理LVS的功能,同時還具有LVS下面節點進行健康檢查的功能,另一方面也可實現系統網絡服務的高可用功能。
第二章 Keepalived服務三個重要功能
1. 管理LVS負載均衡軟件
早期的LVS軟件,需要通過命令行或腳本實現管理,並且沒有針對LVS節點的健康檢查功能。爲了解LVS的這些使用不便的問題, Keepalived就誕生了,可以說Keepalived軟件起初是專爲解決LVS的問題而誕生的。因此Keepalived和LVS的感情很深,可以緊密的結合,愉快的工作。Keepalived可以通過讀取自身的配置文件實現通過更底層的接口直接管理LVS的配置以及控制服務的啓動、停止等功能,這使得LVS的應用更加簡單方便了。
2. 實現對LVS集羣節點健康檢查功能(healthcheck)
Keepalived可以通過自身的keepalived.conf文件裏配置LVS的節點IP和相關參數實現對LVS的直接管理;除此之外,當LVS集羣中的某一個甚至幾個節點服務器同時發生故障無法提供服務時,Keepalived服務會自動將失效的節點服務器從LVS的正常轉發隊列中清楚出去,並轉換到別的正常節點服務器上,從而保證最終用戶的訪問不受影響;當故障的節點服務器被修復以後,Keepalived服務又會自動地把他們加入到正常轉發隊列中,對客戶提供服務。
3. 作爲系統服務的高可用功能(failover)
第三章 VRRP工作原理
- VRRP協議,全稱Virtual Router RedundancyProtocol,中文名爲虛擬路由冗餘協議,VRRP的出現是爲了解決靜態路由點單故障。
- VRRP是通過一種競選協議機制來將路由任務交給某臺VRRP路由器的。
- VRRP是用過IP多播的方式(默認多播地址224.0.0.18)實現高可用對之間通信的。
- 工作時主節點發包,備節點接包,當備節點接收不到主節點發的數據包的時候,就啓動接管程序接管主節點的資源。備節點可以有多個,通過優先級競選,但一般Keepalived系統運維工作中都是一對。
- VRRP使用了加密協議加密數據,但Keepalived官方目前還是推薦用明文的方式配置認證類型和密碼。
第四章 安裝Keepalived環境
1. 使用yum源下載
yum install keepalived -y
! 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 LVS_DEVEL
}
vrrp_instance VI_1 { ##主 backup備
state MASTER ##主 backup備
interface ens33 ##組名 家庭名
virtual_router_id 51 ##weight 相當於權重 主大於備 一般爲100
priority 150 ##發送間隔時間 1s
advert_int 1
authentication {
auth_type PASS ##認證類型密碼
auth_pass 1111 ##密碼
}
virtual_ipaddress {
10.0.0.1/24 dev ens33 label ens33:0 ##vip地址 虛擬IP地址
}
}
第五章 LB01/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
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 dev eth0 label eth0:1
}
}
第六章 LB02/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL1
}
vrrp_instance VI_1 {
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 dev eth0 label eth0:1
}
}
第七章 導致腦裂發生的原因
- 高可用服務器對之間心跳線鏈路故障,導致無法正常通信,例如1) 心跳線壞了(包括斷了,老化),2) 網卡及相關驅動壞了,IP配置及衝突問題(網卡直連),3) 心跳線間連接的設備故障(網卡交換機等)。
- 高可用服務器對上開啓了iptables防火牆阻擋了心跳消息傳輸。
- 高可用服務器對上心跳網卡地址等信息配置不正確,導致發送心跳失敗。
- 其他服務配置不當等原因,如心跳方式不同,心跳廣播衝突、軟件BUG等。
提示:keepalived配置裏統一VRRPVirtual_router_id參數兩端配置不一致,也會導致腦裂問題發生。
第八章 配置文件LB01LB02 nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream server_pools {
server 10.0.0.7:80 weight=4 max_fails=3 fail_timeout=30s;
server 10.0.0.8:80 weight=4 max_fails=3 fail_timeout=30s;
# server 10.0.0.9:80 weight=4 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name www.etiantian.org;
location / {
proxy_pass http://server_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
server {
listen 80;
server_name bbs.etiantian.org;
location / {
proxy_pass http://server_pools;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}
第九章 web01 nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 80;
server_name www.etiantian.org;
location / {
root html/www;
index index.html index.htm;
}
access_log logs/access_www.log main;
}
server {
listen 80;
server_name bbs.etiantian.org;
location / {
root html/bbs;
index index.html index.htm;
}
access_log logs/access_bbs.log main;
}
}
第十章 web02 nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 80;
server_name www.etiantian.org;
location / {
root html/www;
index index.html index.htm;
}
access_log logs/access_www.log main;
}
server {
listen 80;
server_name bbs.etiantian.org;
location / {
root html/bbs;
index index.html index.htm;
}
access_log logs/access_bbs.log main;
}
}
第十一章 keepalived雙主模式配置文件
1. LB01配置keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
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 dev eth0 label eth0:1
}
}
vrrp_instance VI_2 {
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 dev eth0 label eth0:2
}
}
2. LB02 配置keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL1
}
vrrp_instance VI_1 {
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 dev eth0 label eth0:1
}
}
vrrp_instance VI_2 {
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 dev eth0 label eth0:2
}
}
第十二章 監聽本機沒有的網卡ip 修改內核參數
echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
sysctl -p
第十三章 執行監控腳本nginx關閉則停止keepalived
cat /server/scripts/chk_web_proxy.sh
if [ `ss -lntup|grep nginx|wc -l` -ne 1 ];then
/etc/init.d/keepalived stop
fi
chmod +x /server/scripts/chk_web_proxy.sh
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_web_proxy { #<==定義vrrp腳本,檢測HTTP端口。
script "/server/script/chk_web_proxy.sh" #<==執行腳本,當nginx服務有問題,就停掉keepalived服務。
interval 2 #<==間隔2秒
weight 2
}
vrrp_instance VI_1 {
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 dev eth0 label eth0:1
}
track_script {
chk_web_proxy #<==觸發檢查
}
}