Haproxy的介紹和安裝

Haproxy的介紹和安裝mysql

Haproxy介紹

軟件介紹

Haproxy是一個開源的高性能的反向代理或者說是負載均衡服務軟件之一,它支持雙機熱備,虛擬主機,基於TCP和HTTP應用代理等功能。配置簡單,並且擁有服務器節點的健康檢查功能(至關於keepalived健康檢查),當後端服務器宕機時,haproxy會自動將故障服務器摘除,當服務器故障恢復後,再自動加入到集羣中。linux

Haproxy特別在適用於那些訪問量很大,但又須要會話保持或七層應用的業務。支持兩種主要的代理模式:4層Tcp代理(例如郵件服務,mysql業務,ssh等)和7層(HTTP代理)。在4層tcp模式下,haproxy僅在客戶端和服務器之間轉發雙向流量。7層模式下haproxy會分析應用層協議,而且能經過容許,拒絕,交換,增長,修改或者刪除請求或者回應裏指定內容來控制協議nginx

Haproxy採用的是NAT模式,數據包來去都會通過haproxy。web

4層代理和7層代理介紹

Haproxy軟件的4層tcp代理應用很是優秀,配置很是簡單方便,比lvs和nginx要方便的多,haproxy不須要在RS端執行腳本便可實現應用代理redis

wKioL1WBRQixnaolAAOHoxZE8bc088.jpg

從上圖能夠看出,haproxy採用的是NAT的工做模式,網站全部流量都通過haproxy,因此適用於那些訪問量不是特別大的網站,在通常的中小型公司,建議使用haproxy作負載均衡。算法

 

Haproxy最大額優勢在於其7層的根據URL請求頭應用過濾的功能,在門戶網站的高併發生產架構中。Haproxy軟件通常用在LVS軟件的下一層,或掛在硬件負載均衡althon、NS、F5下使用sql

wKiom1WBQ2zRnLSvAAQmjxeSqpQ525.jpg

 

Haproxy安裝部署

下載軟件包,並安裝

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已經安裝完成。配置須要咱們手動建立,下面先簡單進行配置,並測試

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

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狀態顯示顏色便可看

wKioL1WBRYXjDo2LAAV_gkGRSM0021.jpg

wKiom1WBQ9bSC5SuAAWK1yfUQQE726.jpg

wKioL1WBRbTxxxkaAAVeq1Ed7CE660.jpg

這就是簡單的haproxy HTTP代理。4層代理的話須要把mode模式改成tcp

Haproxy記錄日誌配置

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接替主haproxy繼續工做。其原理是:主備都同時監聽VIP,而VIP由高可用軟件提供(heartbeat或keepalived等),可是正常狀況下VIP在主haproxy上,由主haproxy響應客戶端請求。當主haproxy宕機以後,VIP漂移到備haproxy設備上,此時,備haproxy會繼續響應客戶端的請求。

由此能夠看出:主備haproxy的配置文件必須保持一致

主備haproxy切換過程其實就是VIP的漂移過程,VIP漂移到哪一個設備上,那個設備就開始響應請求

解決不存在VIP致使Haproxy啓動報錯

在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...                                  [失敗]

 

解決方法:

  1.         查看服務器自己已經存在的端口是否和配置文件中監聽的端口衝突,常見的是80端口衝突,當服務器自己已經在運行http或者其餘web服務時候,已經佔用了80端口,haproxy啓動的時候沒法監聽80端口,就會報這個錯誤,因此須要把佔用80端口的服務kill掉,或者直接卸載。

  2.         當不存在端口問題時候,須要修改內核參數。使haproxy啓動的時候忽略vip是否存在

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多實例配置

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信號,這個參數放在命令行的最後

相關文章
相關標籤/搜索