keepalived+haproxy實現高可用和負載均衡

隨着用戶量的上升,系統須要使用keepalived,haproxy和VIP來實現負載均衡html

其中keepalived主要實現了高可用,在一臺haproxy機器當機以後能夠當即切換到備用機以保證集羣的高可用性。前端

不少同窗可能會有疑問,爲啥不選用nginx?這裏主要是出於如下幾種狀況綜合考慮得出的結論node

1.Nginx是工做在網絡的7層之上,不支持TCP協議的轉發,1.9 之後能夠經過stream模塊實現了tcp代理功能可是穩定性仍是有所欠缺。而公司現有的系統有部分協議是ICE的所以若是不支持TCP協議改動會比較大。linux

2.Nginx不支持健康檢查,雖而後來淘寶出了個nginx_upstream_check_module可是須要額外安裝插件,另外這個插件也只是支持http的不支持TCP的。因此有必定的侷限性。nginx

*什麼是健康檢查?簡單來講就是負載均衡服務器定時調用負載服務器某個HTTP接口或ping一下tpc端口檢查服務是否可用。這個對實現系統高可用很是有用,健康檢測能夠自定義腳原本檢測後端服務,這有利於那些常常出現假死,沒法經過常規判斷端口來檢測後臺是否正常的問題。 好比,RabbitMQ,業務程序自定義檢查等。目前HA支持3種形式檢查c++

1)經過監聽端口進行健康檢測 。這種檢測方式,haproxy只會去檢查後端server的端口,並不能保證服務的真正可用。web

例如:vim

listen http_proxy 0.0.0.0:80
        mode http
        cookie SERVERID
        balance roundrobin
        option httpchk
        server web1 192.168.1.1:80 cookie server01 check
        server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2
後端

2)經過URI獲取進行健康檢測 。檢測方式,是用過去GET後端server的的web頁面,基本上能夠表明後端服務的可用性。服務器

listen http_proxy 0.0.0.0:80
        mode http
        cookie SERVERID
        balance roundrobin
        option httpchk GET /index.html
        server web1 192.168.1.1:80 cookie server01 check
        server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2

3)經過request獲取的頭部信息進行匹配進行健康檢測 。這種檢測方式,則是基於高級,精細的一些監測需求。經過對後端服務訪問的頭部信息進行匹配檢測。 

listen http_proxy 0.0.0.0:80
        mode http
        cookie SERVERID
        balance roundrobin
        option httpchk HEAD /index.jsp HTTP/1.1\r\nHost:\ www.xxx.com
        server web1 192.168.1.1:80 cookie server01 check
        server web2 192.168.1.2:80 cookie server02 check inter 500 rise 1 fall 2

3.haproxy內置負載監控界面,能夠很清晰看到負載狀況。

這裏並非說Nginx比不上Haproyx只是相對而言Haproxy提供咱們想要的功能,並且無需安裝其它插件,相對而言比較簡單。所以綜合考慮咱們決定採用Haproyx+keepalive實現高可用。

 

下圖就是整個負載均衡的架構圖:

Haproxy安裝:

#下載
#http://www.haproxy.org/download/1.7/src/haproxy-1.7.8.tar.gz
#cd /data/nfs/download
#yum install gcc gcc-c++ autoconf automake -y

#安裝haproxy
tar -axf haproxy-* && cd ./haproxy-*
make TARGET=linux2628 ARCH=x86_64 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproyx
安裝成功後,查看版本
/usr/local/haproyx/sbin/haproxy -v

这里写图片描述

複製haproxy文件到/usr/sbin下 
由於下面的haproxy.init啓動腳本默認會去/usr/sbin下找,固然你也能夠修改,不過比較麻煩。

cp /usr/local/haproxy/sbin/haproxy /usr/sbin/

複製haproxy腳本,到/etc/init.d下

cp ./examples/haproxy.init /etc/init.d/haproxy
chmod 755 /etc/init.d/haproxy


建立系統帳號

useradd -r haproxy

建立配置文件

mkdir /etc/haproxy
vi /etc/haproxy/haproxy.cfg
在配置文件haproxy.cfg中添加以下設置:

#全局配置
global
    #設置日誌
    log 127.0.0.1 local3 info
    chroot /usr/local/haproxy
    #用戶與用戶組
    user haproxy
    group haproxy
    #守護進程啓動
    daemon
    #最大鏈接數
    maxconn 4000

#默認配置
defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000
    timeout client 50000
    timeout server 50000

#前端配置,http_front名稱可自定義
frontend http_front
    # 發起http請求道80端口,會被轉發到設置的ip及端口
    bind *:80
    #haproxy的狀態管理頁面,經過/haproxy?stats來訪問
    stats uri /haproxy?stats
    default_backend http_back

#後端配置,http_back名稱可自定義
backend http_back
    #負載均衡方式
    #source 根據請求源IP
    #static-rr 根據權重
    #leastconn 最少鏈接者先處理
    #uri 根據請求的uri
    #url_param 根據請求的url參數
    #rdp-cookie 據據cookie(name)來鎖定並哈希每一次請求
    #hdr(name) 根據HTTP請求頭來鎖定每一次HTTP請求
    #roundrobin 輪詢方式
    balance roundrobin
    #設置健康檢查頁面
    option httpchk GET /index.html
    #傳遞客戶端真實IP
    option forwardfor header X-Forwarded-For
    # inter 2000 健康檢查時間間隔2秒
    # rise 3 檢測多少次才認爲是正常的
    # fall 3 失敗多少次才認爲是不可用的
    # weight 30 權重
    # 須要轉發的ip及端口
    server node1 192.168.179.131:8081 check inter 2000 rise 3 fall 3 weight 30
    server node2 192.168.179.131:8082 check inter 2000 rise 3 fall 3 weight 30
 

 

keepalive安裝

yum -y install keepalived
vim /etc/keepalived/keepalived.conf

global_defs {

    notification_email {  

     root@localhost  

   }  

   notification_email_from root@localhost  

   smtp_server localhost  

   smtp_connect_timeout 30  

   router_id  NodeA 

}

 

 

vrrp_instance VI_1 {  

    state MASTER   #指定A節點爲主節點 備用節點上設置爲BACKUP便可  

    interface eth0   #綁定虛擬IP的網絡接口  

    virtual_router_id 51  #VRRP組名,兩個節點的設置必須同樣,以指明各個節點屬於同一VRRP組  

    priority 100   #主節點的優先級(1-254之間),備用節點必須比主節點優先級低  

    advert_int 1   #組播信息發送間隔,兩個節點設置必須同樣  

    authentication {   #設置驗證信息,兩個節點必須一致  

        auth_type PASS  

        auth_pass 1111  

    }  

    virtual_ipaddress {   #指定虛擬IP, 兩個節點設置必須同樣  

        192.168.1.220

    }  

}

interface eth0  這個的網卡名稱必定別弄錯了,要弄成本身的。可使用 ip a 命令查看

啓動keepalive

/etc/init.d/keepalived start

相關文章
相關標籤/搜索