1.安裝haproxy
CentOS自帶了haproxy,但可能版本比較老。可以在IUS源上找到最新穩定版的haproxy。
cat </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的過程。
編譯安裝haproxy時,可以借助于pcre環境,該環境下編譯時借助正則表達式分析編譯速度會快很多,但是沒有該環境也可以安裝。
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環境編譯,加快編譯速度。
編譯安裝完成后,只有3個目錄:doc、share和sbin,sbin里面只有一個haproxy的主程序haproxy。為了方便管理haproxy服務,可以從yum安裝的haproxy中復制/etc/init.d/haproxy。
2.haproxy命令
常用的幾個:
# 檢查配置文件語法
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,比如:
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