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) |
實驗拓撲:
環境介紹:(系統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監測頁面
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是否正常提供服務
三、測試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
http://web1.huangming.org
http://web2.huangming.org
http://www.localhost.com
默認轉發的後端web服務器
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