HaProxy系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.htmlhtml
1.安裝haproxy
CentOS自帶了haproxy,但可能版本比較老。能夠在IUS源上找到最新穩定版的haproxy。linux
cat <<eof>/etc/yum.repos.d/ius.repo [ius] name=iusrepo baseurl=https://mirrors.tuna.tsinghua.edu.cn/ius/stable/CentOS/$releasever/\$basearch gpgcheck=0 enable=1 eof yum -y install haproxy17u
如下是編譯安裝haproxy-1.7.10的過程。git
編譯安裝haproxy時,能夠藉助於pcre環境,該環境下編譯時藉助正則表達式分析編譯速度會快不少,可是沒有該環境也能夠安裝。github
yum -y install pcre pcre-devel tar xf haproxy-1.7.10.tar.gz cd haproxy-1.7.10 make TARGET=linux2628 ARCH=x86_64 PREFIX=/usr/local/haproxy USE_PCRE=1 make install PREFIX=/usr/local/haproxy
make時須要使用TARGET指定內核及版本,版本以下:正則表達式
- linux22 for Linux 2.2 - linux24 for Linux 2.4 and above (default) - linux24e for Linux 2.4 with support for a working epoll (> 0.21) - linux26 for Linux 2.6 and above - linux2628 for Linux 2.6.28, 3.x, and above (enables splice and tproxy) - solaris for Solaris 8 or 10 (others untested) - freebsd for FreeBSD 5 to 10 (others untested) - netbsd for NetBSD - osx for Mac OS/X - openbsd for OpenBSD 5.7 and above - aix51 for AIX 5.1 - aix52 for AIX 5.2 - cygwin for Cygwin - haiku for Haiku - generic for any other OS or version. - custom to manually adjust every setting
使用ARCH指定架構,不過ARCH選項可省。使用USE_PCRE=1表示使用PCRE環境編譯,加快編譯速度。bash
編譯安裝完成後,只有3個目錄:doc、share和sbin,sbin裏面只有一個haproxy的主程序haproxy。爲了方便管理haproxy服務,能夠從yum安裝的haproxy中複製/etc/init.d/haproxy
。架構
2.haproxy命令
詳細內容參見:http://cbonte.github.io/haproxy-dconv/1.8/management.htmlsocket
經常使用的幾個:測試
# 檢查配置文件語法 haproxy -c -f /etc/haproxy/haproxy.cfg # 以daemon模式啓動,以systemd管理的daemon模式啓動 haproxy -D -f /etc/haproxy/haproxy.cfg [-p /var/run/haproxy.pid] haproxy -Ds -f /etc/haproxy/haproxy.cfg [-p /var/run/haproxy.pid] # 啓動調試功能,將顯示全部鏈接和處理信息在屏幕 haproxy -d -f /etc/haproxy/haproxy.cfg # restart。須要使用st選項指定pid列表 haproxy -f /etc/haproxy.cfg [-p /var/run/haproxy.pid] -st `cat /var/run/haproxy.pid` # graceful restart,即reload。須要使用sf選項指定pid列表 haproxy -f /etc/haproxy.cfg [-p /var/run/haproxy.pid] -sf `cat /var/run/haproxy.pid` # 顯示haproxy編譯和啓動信息 haproxy -vv
須要注意的是,restart會直接關掉舊進程並創建新進程,因此會丟棄大量已創建的鏈接,而reload會啓動新進程,但舊進程會先處理完當前已創建鏈接而後再關閉。可是,reload仍然會丟棄極少許的鏈接,雖然大多數狀況下這足夠完美了,可是在極度嚴格的環境下,這是不容許的。在haproxy 1.8中,提供了徹底不丟棄鏈接的無損重啓,要求haproxy啓動命令中加入-x選項,同時要求haproxy配置文件的"stats socket"配置中加入expose-fd listeners,好比:url
stats socket /var/run/haproxy.sock mode 600 expose-fd listeners level user
使用-x選項以及expose-fd listeners以後,reload haproxy的時候,會將已創建TCP鏈接(TCP套接字)轉移到Unix Domain狀態套接字中進行處理。
有人作了測試,並行200個測試,每一個測試發送10000個請求,在這種環境下各類重啓方式會致使的失敗率和響應時間。
Test | #req/users | #fail | resp avg | 95% resp |
baseline | 10k/200 | 0 | 513ms | 560ms |
restart 0.2 | 10k/200 | 4332 | 147ms | 253ms |
reload 0.2 (legacy) | 10k/200 | 10 | 455ms | 815ms |
reload 0.2 (socket) | 10k/200 | 0 | 567ms | 852ms |