Keepalived+Nginx高可用集羣

  Keepalived簡介html

  Keepalived的做用是檢測服務器的狀態,若是有一臺web服務器宕機,或工做出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使用其餘服務器代替該服務器的工做,當服務器工做正常後Keepalived自動將服務器加入到服務器羣中,這些工做所有自動完成,不須要人工干涉,須要人工作的只是修復故障的服務器。python

 

  keepalived工做原理nginx

  keepalived是以VRRP協議爲實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議web

虛擬路由冗餘協議,能夠認爲是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其餘機器的默認路由爲該vip),master會發組播,當backup收不到vrrp包時就認爲master宕掉了,這時就須要根據VRRP的優先級選舉一個backup當master。這樣的話就能夠保證路由器的高可用了。json

keepalived主要有三個模塊,分別是core、check和vrrp。core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各類檢查方式。vrrp模塊是來實現VRRP協議的。bash

  

  keepalived三個主要功能服務器

  管理LVS負載均衡軟件網絡

  實現LVS集羣節點的健康檢查中app

  做爲系統網絡服務的高可用性(failover)負載均衡

  PS:本次主要介紹高可用功能

  

  Keepalived安裝配置

  安裝環境查看

  本次試驗使用yum安裝

yum -y install keepalived

  查看版本

  配置文件爲/etc/keepalived/keepalived.conf

  全局配置文件

lobal_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 lb01
   vrrp_skip_check_adv_addr
#   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

  用來配置router_id(全局惟一) 以及郵箱等信息

  PS:配置郵件用於出現故障發送郵件,工做中這個工做通常交由監控軟件zabbix等負責,能夠不配置

  vrrp配置部分

vrrp_instance VI_1 {
    state MASTER            #設備狀態是主
    interface eth0           #綁定的網絡接口是eth0
    virtual_router_id 55        #虛擬路由ID 主備這個ID必須一致 
    priority 150                     #優先級數值越高優先級越高,備的優先級需低於此數值 
    advert_int 1            #主備同步間隔單位是秒
    authentication {
        auth_type PASS
        auth_pass 1111         #主備認證方式,主備密碼須要一致
    }
    virtual_ipaddress {        #虛擬IP地址以及綁定的網卡
        192.168.56.22/24 dev eth0 label eth0:1
    }
}

  用於配置主備狀態,接口,優先級,認證方式IP信息等

  

  高可用服務單實例實戰

  圖示

  192.168.56.11的keepalived配置

! Configuration File for keepalived

global_defs {
   notification_email {
     liuym@abc.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb01
#  vrrp_strict
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 55
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.56.22/24 dev eth0 label eth0:1
    }
}

  192.168.56.12的keepalived配置

! Configuration File for keepalived

global_defs {
   notification_email {
     liuym@abc.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb02
#  vrrp_strict
}

vrrp_instance VI_1 {
    state BACKEND
    interface eth0
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.56.22/24 dev eth0 label eth0:1
    }
}

  說明:router_id不同  

            主備狀態不同(一臺是MASTER一臺是BACKEDN在配置文件裏必須是大寫)

     優先級不同

  PS:vrrp_strict是默認的配置須要註釋,不然會致使VIP不通

   

  啓動keepalived驗證兩臺主機均啓動

 systemctl start keepalived

  192.168.56.11生產了虛擬IP

  192.168.56.12沒有虛擬IP

  中止主keepalived責備機接管虛擬VIP

  主節點沒有了虛擬VIP

  主節點再次啓動keepalived 由於主節點優先級別高又會自動接管虛擬VIP

 

  keepalived+nginx實現高可用集羣

  圖示以下

  1,對外提供的VIP是192.168.56.22

  2,其中正常工做是由11提供服務

  3,11宕機的狀況VIP會漂移至22主機,用戶無感知

  

  11和12主機分別安裝nginx並設置反向代理,這裏爲了方便僅僅反向代理一臺主機,生產中是有多臺主機的

  nginx.conf配置以下(兩臺主機nginx配置同樣反向代理了11的8080生產中是其餘應用的多臺主機)

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format access_log_json '{"user_ip":"$http_x_forwarded_for","lan_ip":"$remote_addr","log_time":"$time_iso8601","user_rqp":"$request","http_code":"$status","body_bytes_sent":"$body_bytes_sent","req_time":"$request_time","user_ua":"$http_user_agent"}';
    sendfile        on;
    keepalive_timeout  65;
    upstream www_server_pools {
        server 192.168.56.11:8080;
    }
    server {
        listen       192.168.56.22:80;
        server_name  www.liuym.com;
        access_log  /data/logs/nginx/http-access.log  access_log_json;
        error_log /data/logs/nginx/http-error.log;
        location / {
            proxy_pass http://www_server_pools;
            proxy_set_header Host $host;
            proxy_set_header x-Forwarded-For $remote_addr;
        }
    }
}

  注意這裏server_name指定了VIP加端口進行綁定,其餘配置爲nginx基礎知識

  客戶端設置hosts指向的ip是VIP192.168.56.22 生產中是DNS地址

  web界面經過域名訪問(這裏使用一個8080端口啓動的jenkins做爲示例)

  測試VIP漂移

  在master中止keepalived客戶端仍是能夠繼續訪問該頁面

 

  PS:備節點nginx配置了VIP綁定,可是實際主機並無該VIP在啓動nginx的時候會報錯

  解決辦法,修改內核參數/etc/sysctl.conf增長一條

net.ipv4.ip_nonlocal_bind = 1

  執行生效

sysctl -p

  

  默認狀況下是keepalived軟件是在對方宕機或者keepalived中止狀況下才接管業務,假如是主節點的Nginx業務有問題呢

  能夠寫一個腳本監控Nginx若是nginx中止服務就中止keepalived

  check_nginx.sh

#!/bin/bash
while true
    do
        if [ ` netstat -lntup|grep nginx|wc -l` -ne 1 ];then
	    systemctl stop keepalived
        fi
	    sleep 5
    done

  檢測若是nginx宕機則中止keepalived

  後臺運行便可

 sh check_nginx.sh &
相關文章
相關標籤/搜索