天天看點

HAProxy+Keepalived實作Web伺服器負載均衡

HAProxy+Keepalived實作Web伺服器負載均衡

HAProxy+Keepalived實作Web伺服器負載均衡

說明:

作業系統:CentOS 5.X 64位

Web伺服器:192.168.21.127、192.168.21.128

站點:bbs.osyunwei.com和sns.osyunwei.com部署在兩台Web伺服器上

實作目的:

增加兩台伺服器(主主模式),通過HAProxy+Keepalived實作Web伺服器負載均衡

架構規劃:

HAProxy伺服器:192.168.21.129、192.168.21.130

虛拟伺服器(VIP):192.168.21.253、192.168.21.254

部署完成之後:

1、VIP:192.168.21.253指向192.168.21.129;VIP:192.168.21.254指向192.168.21.130;

2、當192.168.21.129當機時,VIP:192.168.21.253漂移到192.168.21.130上;

3、當192.168.21.130當機時,VIP:192.168.21.254漂移到192.168.21.129上;

這樣的主主模式好處是,兩台伺服器在提供服務的同時,又互為對方的備份伺服器。

具體操作:

第一部分:在兩台HAProxy伺服器上分别操作

一、關閉SElinux、配置防火牆

1、vi /etc/selinux/config

#SELINUX=enforcing #注釋掉

#SELINUXTYPE=targeted #注釋掉

SELINUX=disabled #增加

:wq!  #儲存退出

setenforce 0 #使配置立即生效

2、vi /etc/sysconfig/iptables  #編輯

-A RH-Firewall-1-INPUT -d 224.0.0.18 -j ACCEPT  #允許多點傳播位址通信

-A RH-Firewall-1-INPUT -p    vrrp    -j ACCEPT  #允許VRRP(虛拟路由器備援協)通信

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT  #允許80端口通過防火牆

:wq! #儲存退出

/etc/init.d/iptables restart #重新開機防火牆使配置生效

二、安裝HAProxy

1、建立HAProxy運作賬戶群組

groupadd haproxy #添加haproxy組

useradd -g haproxy haproxy -s /bin/false #建立nginx運作賬戶haproxy并加入到haproxy組,不允許haproxy使用者直接登入系統

2、安裝編譯工具

yum install  gcc gcc-c++ make openssl-devel kernel-devel

3、安裝HAProxy

HAProxy下載下傳位址:http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.24.tar.gz

上傳haproxy-1.4.24.tar.gz到/usr/local/src目錄中

cd /usr/local/src #進入軟體包存放目錄

tar zxvf haproxy-1.4.24.tar.gz #解壓

cd  haproxy-1.4.24  #進入安裝目錄

make  TARGET=linux26 CPU=x86_64  PREFIX=/usr/local/haprpxy  #編譯

make install PREFIX=/usr/local/haproxy  #安裝

參數說明:

TARGET=linux26

#使用uname -r檢視核心,如:2.6.18-371.el5,此時該參數就為linux26

#kernel 大于2.6.28的用:TARGET=linux2628

CPU=x86_64   #使用uname -r檢視系統資訊,如x86_64 x86_64 x86_64 GNU/Linux,此時該參數就為x86_64

PREFIX=/usr/local/haprpxy   #/usr/local/haprpxy為haprpxy安裝路徑

4、設定HAProxy

mkdir -p  /usr/local/haproxy/conf  #建立配置檔案目錄

mkdir -p /etc/haproxy  #建立配置檔案目錄

cp /usr/local/src/haproxy-1.4.24/examples/haproxy.cfg  /usr/local/haproxy/conf/haproxy.cfg  #拷貝配置模闆檔案

ln -s  /usr/local/haproxy/conf/haproxy.cfg   /etc/haproxy/haproxy.cfg  #添加配置檔案軟連接配接

cp -r  /usr/local/src/haproxy-1.4.24/examples/errorfiles  /usr/local/haproxy/errorfiles  #拷貝錯誤頁面

ln -s  /usr/local/haproxy/errorfiles  /etc/haproxy/errorfiles  #添加軟連接配接

mkdir -p  /usr/local/haproxy/log  #建立日志檔案目錄

touch  /usr/local/haproxy/log/haproxy.log  #建立日志檔案

ln -s  /usr/local/haproxy/log/haproxy.log  /var/log/haproxy.log  #添加軟連接配接

cp /usr/local/src/haproxy-1.4.24/examples/haproxy.init  /etc/rc.d/init.d/haproxy  #拷貝開機啟動檔案

