keepalive起初專門爲lvs負載均衡軟件設計的,用來管理監控lvs集羣系統中各個服務節點的狀態,後來又加入了能夠實現高可用的vrrp功能。nginx
keepalive軟件經過vrrp協議實現高可用功能的。VRRP(虛擬路由器冗餘協議)目的就是爲了解決靜態路由單點故障問題,競選機制來將路由的任務交給某臺VRRP路由器的,保證節點宕機,整個網絡能夠不間斷的運行web
Keepalived能夠實現任意兩臺主機之間,例如Master和Backup主機之間的故障轉移和自動切換,這個主機能夠是普通的不能停機的業務服務器,也能夠是LVS負載均衡、Nginx反向代理這樣的服務器。vim
Keepalived高可用簡單原理服務器
master端的vrrp路由器會一直髮送vrrp廣播包,buckup會一直收到廣播包,buckup不會搶佔master資源,在backup上會一直監聽,一旦收不到master的包,在多臺backup中優先級最高的就會搶佔爲master網絡
keepalive服務的三個重要功能app
一、 管理LVS負載均衡軟件負載均衡
二、 實現對LVS集羣節點健康檢查功能tcp
三、 做爲系統網絡服務的高可用功能測試
! 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 } }
在實際工做中有三個域名spa
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; } } }
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 } }
通常來講腦裂問題有如下這幾種緣由:
心跳線壞了(包括斷了,老化)、
網卡及相關驅動壞了,IP配置及衝突問題(網卡直連)
心跳線之間的設備故障(網卡及交換機)、
仲裁的機器出現問題(才用仲裁的方案)
提示keepalive配置裏同一VRRP實例若是virtual_router_id兩端參數配置不一致,也會致使腦裂問題
在實際生產環境中,咱們從如下方面防止腦裂:
解決常見方案:
報錯:
[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接管資源,壓力太大就是雪崩。
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掛掉接管資源
一、/etc/sysconfig/keepalived
修改成 KEEPALIVED_OPTIONS="-D -d -S 0"
二、/etc/rsyslog.conf
修改成 *.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages 最後加 local0.* /var/log/keepalived.log 三、重啓 /etc/init.d/rsyslog restart /etc/init.d/keepalived restart