编程 Android wordpress Ubuntu centos mysql Windows google shell java nginx Python 开源 微软 程序员 apache 云计算 php linux Firefox

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

HAProxy簡介

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

HAProxy負載均衡算法

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

roundrobin: 輪叫調度算法,可以通過定義權值來分配後端服務器

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

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

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

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

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

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服務

1、安裝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

2、創建haproxy配置文件目錄

# mkdir /usr/local/haproxy/conf

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

HAproxy的配置文件

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

1、global部分:用來設定全局配置參數,屬於進程級,通常和操作系統配置有關

2、defaults部分:默認參數配置部分。在此部分下,默認會自動引用到下面的frontend、backend和listen部分中,因此如果某些參數屬於公用的配置,只需在defaults部分添加一次即可。

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

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

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

Step2:在Master上安裝keepalived

1、下載keepalived最新版

# wget http://www.keepalived.org/software/keepalived-1.2.20.tar.gz
2、安裝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/

3、啟動keepalived,設置開啟啟動

1

2

3

4

5

[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

1、将Master上配置好的haproxy.cfg、keepalived.conf发送到Backup上对应的路径下,并将priority改为90

1

2

[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

1、默认启动

 

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

2、查看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 

3、指定并发连接数启动HAProxy

 

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

 

4、登陆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  ]

1、在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

 

2、测试VIP是否正常提供服务

wKioL1cSVomghYU6AACEw3VmHtY601.jpgwKiom1cSVdrD_LkaAADi0F9P-eg482.jpg

 

3、测试keepalived是否实现故障转移功能

 

1、在Master上停止keepalived服务

[root@master ~]# service keepalived stop

Stopping keepalived:                                       [  OK  ]

 

2、在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,测试是否实现转发和负载功能

1、通过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的日誌功能配置

1、創建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

2、修改/etc/sysconfig/rsyslog

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

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

3、重啟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

延伸阅读

    评论