Haproxy的介紹和安裝mysql
Haproxy是一個開源的高性能的反向代理或者說是負載均衡服務軟件之一,它支持雙機熱備,虛擬主機,基於TCP和HTTP應用代理等功能。配置簡單,並且擁有服務器節點的健康檢查功能(至關於keepalived健康檢查),當後端服務器宕機時,haproxy會自動將故障服務器摘除,當服務器故障恢復後,再自動加入到集羣中。linux
Haproxy特別在適用於那些訪問量很大,但又須要會話保持或七層應用的業務。支持兩種主要的代理模式:4層Tcp代理(例如郵件服務,mysql業務,ssh等)和7層(HTTP代理)。在4層tcp模式下,haproxy僅在客戶端和服務器之間轉發雙向流量。7層模式下haproxy會分析應用層協議,而且能經過容許,拒絕,交換,增長,修改或者刪除請求或者回應裏指定內容來控制協議nginx
Haproxy採用的是NAT模式,數據包來去都會通過haproxy。web
Haproxy軟件的4層tcp代理應用很是優秀,配置很是簡單方便,比lvs和nginx要方便的多,haproxy不須要在RS端執行腳本便可實現應用代理redis
從上圖能夠看出,haproxy採用的是NAT的工做模式,網站全部流量都通過haproxy,因此適用於那些訪問量不是特別大的網站,在通常的中小型公司,建議使用haproxy作負載均衡。算法
Haproxy最大額優勢在於其7層的根據URL請求頭應用過濾的功能,在門戶網站的高併發生產架構中。Haproxy軟件通常用在LVS軟件的下一層,或掛在硬件負載均衡althon、NS、F5下使用sql
cd /usr/src wget http://down1.chinaunix.net/distfiles/haproxy-1.4.21.tar.gz tar zxf haproxy-1.4.21.tar.gz cd haproxy-1.4.21 make TARGET=linux26 ARCH=x86_64 make PREFIX=/usr/local/haproxy-1.4.21 install ln -s /usr/local/haproxy-1.4.21/ /usr/local/haproxy 說明: 1. make TARGET=linux26 ARCH=x86_64 是64位系統的編譯方式 32位系統的編譯方式爲: make TARGET=linux26 ARCH=x86 2. TARGET 後面是系統內核,不一樣版本的linux系統,內核版本不同。能夠 more README 查看詳細信息 |
默認的文件結構爲:vim
[root@localhost haproxy]# tree後端
├── doc瀏覽器
│ └── haproxy
│ ├── architecture.txt
│ ├── configuration.txt
│ ├── haproxy-en.txt
│ └── haproxy-fr.txt
├── sbin
│ └── haproxy
└── share
└── man
└── man1
└── haproxy.1
6 directories, 6 files
如今建立 bin conf logsvar/chroot var/run等目錄
cd /usr/local/haproxy mkdir -p conf bin logs var/run var/chroot
查看: [root@localhost haproxy]# tree . ├── bin ├── conf ├── doc │ └── haproxy │ ├── architecture.txt │ ├── configuration.txt │ ├── haproxy-en.txt │ └── haproxy-fr.txt ├── logs ├── sbin │ └── haproxy ├── share │ └── man │ └── man1 │ └── haproxy.1 └── var ├── chroot └── run
12 directories, 6 files |
至此,haproxy已經安裝完成。配置須要咱們手動建立,下面先簡單進行配置,並測試
cat >/usr/local/haproxy/conf/haproxy.conf <<EOF
#####################全局配置信息######################## global chroot /usr/local/haproxy/var/chroot #chroot運行的路徑 daemon #之後臺進程形式運行haproxy group haproxy #運行haproxy的用戶組身份爲haproxy user haproxy log 127.0.0.1 local0 info #日誌記錄 pidfile /usr/local/haproxy/var/run/haproxy.pid #pid文件位置 maxconn 25600 #最大鏈接數量 nbproc 8 #開啓的進程數量 #####################默認的全局設置###################### defaults log global #默認應用全局日誌格式 option httplog #日誌類別http日誌格式 option dontlognull #不記錄健康檢查的日誌信息 option httpclose #每次請求完畢後主動關閉http通道 retries 3 #默認健康檢查失敗後嘗試次數 option redispatch #serverId對應的服務器掛掉後,強制定向到其餘健康的服務器 option forwardfor #向後面的RS傳遞客戶端主機頭 contimeout 5000 #鏈接超時時間 clitimeout 50000 #客戶端超時時間 單位毫秒 srvtimeout 50000 #服務器超時時間單位毫秒 ####################監控頁面的設置####################### listen admin_status bind *:8080 #監控頁面採用8080端口 mode http stats enable #起開網頁監控頁面 stats uri /admin?status #監控頁面的url stats auth admin:fuzj123 #監控頁面的登陸用戶的帳戶名和密碼,能夠有多個 stats refresh 5 #監控頁面的刷新時間 stats hide-version #隱藏監控頁面的版本號 ####################集羣設置####################### listen webserver bind 172.16.254.37:80 #客戶端訪問的外網IP,若和heartbeat結合使用的話即VIP mode http #模式爲http balance roundrobin #調度算法爲輪訓 server web1 192.168.254.10:80 check server web2 192.168.254.20:80 check |
EOF |
這爲haproxy簡單的配置文件,能夠實現對兩個web 的負載均衡調度
此外須要增長haproxy用戶
useradd -M -s /sbin/nologin haproxy |
#!/bin/bash #chkconfig: 35 35 - . /etc/init.d/functions BASE="/usr/local/haproxy" PROG=$BASE/sbin/haproxy PIDFILE=$BASE/var/run/haproxy.pid CONFFILE=$BASE/conf/haproxy.conf case "$1" in start) #$PROG -f $CONFFILE >/dev/null 2>&1 $PROG -f $CONFFILE [ $? -eq 0 ] && { action "haproxy start is OK..." /bin/true } || action "haproxy start is error..." /bin/false ;; status) if [ ! -f $PIDFILE ]; then echo "pid not found" exit 1 fi for pid in $(cat $PIDFILE); do kill -0 $pid RETVAL="$?" if [ ! "$RETVAL" = "0" ]; then echo "process $pid died" exit 1 fi done echo "process is running" ;; restart) $PROG -f $CONFFILE -sf $(cat $PIDFILE) >/dev/null 2>&1 ;; stop) kill $(cat $PIDFILE) [ $? -eq 0 ] && { action "haproxy stop is OK..." /bin/true } || action "haproxy stop is error..." /bin/false ;; *) echo "USAGE: $0 start|restart|status|stop" exit 1 ;; esac
|
把啓動文件放在bin目錄下,並賦予執行權限,添加開機自啓動
chmod 755 haproxy echo "/usr/local/haproxy/bin/haproxy start" >> /etc/rc.local tail -1 /etc/rc.local 查看結果: /usr/local/haproxy/bin/haproxy start |
啓動haproxy,並測試
/usr/local/haproxy/bin/haproxy start 啓動結果: [root@localhost bin]# /usr/local/haproxy/bin/haproxy start [WARNING] 269/165754 (1791) : Proxy 'admin_status': in multi-process mode, stats will be limited to process assigned to the current request. haproxy start is OK... [肯定] [root@localhost bin]# netstat -anput | grep haproxy tcp 0 0 192.168.1.104:80 0.0.0.0:* LISTEN 1792/haproxy tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1792/haproxy udp 0 0 0.0.0.0:38073 0.0.0.0:* 1792/haproxy [root@localhost bin]# ps -aux | grep haproxy Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ haproxy 1792 0.0 0.6 18312 3348 ? Ss 16:57 0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf haproxy 1793 0.0 0.6 18312 3348 ? Ss 16:57 0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf haproxy 1794 0.0 0.6 18312 3348 ? Ss 16:57 0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf haproxy 1795 0.0 0.6 18312 3348 ? Ss 16:57 0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf haproxy 1796 0.0 0.6 18312 3348 ? Ss 16:57 0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf haproxy 1797 0.0 0.6 18312 3348 ? Ss 16:57 0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf haproxy 1798 0.0 0.6 18312 3348 ? Ss 16:57 0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf haproxy 1799 0.0 0.6 18312 3348 ? Ss 16:57 0:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf root 1804 0.0 0.1 103244 868 pts/0 S+ 16:59 0:00 grep haproxy haproxy已經成功啓動。查看發現,80端口和8080端口已經監聽,並且有8個進程在系統後臺。下面開始測試 [root@localhost bin]# for ((i=1;i<7;i++)) do curl 192.168.1.104 ;sleep 1 ; done <h1>this is Apache Server</h1> <h1>this is Nginx Server</h1> <h1>this is Apache Server</h1> <h1>this is Nginx Server</h1> <h1>this is Apache Server</h1> <h1>this is Nginx Server</h1>
經過curl命令返回的結果能夠看出,haproxy會把客戶端的訪問請求依次分發到後端RS上,即輪訓算法
下一步,能夠經過瀏覽器登陸haproxy的健康檢查狀態頁面,查看RS的健康情況 http://172.16.254.37:8080/admin?status 輸入帳戶名密碼以後,便可進入狀態頁面 下面進行對haproxy健康檢查的測試,經過監控頁面的RS狀態顯示顏色便可看 |
這就是簡單的haproxy HTTP代理。4層代理的話須要把mode模式改成tcp
Haproxy默認是不記錄日誌的,須要開啓系統syslog功能。以便記錄haproxy的相關日誌。CentOS-5版本中用syslog服務來記錄系統日誌,到CentOS-6版本中升級成rsyslog服務。
sed -i "s/\#\$ModLoad\ imudp/\$ModLoad\ imudp/g" /etc/rsyslog.conf sed -i "s/\#\$UDPServerRun\ 514/\$UDPServerRun\ 514/g" /etc/rsyslog.conf cat >>/etc/rsyslog.conf <<EOF # Haproxy local0.* /usr/local/haproxy/logs/haproxy.log #end /etc/syslog.conf EOF service rsyslog restart
[root@localhost conf]# egrep "$ModLoad imudp|$UDPServerRun 514" /etc/rsyslog.conf | head -2 && tail -3 /etc/rsyslog.conf $ModLoad imudp $UDPServerRun 514 # Haproxy local0.* /usr/local/haproxy/logs/haproxy.log #end /etc/syslog.conf 說明: 編輯rsyslog配置文件 vim /etc/rsyslog.conf #把下面這兩個前面」#」註釋去掉 $ModLoad imudp $UDPServerRun 514 #在行尾添加 # Haproxy local0.* /usr/local/haproxy/logs/haproxy.log #end /etc/syslog.conf 最後重啓rsyslog服務 注意: local0.*這要和haproxy配置文件中的日誌格式要對應 log 127.0.0.1 local0 info
此外,selinux會限制rsyslog,當配置好以後,若重啓rsyslog發現沒有生成日誌文件,則查看selinux是否開啓狀態 [root@localhost haproxy]# getenforce 查看selinux狀態 Enforcing [root@localhost haproxy]# setenforce 0 臨時關閉selinux 永久關閉: sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config 重啓生效
生產環境下,haproxy開啓記錄日誌的級別最好設置爲warning或者error以上,此時咱們設置爲info,haproxy會記錄客戶端的訪問信息,大量往磁盤中寫日誌信息,形成負載過大。 |
生產環境下,每每須要作haproxy的高可用,須要作主備haproxy。當主haproxy宕機以後,由備haproxy接替主haproxy繼續工做。其原理是:主備都同時監聽VIP,而VIP由高可用軟件提供(heartbeat或keepalived等),可是正常狀況下VIP在主haproxy上,由主haproxy響應客戶端請求。當主haproxy宕機以後,VIP漂移到備haproxy設備上,此時,備haproxy會繼續響應客戶端的請求。
由此能夠看出:主備haproxy的配置文件必須保持一致
主備haproxy切換過程其實就是VIP的漂移過程,VIP漂移到哪一個設備上,那個設備就開始響應請求
在haproxy啓動過程當中,有時候會遇到下面這個錯誤
[root@localhost haproxy]# bin/haproxy start ^[[6~[WARNING] 269/184851 (26188) : Proxy 'admin_status': in multi-process mode, stats will be limited to process assigned to the current request. [ALERT] 269/184851 (26188) : Starting proxy webserver: cannot bind socket haproxy start is error... [失敗]
解決方法:
echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf sysctl -p 因此這種方法有效解決了在主備haproxy環境下,VIP不在備haproxy上時,備haproxy能正常啓動的問題 因爲haproxy工做模式是NAT模式,爲了更好的實現轉發請求,須要開啓linux自己的轉發功能 sed -i "s/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g" /etc/sysctl.conf sysctl -p |
Haproxy支持多實例,每一個實例能夠有本身的單獨配置文件。啓動的時候用-f指定配置文件便可。下面增長一個實例,用來代理ssh服務
cat > /usr/local/haproxy/conf/haproxy-ssh.conf <<EOF global chroot /usr/local/haproxy/var/chroot daemon group haproxy user haproxy log 127.0.0.1 local0 info pidfile /usr/local/haproxy/var/run/haproxy-ssh.pid maxconn 25600 nbproc 1 defaults log global contimeout 5000 clitimeout 50000 srvtimeout 50000 listen ssh bind 192.168.1.104:999 mode tcp server ssh 192.168.1.104:22 check EOFF
啓動,並查看 [root@localhost haproxy]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy-ssh.conf [root@localhost haproxy]# netstat -anput | grep 999 tcp 0 0 192.168.1.104:999 0.0.0.0:* LISTEN 26234/sbin/haproxy |
FAQ
Haproxy命令參數
[root@localhostsbin]# ./haproxy -h
HA-Proxyversion 1.4.21 2012/05/21
Copyright2000-2012 Willy Tarreau <w@1wt.eu>
Usage: haproxy [-f <cfgfile>]* [ -vdVD ] [ -n <maxconn> ] [ -N<maxpconn> ]
[ -p <pidfile> ] [ -m <maxmegs> ]
-v displays version ; -vv shows knownbuild options.
-d enters debug mode ; -db onlydisables background mode.
-V enters verbose mode (disables quietmode)
-D goes daemon
-q quiet mode : don't display messages
-c check mode : only check config filesand exit
-n sets the maximum total # ofconnections (2000)
-m limits the usable amount of memory(in MB)
-N sets the default, per-proxy maximum# of connections (2000)
-p writes pids of all children to thisfile
-de disables epoll() usage even whenavailable
-ds disables speculative epoll() usageeven when available
-dp disables poll() usage even whenavailable
-sf/-st [pid ]* finishes/terminates oldpids. Must be last arguments.
譯文:
haproxy -f <配置文件> [-n 最大併發鏈接總數] [-N 每一個偵聽的最大併發數] [-d] [-D] [-q] [-V] [-c][-p] [-s] [-l] [-dk] [-ds] [-de] [-dp] [-db] [-m <內存限制M>] [{-sf|-st} pidlist...]
-d 前臺,debug模式
-D daemon模式啓動
-q 安靜模式,不輸出信息
-V 詳細模式
-c 對配置文件進行語法檢查
-s 顯示統計數據
-l 顯示詳細統計數據
-dk 不使用kqueue
-ds 不使用speculative epoll
-de 不使用epoll
-dp 不使用poll
-db 禁用後臺模式,程序跑在前臺
-sf 程序啓動後向pidlist裏的進程發送FINISH信號,這個參數放在命令行的最後
-st 程序啓動後向pidlist裏的進程發送TERMINATE信號,這個參數放在命令行的最後