HAProxy負載均衡與keepalived搭建高可用負載均衡web(Nginx/PHP/Tomcat)集羣

HAProxy簡介php

    HAProxy是基於TCP四層和HTTP七層的開源的第三方應用負載均衡軟件。具備高可靠性、高穩定性、高併發處理能力、透明代理和支持ACL功能等特色。HAProxy是一個功能強大且優秀的負載均衡集羣解決方案。
html


HAProxy負載均衡算法前端

    Haproxy的負載均衡算法在backend模塊中經過balance命令來定義,常見的算法有:linux

roundrobin: 輪叫調度算法,能夠經過定義權值來分配後端服務器web

static-rr : 靜態的基於權重的輪叫調度算法redis

source:     源IP地址哈希算法,按請求訪問的IP地址進行hash運算,未來自用一個IP地址的訪問固定到同一臺後端服務器算法

uri:        URI哈希算法,按請求訪問的URI進行hash運算,將請求轉發到匹配的後端服務器vim

uri_param:  根據訪問的URL路徑中的參數選擇後端服務器後端

leastconn:  最少鏈接調度算法,將鏈接請求轉發到最少鏈接數目的後端服務器bash

hdr(name):  表示根據HTTP請求頭進行轉發

cookie:     表示根據定義的SERVERID轉發請求


需求分析:

    現有4個域名經過HAProxy代理對外提供web服務,HAProxy是集羣中的前端代理和負載調度器的角色,分別代理後端的多臺Tomcat、Nginx+PHP、Apache服務器(Real Server),HAProxy同時搭建了兩臺,分別是Master和Backup,經過Keepalved實現雙機熱備,防止單點故障。HAProxy和Real Server的調度規則以下:

HAProxy --> Domain1 --> 192.168.1.10 --> 192.168.1.231/192.168.1.232(Nginx+PHP)

HAProxy --> Domain2 --> 192.168.1.10 --> 192.168.1.231:8080(Tomcat)

HAProxy --> Domain3 --> 192.168.1.10 --> 192.168.1.232:8080(Tomcat)

HAProxy --> Domain4 --> 192.168.1.10 --> 192.168.1.211:80(Apache)


實驗拓撲:

wKiom1cSEdSCa-j1AAI-i-9fJYg529.jpg


環境介紹:(系統CentOS6.7)


Hostname
IPADDR Role Server
master
192.168.1.33 Director
haproxy-1.5.9 + keepalived
backup 192.168.1.34 Director haproxy-1.5.9 + keepalived

host1

192.168.1.231 Real Server Tomcat Nginx PHP
host2 192.168.1.232 Real Server Tomcat Nginx PHP
host3 192.168.1.211 Real Server Apache MySQL

Web server:

Domain1: www.huangming.org

Domain2: web1.huangming.org

Domain3: web2.huangming.org

Domain4: www.localhost.com


Step1:在Master上安裝HAProxy服務

一、安裝haproxy-1.5.9.tar.gz,官方地址http://www.haproxy.com

# tar zxf haproxy-1.5.9.tar.gz 

# cd haproxy-1.5.9

# make TARGET=linux26 PREFIX=/usr/local/haproxy

# make install PREFIX=/usr/local/haproxy

二、建立haproxy配置文件目錄

# mkdir /usr/local/haproxy/conf

# cp examples/haproxy.cfg /usr/local/haproxy/conf/


HAproxy的配置文件

HAproxy配置文件主要由5個部分組成:

一、global部分:用來設定全局配置參數,屬於進程級,一般和操做系統配置有關

二、defaults部分:默認參數配置部分。在此部分下,默認會自動引用到下面的frontend、backend和listen部分中,所以若是某些參數屬於公用的配置,只需在defaults部分添加一次便可。

三、frontend部分:用於設置接收用戶請求的前端虛擬節點。frontend是在HAProxy1.3版本以後才引入的一個組件,同時引入的還有backend組件。frontend能夠根據ACL規則直接指定要使用的後端backend

四、backend部分:此部分用於設置集羣后端服務器集羣的配置,也就是用來添加一組真實服務器,以處理前端用戶的請求,添加的真實服務器相似於LVS中的real server節點。

五、listen部分:此部分是frontend和backend部分的結合體。在HAProxy1.3版本以前,HAProxy的全部配置選項都在這個部分中設置。


Step2:在Master上安裝keepalived

一、下載keepalived最新版

# wget http://www.keepalived.org/software/keepalived-1.2.20.tar.gz

二、安裝keepalived

# yum install pcre-devel openssl-devel popt-devel libnl-devel -y

# yum install libnfnetlink libnfnetlink-devel -y

# tar zxf keepalived-1.2.20.tar.gz

# cd keepalived-1.2.20

# ./configure --prefix=/usr/local/keepalived --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.32-573.el6.x86_64

# make && make install

# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/

三、啓動keepalived,設置開啓啓動

[root@master haproxy]# service keepalived start
[root@master haproxy]# chkconfig --add keepalived
[root@master haproxy]# chkconfig keepalived on
[root@master haproxy]# chkconfig --list keepalived
keepalived     	0:off	1:off	2:on	3:on	4:on	5:on	6:off


