1. 程式人生 > >keepalive和腦裂問題

keepalive和腦裂問題

pro pst 1.8 定時 後來 原因 cat 之間 ges

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 {                              #出問題了收件人
       [email protected]
       [email protected]
       [email protected]
   }
   notification_email_from [email protected]        #發件人
   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、腦裂原因

一般來說腦裂問題有以下這幾種原因:

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

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

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

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

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

  1. 高可用服務器上開啟了iptables防火墻,阻止了心跳傳消息輸
  2. 高可用服務器上心跳網卡地址等信息配置不正確,導致發送心跳失敗
  3. 其他服務配置不當的原因,如心跳方式不同,心跳廣播沖突,軟件bug等

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

4、腦裂方案

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

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

解決常見方案:

  1. 如果開啟防火墻,一定要讓心跳消息通過,一般通過允許IP段的形式解決
  2. 可以拉一條以太網網線或者串口線作為主被節點心跳線路的冗余
  3. 開發檢測程序通過監控軟件檢測腦裂

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

keepalive和腦裂問題