HAproxy + Keepalived負載均衡的安裝部署及使用筆記(ubuntu)

負載均衡的安裝部署及使用手冊

一、首先環境介紹:
 
LB110.10.13.240
LB210.10.13.241

web server1 10.10.13.243

web server2 10.10.13.244

LB1LB2keepalived主從,對haproxy服務提供切換;haproxy服務將調度兩臺web server

web server 的對外虛擬IP10.10.13.245

二、243/244:兩臺RealServer web服務配置 

1、先安裝web服務: apt-get install apache2 

2、修改web服務器日誌格式 
vi /etc/apache2/apache2.conf 

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 

3、註釋掉原來的CustomLog,並修改文檔根路徑DocumentRoot/var/www 
vi /etc/apache2/sites-available/default 
SetEnvIf Request_URI "^/check\.txt$" dontlog 

CustomLog /var/log/apache2/access.log combined env=!dontlog 

echo "The web service provider is 243|244" > /var/www/index.html 

4、重啓web服務器 
/etc/init.d/apache2 restart
 
5、建立check文件,haproxy使用該文件檢查WEB狀態,必須建立 
touch /var/www/check.txt 

三、240/241兩臺服務器的haproxy配置 

1、 安裝haproxy 
tar xvf haproxy-1.4.22.tar.gz
cd haproxy-1.4.22
make TARGET=36-Ubuntu
make PREFIX=/usr/local/haproxy install
 
2、 編輯其配置文件 
cd /etc
mkdir haproxy
vim haproxy/haproxy.cfg 

###########全局配置#########

global
        #daemon

        #nbproc 1

        #pidfile /var/run/haproxy.pid

        log 127.0.0.1 local0

        log 127.0.0.1 local1 notice

        maxconn 4096

########默認配置############

defaults

        log global

        mode http               #默認的模式mode { tcp|http|health }tcp4層,http7層,health只會返回OK

        retries 3              #兩次連接失敗就認爲是服務器不可用,也可以通過後面設置

        #option redispatch       #serverId對應的服務器掛掉後,強制定向到其他健康的服務器

        #option abortonclose     #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接

        option httplog

        option dontlognull

        option redispatch

        maxconn 2000            #默認的最大連接數

        timeout connect 5000ms    #連接超時

        timeout client 30000ms    #客戶端超時

        timeout server 30000ms   #服務器超時

        #timeout check 2000       #=心跳檢測超時

      log 127.0.0.1 local0 err    #開啓記錄haproxy日誌 

listen web 10.10.13.245:80 

        mode http

        stats enable

        balance roundrobin

        option httpclose

        option forwardfor

        option httpchk HEAD /check.txt HTTP/1.0

        server nc243 10.10.13.243:80 cookie A check

        server nc244 10.10.13.244:80 cookie B check

或者:
 
frontend shishi

        bind *:82

        mode http

        acl api_net url_sub -i sip_apiname=engagecloud

        use_backend engagecloud if api_net

        default_backend engagecloud

backend engagecloud

        mode http

        balance roundrobin

        server app 10.15.14.130:80 cookie A

        server app1 10.15.14.131:8080 cookie B

backend salesapp

        mode http

        server app1 10.15.14.131:8080 cookie B

 
frontend shishi2

        bind *:822

        mode http

        acl api_net url_sub -i sip_apiname=engagecloud

        use_backend engagecloud if api_net

        default_backend salesapp1  

backend engagecloud1

        mode http

        server app 10.15.14.130:80 cookie A

backend salesapp1

        mode http

        server app1 10.15.14.131:8080 cookie B

        server app 10.15.14.130:80 cookie A 

frontend http-ip //前端節點定義
 
bind 10.10.13.245:80   //虛擬服務節點監聽80端口
    mode http
    log global
    option httplog
    option httpclose //每次請求完畢後主動關閉http通道,HA-Proxy不支持keep-alive模式,只能夠模擬這種模式的實現

    option forwardfor   //如果後端服務器需要獲得客戶端的真實IP需要配置次參數,將可以從Http Header中獲得客戶端IP

    capture request header Host len 20 //此配置和一下的類似配置都是抓取Http請求中的參數記錄到日誌中。
    capture request header User-Agent len 16
    capture request header Content-Length len 10    
    capture request header Referer len 20

    capture response header Content-Length len 10

//控制策略的配置,參考別人的配置,使用時要根據自己的實際情況。

    acl api_taobao url_sub -i sip_apiname=taobao. //在請求url中包含sip_apiname=taobao則此控制策略返回true否則爲false

    acl api_alisoft url_sub -i sip_apiname=alisoft. //在請求url中包含sip_apiname=alisoft則此控制策略返回true否則爲false

    acl invalid_req url_sub -i sip_apiname= //在請求url中包含sip_apiname=則此控制策略返回true否則爲false

    acl stat_req url_dir -i admin //在請求url中存在admin作爲部分地址路徑則此控制策略返回true否則返回false

    block if !invalid_req !stat_req //block表示阻止請求返回403錯誤當前表示如果不滿足策略invalid_req同時也不滿足策略stat_req則阻止請求。(就是要求URL中必需有參數sip_apiname,除非是查看服務器狀態的URL)。

    use_backend alisoft_server if api_alisoft //如果是滿足策略api_alisoft的情況,則使用alisoft_server作爲後端服務集羣。

    use_backend taobao_server if api_taobao //如果是滿足策略api_taobao的情況,則使用taobao_server作爲後端服務集羣。
    default_backend alisoft_server //使用alisoft_server作爲默認後端服務集羣。
