HaProxy+keepalived實現負載均衡

 

HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速而且可靠的一種解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點一般又須要會話保持或七層處理。HAProxy運行在當前的硬件上,徹底能夠支持數以萬計的併發鏈接。而且它的運行模式使得它能夠很簡單安全的整合進您當前的架構中,同時能夠保護你的web服務器不被暴露到網絡上.前端

   haproxy 配置中分紅五部份內容,分別以下:node

一、global:參數是進程級的,一般是和操做系統相關。這些參數通常只設置一次,若是配置無誤,就不須要再次進行修改web

二、defaults:配置默認參數,這些參數能夠被用到frontend,backend,Listen組件算法

三、frontend:接收請求的前端虛擬節點,Frontend能夠更加規則直接指定具體使用後端的backendvim

四、backend:後端服務集羣的配置,是真實服務器,一個Backend對應一個或者多個實體服務器後端

五、Listen Fronted和backend的組合體安全

 

HAProxy負載均衡策略很是多,HAProxy的負載均衡算法如今具體有以下8種:bash

① roundrobin,表示簡單的輪詢,這個很少說,這個是負載均衡基本都具有的;服務器

② static-rr,表示根據權重,建議關注;cookie

③ leastconn,表示最少鏈接者先處理,建議關注;

④ source,表示根據請求源IP,這個跟Nginx的IP_hash機制相似,咱們用其做爲解決session問題的一種方法,建議關注;

⑤ ri,表示根據請求的URI;

⑥ rl_param,表示根據請求的URl參數’balance url_param’ requires an URL parameter name;

⑦ hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求;

⑧ rdp-cookie(name),表示根據據cookie(name)來鎖定並哈希每一次TCP請求。

 

                    192.168.1.90

             +-----------VIP----------+  

             |                        |

             |                        |

           Master                   Backup

        192.168.0.110            192.168.0.111

        +----------+             +----------+

        | HAProxy  |  ß------à | HAProxy  |

        |keepalived|             |keepalived|

        +----------+             +----------+

             | 

             v 

    +-----------+---------+

    |           |         |

    |           |         |

    v           v         v

+--------+  +-------+  +-------+

| Docker |  | Docker | | Docker |

|  WEB1  |  |  WEB2 | |  WEB3  |

+--------+  +-------+  +-------+

 

 

安裝HAProxy,KeepAlived

add-apt-repository ppa:vbernat/haproxy-1.5

apt-get update

apt-get install haproxy

 

修改配置

sudo vim /etc/haproxy/haproxy.cfg

 

global

         #log /dev/log   local0

         #log /dev/log   local1 notice    #定義haproxy 日誌級別[error warringinfo debug]

log 127.0.0.1 local2                   #日誌輸出配置,全部日誌都記錄在本機,經過local2輸出

         chroot /var/lib/haproxy            #chroot運行路徑

    nbproc  1               #設置進程數量

         stats socket /run/haproxy/admin.sock mode 660 level admin        #定義統計信息保存位置

         stats timeout 30s                       #監控頁面超時時間

         user haproxy                                #運行haproxy 用戶

         group haproxy                             #運行haproxy 用戶組

         daemon                                         #之後臺形式運行harpoxy

 

         # Default SSL material locations

         ca-base /etc/ssl/certs

         crt-base /etc/ssl/private

 

         # Default ciphers to use on SSL-enabled listening sockets.

         # For more information, see ciphers(1SSL). This list is from:

         #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/

         ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS

         ssl-default-bind-options no-sslv3

 

defaults

         log    global                          #設置日誌繼承全局配置段的設置

         mode        http                    #設置haproxy的運行模式,有三種{http|tcp|health},tcp是4層,http是7層,health只會返回OK

         option       abortonclose

    option  http-server-close       #打開http協議中服務器端關閉功能,使得支持長鏈接,使得會話能夠被重用,使得每個日誌記錄都會被記錄。

         option       httplog              #表示開始打開記錄http請求的日誌功能

         option       dontlognull       #若是產生了一個空鏈接,那這個空鏈接的日誌將不會記錄。

    timeout connect 5000     #haproxy與後端服務器鏈接超時時間,若是在同一個局域網可設置較小的時間。

    timeout client  50000    #定義客戶端與haproxy鏈接後,數據傳輸完畢,再也不有數據傳輸,即非活動鏈接的超時時間

    timeout server  50000  #定義haproxy與上游服務器非活動鏈接的超時時間。

       

listen admin_stats  #frontend和backend的組合體,監控組的名稱,按需自定義名稱

         bind 0.0.0.0:8080    #配置監聽端口

         mode http                  #配置監控運行的模式,在這爲http模式。

         option httplog           #表示開始打開記錄http請求的日誌功能

         maxconn 10               #最大鏈接數

    stats enable             #開啓統計頁面

    stats hide-version    #配置隱藏統計頁面上的HAproxy版本信息。

    stats refresh 30s     #配置每隔30秒自動刷新監控頁面。

    stats show-node      #

    stats auth admin:admin  #設置監控頁面的用戶和密碼:admin,能夠設置多個用戶名

stats uri /haproxy              #統計頁面url

stats admin if TRUE #設置手工啓動/禁用,後端服務器

 

