說明:
操作系統: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
mode http
balance source #設置負載均衡模式,source保存session值,roundrobin輪詢模式
#option httpchk /index.php #檢測服務器此文件是否存在,如果沒有,則認爲服務器連接異常,此參數可以不設置
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
#####################################################################
:wq! #保存退出
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
:wq! #保存退出
vi /etc/sysconfig/syslog #編輯修改
SYSLOGD_OPTIONS="-r -m 0" #接收遠程服務器日誌
:wq! #保存退出
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 {
}
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
interface eth0
virtual_router_id 52
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.21.254
}
notify_master "/etc/keepalived/clean_arp.sh 192.168.21.254" #更新虛擬服務器(VIP)地址的arp記錄到網關
}
#########################################################
:wq! #保存退出
#########################################################
#以下爲192.168.21.130服務器:
192.168.21.130
! Configuration File for keepalived
global_defs {
notification_email {
}
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 BACKUP
interface eth0
virtual_router_id 51
priority 99
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 MASTER
interface eth0
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.21.254
}
notify_master "/etc/keepalived/clean_arp.sh 192.168.21.254" #更新虛擬服務器(VIP)地址的arp記錄到網關
}
:wq! #保存退出
五、設置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
fi
#########################################################
:wq! #保存退出
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
:wq! #保存退出
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
登錄之後如下圖所示
二、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
如下圖所示:
可以看出現在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/
如下圖所示:
此時,bbs和sns域名都被均衡到192.168.21.127上面
三、停止192.168.21.127上面的nginx服務
service nginx stop
繼續打開上面的兩個網址,如下圖所示:
此時,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
如下圖所示:
可以看出VIP:192.168.21.253和192.168.21.254均指向到192.168.21.130;
此時,打開http://bbs.osyunwei.com/如下圖所示:
可以正常訪問
五、恢復192.168.21.129上面的keepalived服務,恢復192.168.21.127上面的nginx服務
停止192.168.21.130上面的Keepalived服務
service keepalived stop
在兩臺HAProxy服務器:192.168.21.129、192.168.21.130上執行命令:ip addr
如下圖所示:
可以看出VIP:192.168.21.253和192.168.21.254均指向到192.168.21.129;
此時,打開http://sns.osyunwei.com/如下圖所示:
可以正常訪問
備註:
查看HAProxy日誌文件:
tail -f /var/log/haproxy.log
至此,HAProxy+Keepalived實現Web服務器負載均衡配置完成。