backend alisoft_server //後端節點1定義
   mode http
   balance roundrobin //負載均衡策略配置
   cookie SERVERID //允許插入serveridcookie中,serverid後面可以定義

   server app1 10.10.13.243:80 cookie 1 check fall 5 weight 1 //真實服務器配置定義cookie 1表示serverid1check表示需要狀態檢查,fall 5表示失敗五次就認爲服務器狀態不可用(不在接受請求),weight 1表示權重

  server app2 x.x.x.x:8080 cookie 1 check fall 5 weight 10

backend taobao_server //後端節點2定義 
   mode http
   server app1 10.10.13.244:80 check fall 5
 
listen haproxy-status 10.10.13.245:8888
        mode          http
        option        httplog
       stats uri     /haproxy-stats
        stats realm   Global\ statistics
        stats auth    admin:123456 
haproxy配置結束。
 
3HA-Proxy日誌配置說明:
HA-Proxy可以收集本機及其他後端服務器日誌,但是需要在Load Balancer240/241)上作一些配置。

首先修改/etc/sysconfig/syslog文件,將SYSLOGD_OPTIONS="-m 0 修改爲SYSLOGD_OPTIONS="-m 0 -r -x",支持收集遠程服務器日誌。

 然後修改/etc/syslog.conf,增加如下語句:
#add by haproxy
local0.* /path/to/haproxy.log //需要存儲日誌的地址
執行service syslog restart,重新啓動系統日誌器
最後就是在HA-Proxy的配置中增加日誌輸出,即capture 後的內容。
 
4、啓動haproxy服務 

/usr/local/haproxy/sbin/haproxy –f /etc/haproxy/haproxy.cfg –d   或者-D

也可以:
cd /usr/local/haproxy/sbin
./haproxy –f /etc/haproxy/haproxy.cfg
 
5、打開網頁測試:
 
 

 
6、打開haproxy的狀態信息頁:
 

HAproxy 使用手冊: 

1、 HAProxy 常用參數說明 

#./haproxy help //haproxy相關命令參數介紹.

haproxy -f <配置文件> [-n 最大併發連接總數] [-N 每個偵聽的最大併發數] [-d] [-D] [-q] [-V] [-c] [-p] [-s] [-l] [-dk] [-ds] [-de] [-dp] [-db] [-m <內存限制M>] [{-sf|-st} pidlist...]

-d     前臺,debug模式
-D     daemon模式啓動
-q     安靜模式,不輸出信息
-V     詳細模式
-c     對配置文件進行語法檢查
-s     顯示統計數據
-l     顯示詳細統計數據
-dk    不使用kqueue
-ds    不使用speculative epoll
 -de    不使用epoll
-dp    不使用poll
-db    禁用後臺模式,程序跑在前臺
-sf    程序啓動後向pidlist裏的進程發送FINISH信號,這個參數放在命令行的最後
-st    程序啓動後向pidlist裏的進程發送TERMINATE信號,這個參數放在命令行的最後 

2HAProxy 錯誤排除 

在上述啓動時, 若有出現下述錯誤:

    Starting haproxy: [ALERT] 015/191034 (15631) : Starting proxy webfarm: cannot bind socket...on both load balancer

   

    [ALERT] 056/103843 (1358) : Starting proxy www-balancer: cannot bind socket

解法
    暫時解法, 直接先修改設定, 讓它先跑起來:

        sysctl -e net.ipv4.ip_nonlocal_bind=1

    永久解法, 讓開機時自動設此參數.

        sysctl -a | grep nonlocal   #看是否已經有設定此參數

        vim /etc/sysctl.conf # 最下面加入

        net.ipv4.ip_nonlocal_bind=1

還有一種可能就是,haproxy Load Balancer的機器上開啓了web服務,關閉即可。要保證web服務,在這兩臺機器上是關掉的。 

3、 HAProxy 配置手冊 

haproxy.cfg 有分下列三種: (haproxy.cfg 的三個主項目)
    global
    listen
    defaults
注:

    下述所有 <name> 都必須由 / 寫字母、數字、 - . : 組成. (大小寫會視爲不同名稱)

    defaults <name> 下面所有參數的預設設定值,下面的設定值會蓋掉上面的。
    listen <name>:完整的 Proxy 代理,frontend / backend 都在這個設定裏 (用於 TCP)