#設置錯誤頁面

         errorfile 400 /etc/haproxy/errors/400.http

         errorfile 403 /etc/haproxy/errors/403.http

         errorfile 408 /etc/haproxy/errors/408.http

         errorfile 500 /etc/haproxy/errors/500.http

         errorfile 502 /etc/haproxy/errors/502.http

         errorfile 503 /etc/haproxy/errors/503.http

         errorfile 504 /etc/haproxy/errors/504.http

 

 

frontend www-frontend           #定義一個名爲www-frontend的frontend。

         Bind *:80 #定義haproxy前端部分監聽的端口。

         reqadd X-Forwarded-Proto:\ http   #

         default_backend http-backend        #定義默認backend

         option  forwardfor          #使後端server獲取到客戶端的真實IP

         acl http hdr(host) -i www.aaa.com          #根據域名定義acl

         acl web    hdr(host) -i www.bbb.com

         use_backend http-backend if http            #定義訪問www.aaa.com的到http-backend

         use_backend web-backend if web            #定義訪問www.bbb.com的到web-backend

 

backend http-backend

         balance roundrobin          #定義負載均衡方式,roundrobin輪詢方式

         cookie SERVERID insert indirect nocache

    server web1 192.168.0.110:8001 cookie A check inter 1500 weight 1 rise 3 fall 3 

    server web2 192.168.0.110:8002 cookie B check inter 1500 weight 2 rise 3 fall 3

server web3 192.168.0.110:8003 cookie C check inter 1500 weight 3 rise 3 fall 3

#chookie指定serverID ,check inter指定檢測心跳頻率,rise指定正確次數,fall指定失敗次數,weight表明權重

backend web-backend

         balance roundrobin          #定義負載均衡方式,roundrobin輪詢方式

         cookie SERVERID insert indirect nocache

    server www1 192.168.0.111:8010 cookie A check inter 1500 weight 1 rise 3 fall 3

    server www2 192.168.0.111:8020 cookie B check inter 1500 weight 2 rise 3 fall 3

 

listen tcptest            #設置Frontend和Backend的組合體,監控組的名稱,按須要自定義名稱 

    bind 0.0.0.0:8009    #設置監聽端口

    mode tcp                  #採用tcp

    option tcplog            #採用tcp日誌格式  

    balance source         #定義負載均衡方式

    server s1 192.168.0.111:8010 weight 1 check inter 1500 rise 3 fall 3

         server s2 192.168.0.111:8020 weight 2 check inter 1500 rise 3 fall 3

 

日誌配置

sudo vi /etc/rsyslog.d/50-default.conf

增長如下一行

local2.*        /var/log/haproxy.log

sudo vi /etc/rsyslog.conf

找到下面兩行,把註釋去掉

#$ModLoad imudp

#$UDPServerRun 514

重啓rsyslog服務

sudo service rsyslog restart

 

重啓haproxy服務

Sudo service haproxy restart

 

 

配置KeepAlived

Sudo vim /etc/keepalived/keepalived.conf ! Configuretion File for keepalived

globel_defs{

    notification_email {

         yqb813@gmail..com        #指定keepalived在切換時須要發送到的email對象,一行一個

  }

    notification_email_from root@localhost        ##指定發件人

    smtp_server 127.0.0.1                      #指定SMTP服務器地址

    smtp_connect_timeout 30                         #指定SMTP鏈接超時時間

    router_id HAProxy_DEVEL                        #設置lvs的id,在一個網絡內應該是惟一的

}

 

#監測haproxy進程狀態,每2秒執行一次

vrrp_script chk_haproxy {

    script "/usr/local/keepalived/chk_haproxy.sh"

    interval 2

    weight 2

}

 

vrrp_instance VI_1{

    state MASTER #指定keepalived的角色,MASTER爲主,BACKUP爲備

    interface eth0 #設置實例綁定到那個網卡

    virtual_router_id 200 #VRID標記(0~255),主備要保持相同

    priority 150 #優先級,MASTER要高於BACKUP的優先級(至少50)

    advert_int 3 #檢查間隔時間,默認1秒

    authentication {

         auth_type PASS #指定要使用那一種認證(PASS|AH)

         auth_pass 111111 #指定要使用的密碼字符串

    }

 

    track_script {

         chk_haproxy              #監測haproxy進程狀態

    }

 

    virtual_ipaddress {

         192.168.0.90 dev eth0    #定義虛擬IP(VIP),可多設,每行-個

    }

}

/usr/local/keepalived/chk_haproxy.sh

 

 

#!/bin/bash

#

# description:

# 定時查看haproxy是否存在,若是不存在則啓動haproxy,

# 若是啓動失敗,則中止keepalived

#

status=$(ps aux|grep haproxy | grep -v grep | grep -v bash | wc -l)

if [ "${status}" = "0" ]; then

    /etc/init.d/haproxy restart

 

    status2=$(ps aux|grep haproxy | grep -v grep | grep -v bash |wc -l)

 

    if [ "${status2}" = "0"  ]; then

            /etc/init.d/keepalived stop

    fi

fi

 

 

高可用測試

在master停掉keepalived,查看系統日誌

發現master釋放了vip

 

 

在backup查看系統日誌,發現backup已經進入master 角色,並綁定vip

 

 

 

在master上啓動keepalived,查看系統日誌,發現從新得到master角色,並綁定vip

 

 

 

在backup上查看系統日誌,發現從新回到backup角色,並釋放vip

 

相關文章
相關標籤/搜索