Step3:在Backup上安裝haproxy和keepalived

[root@backup ~]# ls /usr/local/haproxy/

conf  doc  sbin  share

[root@backup ~]# ls /usr/local/keepalived/

bin  sbin  share

[root@backup ~]# ls /etc/keepalived/

keepalived.conf  samples

[root@backup ~]# service keepalived start    ;啓動keepalived


Step4:配置HAProxy

global

        log 127.0.0.1   local0 info  ;日誌級別(err/warning/info/debug)

        maxconn 4096  ;每一個haproxy進程可接受的最大併發鏈接數(等於ulimit -n)

        uid nobody    ;運行haproxy進程的用戶

        gid nobody    ;運行haproxy進程的組

        daemon        ;設置haproxy啓動時進入後臺運行

        nbproc 1      ;設置haproxy啓動時可建立的進程數,默認爲1,應該設置爲小於CPU核數

        pidfile /usr/local/haproxy/logs/haproxy.pid  ;HAProxy進程pid文件


defaults

        mode    http   ;設置haproxy默認的運行模式(tcp、http、health)

        retries 3      ;設置鏈接後端服務器的失敗重試次數

        maxconn 20000  ;設置開啓haproxy時容許的最大併發鏈接總數,該數值能夠也在運行時(-n)指定

        timeout connect 10s  ;設置成功鏈接後端服務器的最長等待時間

        timeout client 30s   ;客戶端發送數據時的最長等待時間

        timeout server 30s   ;服務器端迴應客戶端數據發送的最長等待時間

        timeout check 2s     ;對後端服務器的檢測超時時間


listen  admin_stats          ;HAProxy監測頁面的配置

        bind 0.0.0.0:19088   ;定義監聽的IP地址和端口

        mode http

        log 127.0.0.1 local0 err

        stats refresh 30s

        stats uri /haproxy-status

        stats realm welcome login\ Haproxy

        stats auth admin:123456abc

        stats hide-version

        stats admin if TRUE


frontend www    ;定義域名相關的配置

        bind *:80

        mode http

        option httplog

        option forwardfor

        log global


        acl host_www hdr_reg(host) -i ^(www.huangming.org|huangming.org) ;定義ALC規則

        acl host_web1 hdr_dom(host) -i web1.huangming.org

        acl host_web2 hdr_beg(host) -i web2.

        acl host_localhost hdr_dom(host) -i www.localhost.com

#ACL規則定義的方式有hdr_reg(host)hdr_dom(host)hdr_beg(host)、url_sub、url_dir、path_beg、path_end等,-i表示不匹配大小寫


        use_backend server_www if host_www

        use_backend server_web1 if host_web1

        use_backend server_web2 if host_web2

        use_backend server_localhost if host_localhost

        default_backend server_default


backend server_www  ;後端真實服務器組

        mode http

        option redispatch

        option abortonclose

        balance source

        cookie SERVERID

        option httpchk GET /forum.php

        server www1 192.168.1.231:80 cookie www1 weight 5 check inter 2000 rise 2 fall 3

        server www2 192.168.1.232:80 cookie www2 weight 5 check inter 2000 rise 2 fall 3


backend server_web1  ;後端真實服務器組

        mode http

        option redispatch

        option abortonclose

        balance source

        cookie SERVERID

        option httpchk GET /index.jsp

        server web1 192.168.1.231:8080 cookie web1 weight 7 check inter 2000 rise 2 fall 3


backend server_web2  ;後端真實服務器組

        mode http

        option redispatch

        option abortonclose

        balance source

        cookie SERVERID

        option httpchk GET /index.jsp

        server web2 192.168.1.232:8080 cookie web2 weight 7 check inter 2000 rise 2 fall 3


backend server_localhost  ;後端真實服務器組

        mode http

        option redispatch

        option abortonclose

        balance roundrobin

        cookie SERVERID

        option httpchk GET /index.html

        server localhost 192.168.1.211:80 cookie server_id weight 3 check inter 2000 rise 2 fall 3


backend server_default  ;默認鏈接的服務器組

        mode http

        option redispatch

        option abortonclose

        balance source

        cookie SERVERID

        option httpchk HEAD /forum.php

        server default1 192.168.1.231:80 cookie default1 weight 2 check inter 2000 rise 2 fall 3

        server default2 192.168.1.232:80 cookie default2 weight 2 check inter 2000 rise 2 fall 3



Step5:配置Keepalved

global_defs {

    notification_email {

    mail@huangming.org

    }

    notification_email_from keepalived@localhost

    smtp_server 127.0.0.1

    smtp_connect_timeout 30

    router_id HAProxy_DEVEL

}


vrrp_script check_haproxy {

    script "killall -0 haproxy"

        interval 2

        weight 30

    }