chmod +x  /etc/rc.d/init.d/haproxy  #添加腳本執行權限

chkconfig haproxy on  #設定開機啟動

ln -s  /usr/local/haproxy/sbin/haproxy  /usr/sbin  #添加軟連接配接

5、配置haproxy.cfg參數

cp  /usr/local/haproxy/conf/haproxy.cfg   /usr/local/haproxy/conf/haproxy.cfg-bak  #備份

vi  /usr/local/haproxy/conf/haproxy.cfg  #編輯,修改

#####################################################################

# this config needs haproxy-1.1.28 or haproxy-1.2.1

global

log 127.0.0.1   local0 #在本機記錄日志

log 127.0.0.1   local1 notice

#log loghost    local0 info

maxconn 65535   #每個程序可用的最大連接配接數

nbproc  8  #程序數量,可以設定多個,提高處理效率

chroot /usr/local/haproxy  #haproxy安裝目錄

uid 500  #運作haproxy的使用者uid(cat /etc/passwd檢視)

gid 500  #運作haproxy的組uid(cat /etc/group檢視)

daemon   #以背景守護程序運作

pidfile /usr/local/haproxy/haproxy.pid  #将所有程序寫入pid檔案

#debug   #調試模式

#quiet   #安裝模式

defaults

#log     global

log  127.0.0.1   local3  #日志檔案設定

mode    http  #運作模式tcp、http、health

option  httplog

option  http-pretend-keepalive  #伺服器端保持長連接配接

option  http-server-close   #每次請求完畢後主動關閉http通道

option  forceclose    #服務端響應後主動關閉請求連接配接,及早釋放服務連接配接,不必等到用戶端應答确認

option  httpclose       #每次請求完畢後主動關閉http通道

option  accept-invalid-http-request       #接受無效的http請求,一般建議不設定,但是可解決部分雜牌浏覽器通路打不開頁面問題

option  dontlognull     #不記錄健康檢查的日志資訊

option  redispatch  #如果後端有伺服器當機,強制切換到正常伺服器

option  abortonclose  #丢棄由于用戶端等待時間過長而關閉連接配接但仍在haproxy等待隊列中的請求

option  forwardfor  except 127.0.0.0/8  #不記錄本機轉發的日志

option  originalto  #記錄用戶端通路的目的IP

maxconn  65535  #每個程序可用的最大連接配接數

balance source  #同一IP位址的所有請求都發送到同一伺服器

retries 3   #三次連接配接失敗,則判斷服務不可用

contimeout      5000  #連接配接逾時

clitimeout      50000 #用戶端逾時

srvtimeout      50000 #伺服器逾時

timeout check 5s  #檢測逾時

timeout http-request 5s  #http請求逾時時間

timeout queue 30s  #一個請求在隊列裡的逾時時間

timeout http-keep-alive  5s  #設定http-keep-alive的逾時時間

stats refresh 30s #統計頁面自動重新整理時間

stats uri  /haproxy-status  #統計頁面URL路徑

stats realm haproxy-status  #統計頁面輸入密碼框提示資訊

stats auth admin:123456     #統計頁面使用者名和密碼

stats hide-version          #隐藏統計頁面上HAProxy版本資訊

frontend    web  #自定義描述資訊

bind :80  #監聽80端口

acl bbs.osyunwei.com  hdr(host) -i bbs.osyunwei.com  #規則設定,-i後面是要通路的域名,如果通路bbs.osyunwei.com這個域名,就負載均衡到bbs.osyunwei.com作用域

use_backend bbs.osyunwei.com if bbs.osyunwei.com   #acl和if後面的名稱必須相同這裡為bbs.osyunwei.com

acl sns.osyunwei.com  hdr(host) -i sns.osyunwei.com  #規則設定,-i後面是要通路的域名,如果通路sns.osyunwei.com這個域名,就負載均衡到sns.osyunwei.com作用域

use_backend sns.osyunwei.com if sns.osyunwei.com

backend     bbs.osyunwei.com

mode http

balance   source

#option  httpchk /index.php  #檢測伺服器此檔案是否存在,如果沒有,則認為伺服器連接配接異常,此參數可以不設定

server     192.168.21.127  192.168.21.127:80   check  inter  2000  rise 3  fall  3  weight 100   #inter  2000 心跳檢測時間;rise 3 三次連接配接成功,表示伺服器正常;fall  3 三次連接配接失敗,表示伺服器異常; weight 100 權重設定

server     192.168.21.128  192.168.21.128:80   check  inter  2000  rise 3  fall  3  weight 100

backend     sns.osyunwei.com

