keepalive
keepalive起初專門為lvs負載均衡軟件設計的,用來管理監控lvs集群系統中各個服務節點的狀態,后來又加入了可以實現高可用的vrrp功能。
keepalive軟件通過vrrp協議實現高可用功能的。VRRP(虛擬路由器冗余協議)目的就是為了解決靜態路由單點故障問題,競選機制來將路由的任務交給某台VRRP路由器的,保證節點宕機,整個網絡可以不間斷的運行
Keepalived可以實現任意兩台主機之間,例如Master和Backup主機之間的故障轉移和自動切換,這個主機可以是普通的不能停機的業務服務器,也可以是LVS負載均衡、Nginx反向代理這樣的服務器。
Keepalived高可用簡單原理
master端的vrrp路由器會一直發送vrrp廣播包,buckup會一直收到廣播包,buckup不會搶占master資源,在backup上會一直監聽,一旦收不到master的包,在多台backup中優先級最高的就會搶占為master
keepalive服務的三個重要功能
1、 管理LVS負載均衡軟件
2、 實現對LVS集群節點健康檢查功能
3、 作為系統網絡服務的高可用功能
1、keepalive的配置文件
! Configuration File for keepalived global_defs { #全局定義 notification_email { #出問題了收件人 acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Cassen@firewall.loc #發件人 smtp_server 192.168.200.1 #發件服務器地址 smtp_connect_timeout 30 #超時時間 router_id LVS_DEVEL #唯一標識,不同機器不能一樣 } vrrp_instance VI_1 { #vrrp實例,名字可以自定義,與前面關鍵字空格隔開 state MASTER #標識是主還是備,一定要大寫 interface eth0 #默認的通信的接口,當vip不指定時,默認綁定它 virtual_router_id 51 #實例的ID(主備必須一樣,同一文件唯一,0-255) priority 100 #真正確定誰優先地方,數字越大,級別越高,越先獲取資源,建議隔50 advert_int 1 #心跳間隔 authentication { #實例認證,主備一樣 auth_type PASS auth_pass 1111 } virtual_ipaddress { #VIP地址 192.168.200.16 192.168.200.18/24 dev eth0 label eth0:1 } }
2、keepalive+nginx雙主實戰
2.1、nginx配置
在實際工作中有三個域名
www.etiantian.org
blog.etiantian.org
bbs.etiantian.org
它們的訪問量都很大,可以配置不同的ip來結合keepalived進行負載,先用兩個域名來測試:
10.0.0.3 www.etiantian.org 10.0.0.4 blog.etiantian.org
目地:在初始階段,兩不不同域名的服務跑在不同的機器上,(實際是互為主備的配置)
lb1: 10.0.0.3 www.etiantian.org lb2: 10.0.0.4 blog.etiantian.org
keepaived沿用上面互為主備的配置
以下是nginx的配置(分別在兩台lb上做)
所需要做的就是監聽ip
[root@LB01 conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream backend { server 172.16.1.8:80 weight=1; server 172.16.1.7:80 weight=1; check interval=3000 rise=2 fall=5 timeout=1000 type=http; } server { listen 10.0.0.3:80; #這里要監聽ip server_name blog.etiantian.org; location / { proxy_pass http://backend; #這加一定要加這個拋的字段,否則訪問就訪問成負載的主頁了 include proxy.conf; } location /status { check_status; access_log off; } } server { listen 10.0.0.4:80; server_name blog.etiantian.org; location / { proxy_pass http://backend; include proxy.conf; } location /status { check_status; access_log off; } } }
2.2、keepalive配置文件
LB01:
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf global_defs { notification_email { 490238852@qq.com } notification_email_from 490238852@qq.com smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_lb01 } 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 } }
LB02:
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { 490238852@qq.com } notification_email_from 490238852@qq.com smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_lb02 } 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 } }
3、腦裂原因
一般來說腦裂問題有以下這幾種原因:
- 高可用服務器對之間心跳線鏈路發生故障,導致無法正常通信
心跳線壞了(包括斷了,老化)、
網卡及相關驅動壞了,IP配置及沖突問題(網卡直連)
心跳線之間的設備故障(網卡及交換機)、
仲裁的機器出現問題(才用仲裁的方案)
- 高可用服務器上開啟了iptables防火牆,阻止了心跳傳消息輸
- 高可用服務器上心跳網卡地址等信息配置不正確,導致發送心跳失敗
- 其他服務配置不當的原因,如心跳方式不同,心跳廣播沖突,軟件bug等
提示keepalive配置里同一VRRP實例如果virtual_router_id兩端參數配置不一致,也會導致腦裂問題
4、腦裂方案
在實際生產環境中,我們從以下方面防止腦裂:
- 同時使用串行電纜和以太網電纜連接、同時使用兩條心跳線路,這樣一條線路斷了,另外一條還是好的,依然能傳送心跳消息
- 當檢查腦裂時強行關閉一個心跳節點(這個功能需要特殊設備支持,如stonith、fence)相當於備節點接收不到心跳消息,通過單獨的線路發送關機命令關閉主節點的電源
- 做好對腦裂的監控報警
解決常見方案:
- 如果開啟防火牆,一定要讓心跳消息通過,一般通過允許IP段的形式解決
- 可以拉一條以太網網線或者串口線作為主被節點心跳線路的冗余
- 開發檢測程序通過監控軟件檢測腦裂
5、nginx配置文件監聽的網卡上不存在IP地址問題
報錯:
[root@LB01 conf]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.6.3/conf/nginx.conf syntax is ok nginx: [emerg] bind() to 10.0.0.4:80 failed (99: Cannot assign requested address) nginx: configuration file /application/nginx-1.6.3/conf/nginx.conf test failed
配置好后,出現無法綁定ip10.0.0.4:80,這是由於本地沒有這個ip造成的,而這個ip是需要keepalived來生的,這樣就無法進行配置nginx。
解決方法:
echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
sysctl -p #生效
通過這個命令,系統就允許配置一個當前不存在的輔助ip
[root@LB01 ~]# /application/nginx/sbin/nginx -s stop #平滑重啟沒用,要關掉重啟 [root@LB01 ~]# /application/nginx/sbin/nginx [root@LB01 ~]# netstat -ntpl|grep nginx tcp 0 0 10.0.0.4:80 0.0.0.0:* LISTEN 7431/nginx tcp 0 0 10.0.0.3:80 0.0.0.0:* LISTEN 7431/nginx
用來訪問的機器上做解析訪問檢查
vim /etc/hosts
10.0.0.3 www.etiantian.org
10.0.0.4 blog.etiantian.org
用戶在進行訪問體驗是沒有什么不同的,web服務器也沒有一點變動,只是實現了負載均衡器流量的分流,
這樣做的好處是平均負載的壓力,但是注意的是負載的能力,因為當其中一台宕機了,另一台馬上起另一個vip接管資源,壓力太大就是雪崩。
6、開發監聽腦裂的腳本
keepalived是服務器級別的,只監控服務器,nginx宕機了,是沒有辦法接管的
cat /server/scripts/check_nginx_by_keep.sh #!/bin/sh while true do if [ `netstat -lntup|grep nginx|wc -l` -ne 1 ];then /etc/init.d/keepalived stop fi sleep 5 done
當負載器上出現nginxr的監聽ip大於1時(或寫做-eq 0 ,即等於0時),就殺掉keepalived進程,這樣來實現web服務如nginx掛掉接管資源
7、指定日志輸出文件
1、/etc/sysconfig/keepalived
修改為 KEEPALIVED_OPTIONS="-D -d -S 0"
2、/etc/rsyslog.conf
修改為 *.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages
最后加 local0.* /var/log/keepalived.log
3、重啟
/etc/init.d/rsyslog restart
/etc/init.d/keepalived restart