global 分類
global 部分有下述幾類:
 
    行程管理和安全
    chroot <jail dir>

        daemon: 執行 -D 也是同樣

        gid
        group
        uid
        log

        nbproc: deamon 才能使用, 也是最推薦的模式, 如果小檔案很多, 建議要多開幾個, 但是 debug 時不建議開此參數. (arg: nbproc <number>)

        pidfile

        ulimit-n: 設定每個行程最大文件數, 此值會自動計算, 不建議設定此參數 (arg: ulimit-n <number>)

        user
    stats
   性能調校
     maxconn: 最大連接數, -n (arg: maxconn <number>)

       noepoll: Linux 系統不使用 epoll 等同 -de

       nokqueue: BSD 不使用 kqueue polling –dk

       nopoll: poll 在任何機器都可以跑, 不建議關閉, -dp

       nosepoll: Linux 系統不使用 speculative epoll 等同 -ds

     spread-checks: 多久去 check 一次, 默認值 0 (arg: spread-checks <0..50 in percent>)

     tune.maxaccept
     tune.maxpollevents
    測試
    debug: 將所有訊息都顯示到畫面上, -d
    quiet: 不顯示任何訊息, -v
 
listen 分類

    listen <instance_name> [ <IP_address>:<port_range>[...] ]

listen 部分有下述幾類:
    bind
    mode: TCP / HTTP / health

    balance: roundrobin / source / url / url_param

    server
    option
    # defaults 的參數都可於此寫入, 於此 listen 的設定中, 會以此寫入的爲主。

4httpchk 範例 

httpchk (啓用 HTTP server health check.) 特別重要, 範例多記錄一點.

    option httpchk
    option httpchk <uri>

    option httpchk <method> <uri>

    option httpchk <method> <uri> <version>

    ex:

        # Relay HTTPS traffic to Apache instance and check service availability

        # using HTTP request "OPTIONS * HTTP/1.1" on port 80.

        backend https_relay
            mode tcp

            option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www

            server apache1 192.168.1.1:443 check port 80

        option httpchk GET /robots.txt
        option httpchk GET /index.html
        option httpchk *

    option httpchk GET /robots.txt # 指的是 GET /robots.txt HTTP/1.0

    option httpchk # 指的是 OPTIONS / HTTP/1.0

    option httpchk * # 指的是 OPTIONS * HTTP/1.0 

四、240/241兩臺服務器的keepalived配置 

1、 安裝keepalived 
tar xvf keepalived-1.2.7.tar.gz
cd keepalived-1.2.7
./configure –prefix=/usr/local/keepalived/
make
make install
 
2、 keepalivedipvsadm 是在一起使用的,不可缺少。所以,要先安裝ipvsadm 
apt-get install ipvsadm
 
3、 編輯配置文件 
mkdir –pv /etc/keepalived
vim /etc/keepalived/keepalived.conf
 
global_defs {

        router_id LVS_DEVEL

}
vrrp_instance VI_1 {

state MASTER         #241服務器上將MASTER改爲BACKUP

interface eth0          #HA監測網絡接口
virtual_router_id 51     #主、備機的virtual_router_id必須相同
priority 90            #主、備機取不同的優先級,主機值較大,241的值較小
advert_int 1           #VRRP Multicast廣播週期秒數
authentication {

            auth_type PASS       #VRRP認證方式

            auth_pass 123456789   #VRRP口令字

        }

virtual_ipaddress {

        10.10.13.245    #LVS虛擬地址

        }

}
 
4、 啓動keepalived服務 

/usr/local/keepalived/sbin/keepalived –f /etc/keepalived/keepalived.conf 

ipvsadm –l
ip a 此命令可以看到,

eth010.10.13.240ip下有一個新的ip生成。如:

1: lo: <LOOPBACKUPLOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCASTMULTICASTUPLOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:e0:4c:ec:d7:e5 brd ff:ff:ff:ff:ff:ff

    inet 10.10.13.240/24 brd 10.10.13.255 scope global eth0

    inet 10.10.13.245/32 scope global eth0

    inet6 fe80::2e0:4cff:feec:d7e5/64 scope link

       valid_lft forever preferred_lft forever

eth010.10.13.241ip下沒有新的ip生成,如下:

1: lo: <LOOPBACKUPLOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCASTMULTICASTUPLOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000

    link/ether 00:e0:4c:ec:d7:d3 brd ff:ff:ff:ff:ff:ff

    inet 10.10.13.241/24 brd 10.10.13.255 scope global eth0

    inet6 fe80::2e0:4cff:feec:d7d3/64 scope link

       valid_lft forever preferred_lft forever

5、 240keepalived服務停掉,重新看一下:

240ip a

1: lo: <LOOPBACKUPLOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCASTMULTICASTUPLOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:e0:4c:ec:d7:e5 brd ff:ff:ff:ff:ff:ff

    inet 10.10.13.240/24 brd 10.10.13.255 scope global eth0

    inet6 fe80::2e0:4cff:feec:d7e5/64 scope link

       valid_lft forever preferred_lft forever

241:ip a

1: lo: <LOOPBACKUPLOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCASTMULTICASTUPLOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000

    link/ether 00:e0:4c:ec:d7:d3 brd ff:ff:ff:ff:ff:ff

    inet 10.10.13.241/24 brd 10.10.13.255 scope global eth0

    inet 10.10.13.245/32 scope global eth0

    inet6 fe80::2e0:4cff:feec:d7d3/64 scope link

       valid_lft forever preferred_lft forever

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章