balance   source  #設定負載均衡模式,source儲存session值,roundrobin輪詢模式

server     192.168.21.127  192.168.21.127:80   check  inter  2000  rise 3  fall  3  weight 100

server     192.168.21.128  192.168.21.128:80   check  inter  2000  rise 3  fall  3  weight 100

#errorloc  503  http://www.osyunwei.com/404.html

errorfile 403 /etc/haproxy/errorfiles/403.http

errorfile 500 /etc/haproxy/errorfiles/500.http

errorfile 502 /etc/haproxy/errorfiles/502.http

errorfile 503 /etc/haproxy/errorfiles/503.http

errorfile 504 /etc/haproxy/errorfiles/504.http

service haproxy start #啟動

service haproxy stop  #關閉

service haproxy restart  #重新開機

6、設定HAProxy日志

vi  /etc/syslog.conf  #編輯,在最下邊增加

# haproxy.log

local0.*          /var/log/haproxy.log

local3.*          /var/log/haproxy.log

vi  /etc/sysconfig/syslog   #編輯修改

SYSLOGD_OPTIONS="-r -m 0"   #接收遠端伺服器日志

service syslog restart  #重新開機syslog

三、安裝keepalived

下載下傳keeplived:http://www.keepalived.org/software/keepalived-1.2.12.tar.gz

上傳keepalived-1.2.12.tar.gz到/usr/local/src目錄

cd /usr/local/src

tar zxvf keepalived-1.2.12.tar.gz

cd keepalived-1.2.12

./configure  #配置,必須看到以下提示,說明配置正确,才能繼續安裝

Use IPVS Framework : Yes

IPVS sync daemon support : Yes

Use VRRP Framework       : Yes

make #編輯

make install  #安裝

cp /usr/local/etc/sysconfig/keepalived  /etc/sysconfig/

mkdir /etc/keepalived

cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

cp /usr/local/sbin/keepalived /usr/sbin/

cp /usr/local/etc/rc.d/init.d/keepalived  /etc/rc.d/init.d/

chmod +x /etc/rc.d/init.d/keepalived  #添加執行權限

chkconfig keepalived on  #設定開機啟動

service keepalived start #啟動

service keepalived stop  #關閉

service keepalived restart  #重新開機

四、配置keepalived

cp /etc/keepalived/keepalived.conf  /etc/keepalived/keepalived.conf-bak

vi /etc/keepalived/keepalived.conf  #編輯,修改為以下代碼

#########################################################

#以下為192.168.21.129伺服器:

! Configuration File for keepalived

