keepalive和腦裂問題

keepalive

 

       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

  三、  做爲系統網絡服務的高可用功能測試

一、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
    }
}

二、keepalive+nginx雙主實戰

2.一、nginx配置

在實際工做中有三個域名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;
        }
    }
}

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
    }
}

 

三、腦裂緣由

通常來講腦裂問題有如下這幾種緣由:

  1. 高可用服務器對之間心跳線鏈路發生故障,致使沒法正常通訊

心跳線壞了(包括斷了,老化)、

網卡及相關驅動壞了,IP配置及衝突問題(網卡直連)

心跳線之間的設備故障(網卡及交換機)、

仲裁的機器出現問題(才用仲裁的方案)

  1. 高可用服務器上開啓了iptables防火牆,阻止了心跳傳消息輸
  2. 高可用服務器上心跳網卡地址等信息配置不正確,致使發送心跳失敗
  3. 其餘服務配置不當的緣由,如心跳方式不一樣,心跳廣播衝突,軟件bug等

提示keepalive配置裏同一VRRP實例若是virtual_router_id兩端參數配置不一致,也會致使腦裂問題

四、腦裂方案

在實際生產環境中,咱們從如下方面防止腦裂:

  1. 同時使用串行電纜和以太網電纜鏈接、同時使用兩條心跳線路,這樣一條線路斷了,另一條仍是好的,依然能傳送心跳消息
  2. 當檢查腦裂時強行關閉一個心跳節點(這個功能須要特殊設備支持,如stonith、fence)至關於備節點接收不到心跳消息,經過單獨的線路發送關機命令關閉主節點的電源
  3. 作好對腦裂的監控報警

解決常見方案:

  1. 若是開啓防火牆,必定要讓心跳消息經過,通常經過容許IP段的形式解決
  2. 能夠拉一條以太網網線或者串口線做爲主被節點心跳線路的冗餘
  3. 開發檢測程序經過監控軟件檢測腦裂

五、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接管資源,壓力太大就是雪崩。

 

六、開發監聽腦裂的腳本

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

相關文章
相關標籤/搜索