vrrp_instance HAProxy_HA {

    state BACKUP  ;主備均設置爲BACKUP

    interface eth0

    virtual_router_id 80

    priority 100  ;備上設置90

    advert_int 2

    nopreempt

    authentication {

        auth_type PASS

        auth_pass 1111

    }


    virtual_ipaddress {

        192.168.1.10/24 dev eth0

    }


    track_script {

        check_haproxy

    }


    notify_master "/etc/keepalived/master.sh"  ;切換爲主時執行的腳本

    notify_backup "/etc/keepalived/backup.sh"  ;切換爲從時執行的腳本

    notify_fault "/etc/keepalived/fault.sh"    ;切換爲fault時執行的腳本

}


Step6:在Backup上配置HAProxy和Keepalved

一、將Master上配置好的haproxy.cfg、keepalived.conf發送到Backup上對應的路徑下,並priority改成90

[root@master haproxy]# rsync -av conf/haproxy.cfg 192.168.1.34:/usr/local/haproxy/conf/
[root@master keepalived]# rsync -av keepalived.conf 192.168.1.34:/etc/keepalived/


Step7:啓動HAProxy

一、默認啓動

[root@master ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg 

二、查看haproxy監聽的端口

[root@master ~]# netstat -ntlp |grep haproxy

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      67498/haproxy       

tcp        0      0 0.0.0.0:19088               0.0.0.0:*                   LISTEN      67498/haproxy 

三、指定併發鏈接數啓動HAProxy

[root@master ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -n 50000


四、登錄HAProxy監測頁面

wKiom1cSVKajVtBXAAIgXEpBQzU982.jpg


Step8:啓動Keepalved

[root@master ~]# service keepalived restart

Stopping keepalived:                                       [  OK  ]

Starting keepalived:                                       [  OK  ]

[root@backup ~]# service keepalived restart

Stopping keepalived:                                       [  OK  ]

Starting keepalived:                                       [  OK  ]

一、在Master上查看VIP

[root@master ~]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:bd:50:ec brd ff:ff:ff:ff:ff:ff

    inet 192.168.1.33/24 brd 192.168.1.255 scope global eth0

    inet 192.168.1.10/24 scope global secondary eth0

    inet6 fe80::20c:29ff:febd:50ec/64 scope link 

       valid_lft forever preferred_lft forever


二、測試VIP是否正常提供服務

wKioL1cSVomghYU6AACEw3VmHtY601.jpgwKiom1cSVdrD_LkaAADi0F9P-eg482.jpg


三、測試keepalived是否實現故障轉移功能

一、在Master上中止keepalived服務

[root@master ~]# service keepalived stop

Stopping keepalived:                                       [  OK  ]

二、在backup上查看是否接管VIP

[root@backup ~]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:f7:ad:3d brd ff:ff:ff:ff:ff:ff

    inet 192.168.1.34/24 brd 192.168.1.255 scope global eth0

    inet 192.168.1.10/24 scope global secondary eth0

    inet6 fe80::20c:29ff:fef7:ad3d/64 scope link 

       valid_lft forever preferred_lft forever


Step9:測試經過域名訪問HAProxy,測試是否實現轉發和負載功能

一、經過VIP對所有域名的解析,並測試訪問

http://www.huangming.org

wKiom1cSWHajll_8AAB6Oxf8uMI114.jpg


http://web1.huangming.org

wKiom1cSWJWjZ7QbAAA4Lmh8Irs779.jpg


http://web2.huangming.org

wKiom1cSWK6xRlwpAAA67mStRPk096.jpg


http://www.localhost.com

wKioL1cSWYGTN8k4AAA0kuXp-L8271.jpg


默認轉發的後端web服務器

wKioL1cSWdPzod-eAACBNL4fpOg590.jpg


Step10:HAProxy的日誌功能配置

一、建立haproxy.conf文件

[root@hxm ~]# vim /etc/rsyslog.d/haproxy.conf

$ModLoad imudp

$UDPServerRun 514

local3.* /usr/local/haproxy/logs/haproxy.log

local0.* /usr/local/haproxy/logs/haproxy.log


二、修改/etc/sysconfig/rsyslog

[root@hxm ~]# vim /etc/sysconfig/rsyslog

SYSLOGD_OPTIONS="-c 2 -r -m 0"    ;-r表示接收遠程日誌


三、重啓rsyslog服務

[root@hxm ~]# service rsyslog restart

# cat /usr/local/haproxy/logs/haproxy.log 

Step11:HAProxy啓動經常使用參數選項

-v: 顯示版本

-d: 以debug模式運行

-db: 表示禁用後臺啓動模式

-D: 表示之後臺的模式啓動

-q: 表示安靜模式,程序運行不輸出任何信息

-c: 對HAProxy配置文件進行語法檢查

-n: 設置最大併發鏈接數

-m: 限制可用內存大小,單位MB

-N: 設置默認鏈接數

-p: 設置HAProxy運行的PID文件

-de: 表示不使用epoll模型

-ds: 不使用speculative epoll

-dp: 不使用poll模型

-sf: 程序啓動後向PID文件的進程發送FINISH信號

-st: 程序啓動後向PID文件的進程發送TERMINATE信號,用於重啓HAProxy

相關文章
相關標籤/搜索