global_defs {

notification_email {

[email protected]

[email protected]

[email protected]

}

notification_email_from [email protected]

smtp_server 192.168.200.1

smtp_connect_timeout 30

router_id LVS_DEVEL

vrrp_script chk_haproxy {

script "/etc/keepalived/check_haproxy.sh"  #HAproxy服務監控腳本

interval 2

weight 2

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

track_script {

chk_haproxy #監測haproxy程序狀态

virtual_ipaddress {

192.168.21.253

notify_master "/etc/keepalived/clean_arp.sh  192.168.21.253"  #更新虛拟伺服器(VIP)位址的arp記錄到網關

vrrp_instance VI_2 {

state BACKUP

virtual_router_id 52

priority 99

192.168.21.254

notify_master "/etc/keepalived/clean_arp.sh  192.168.21.254"  #更新虛拟伺服器(VIP)位址的arp記錄到網關

#以下為192.168.21.130伺服器:

192.168.21.130

五、設定HAproxy服務監控腳本

vi  /etc/keepalived/check_haproxy.sh #編輯,添加以下代碼

#!/bin/bash

A=`ps -C haproxy --no-header | wc -l`

if [ $A -eq 0 ]

then service haproxy start

sleep 3

if [ `ps -C haproxy --no-header | wc -l ` -eq 0 ]

then service keepalived stop

fi

chmod +x /etc/keepalived/check_haproxy.sh   #添加執行權限

六、設定更新虛拟伺服器(VIP)位址的arp記錄到網關腳本

vi  /etc/keepalived/clean_arp.sh  #編輯,添加以下代碼

#!/bin/sh

VIP=$1

GATEWAY=192.168.21.2 #網關位址

/sbin/arping -I eth0 -c 5 -s $VIP $GATEWAY &>/dev/null

chmod +x /etc/keepalived/clean_arp.sh  #添加腳本執行權限

七、系統核心優化

在兩台HAProxy伺服器上分别操作

sed -i "s/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g" '/etc/sysctl.conf'

echo -e "net.core.somaxconn = 262144" >> /etc/sysctl.conf

echo -e "net.core.netdev_max_backlog = 262144" >> /etc/sysctl.conf

echo -e "net.core.wmem_default = 8388608" >> /etc/sysctl.conf

echo -e "net.core.rmem_default = 8388608" >> /etc/sysctl.conf

echo -e "net.core.rmem_max = 16777216" >> /etc/sysctl.conf

echo -e "net.core.wmem_max = 16777216" >> /etc/sysctl.conf

echo -e "net.ipv4.route.gc_timeout = 20" >> /etc/sysctl.conf

echo -e "net.ipv4.ip_local_port_range = 1025 65535" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_retries2 = 5" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_syn_retries = 1" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_synack_retries = 1" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_timestamps = 0" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_tw_recycle = 1" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_keepalive_time = 120" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_keepalive_probes = 3" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_keepalive_intvl = 15" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_max_tw_buckets = 200000" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_max_orphans = 3276800" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_max_syn_backlog = 262144" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_wmem = 8192 131072 16777216" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_rmem = 32768 131072 16777216" >> /etc/sysctl.conf

echo -e "net.ipv4.tcp_mem = 94500000 915000000 927000000" >> /etc/sysctl.conf

echo -e "net.ipv4.ip_conntrack_max = 25000000" >> /etc/sysctl.conf

echo -e "net.ipv4.netfilter.ip_conntrack_max = 25000000" >> /etc/sysctl.conf

echo -e "net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180" >> /etc/sysctl.conf

echo -e "net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 1" >> /etc/sysctl.conf

echo -e "net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60" >> /etc/sysctl.conf

echo -e "net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120" >> /etc/sysctl.conf

第二部分:測試HAProxy+Keepalived是否正常運作

一、打開HAProxy監控頁面

http://bbs.osyunwei.com/haproxy-status

輸入使用者名,密碼

admin

123456

登入之後如下圖所示

HAProxy+Keepalived實作Web伺服器負載均衡
HAProxy+Keepalived實作Web伺服器負載均衡

二、bbs.osyunwei.com 解析到192.168.21.253;sns.osyunwei.com 解析到192.168.21.254;

在兩台HAProxy伺服器:192.168.21.129、192.168.21.130上執行指令:ip addr

如下圖所示:

HAProxy+Keepalived實作Web伺服器負載均衡
HAProxy+Keepalived實作Web伺服器負載均衡

可以看出現在VIP:192.168.21.253指向192.168.21.129;VIP:192.168.21.254指向192.168.21.130;

在浏覽器中打開

http://bbs.osyunwei.com/

http://sns.osyunwei.com/

如下圖所示:

HAProxy+Keepalived實作Web伺服器負載均衡

此時,bbs和sns域名都被均衡到192.168.21.127上面

三、停止192.168.21.127上面的nginx服務

service nginx stop

繼續打開上面的兩個網址,如下圖所示:

HAProxy+Keepalived實作Web伺服器負載均衡

此時,bbs和sns域名都被均衡到192.168.21.128上面(由于192.168.21.127伺服器nginx服務被關閉,實作了故障轉移)

四、關閉192.168.21.129上面的keepalived服務

service  keepalived  stop

此時,在兩台HAProxy伺服器:192.168.21.129、192.168.21.130上執行指令:ip addr

HAProxy+Keepalived實作Web伺服器負載均衡
HAProxy+Keepalived實作Web伺服器負載均衡

可以看出VIP:192.168.21.253和192.168.21.254均指向到192.168.21.130;

此時,打開http://bbs.osyunwei.com/如下圖所示:

HAProxy+Keepalived實作Web伺服器負載均衡

可以正常通路

五、恢複192.168.21.129上面的keepalived服務,恢複192.168.21.127上面的nginx服務

停止192.168.21.130上面的Keepalived服務

service keepalived stop

HAProxy+Keepalived實作Web伺服器負載均衡
HAProxy+Keepalived實作Web伺服器負載均衡

可以看出VIP:192.168.21.253和192.168.21.254均指向到192.168.21.129;

此時,打開http://sns.osyunwei.com/如下圖所示:

HAProxy+Keepalived實作Web伺服器負載均衡

備注:

檢視HAProxy日志檔案:

tail -f /var/log/haproxy.log

至此,HAProxy+Keepalived實作Web伺服器負載均衡配置完成。

     本文轉自yzy121403725 51CTO部落格,原文連結:http://blog.51cto.com/lookingdream/1828723,如需轉載請自行聯系原作者