背景:最近公司上了一個項目,項目主要是實作手機終端通路WEB頁面,但是使用者量較大,需要實作負載均衡,經過方案選型,最終選擇了用Piranha+LVS+nginx來實作。
環境:
作業系統 Centos 6.6 _X64
WEB nginx
結構:
LVS-ACTIVE:10.6.1.210
LVS-BACKUP: 10.6.1.211
LVS-VIP: 10.6..1.214
Realsever: 10.6.1.212,10.6.1.213
一.Piranha方案基本簡紹.
1.Piranha方案優點:
1.1.1配置簡潔高效:
配置簡便一個lvs.conf配置檔案即可搞定(類keepalived方案.)
1.1.2WEB配置界面.
WEB配置對于那些不懂LVS配置的人員來說非常吸引力,你幾乎隻要花15分鐘就可以配置好一個完美的負載均衡及高可用性方案.
1.1.3完整的功能:
主備LVS (Load Balancer)的Heartbeat和HA (pulse,send_arp)
LoadBalancer和Real Server間程序服務的Heartbeat (nanny)
IPVS功能 (lvsd)
IPVS的管理 (ipvsadm)
2.Piranha方案原理結構描述:
Piranha方案是基于LVS基礎上設計的一套負載均衡高可用解決方案.
LVS運作在一對有相似配置的計算機上:
一個作為活動LVS Router(Active LVS Router),
一個作為備份LVS Router(Backup LVS Router)。
活動LVS Router服務有兩個角色:
* 均衡負載到真實伺服器上。
* 檢查真實伺服器提供的服務是否正常。
備份LVS Router用來監控活動的LVS Router,以備活動的LVS Router失敗時由備份LVS Router接管。
<a href="http://s3.51cto.com/wyfs02/M02/73/E2/wKioL1YJFWeR1c75AAE-Ln2SF1Y661.jpg" target="_blank"></a>
Pulse:
Pulse程序運作在活動LVS Router和備份LVS Router上。
在備份LVS Router上,pulse發送一個心跳(heartbeat)到活動LVS Router的公網接口上以檢查活動LVS Router是否正常。
在活動LVS Router上,pulse啟動lvs程序并響應來自于備份LVS Router的心跳。
lvsd:
lvs程序調用ipvsadm工具去配置和維護IPVS路由表,并為每一個在真實伺服器上的虛拟服務啟動一個nanny程序。
nanny:
每一個nanny程序去檢查真實伺服器上的虛拟服務狀态,并将故障情況通知lvs程序。假如一個故障被發現,lvs程序通知ipvsadm在IPVS路由表中将此節點删除。
send_arp:
如果備份LVS Router未收到來自于活動LVS Router的響應,
它将調用send_arp将虛拟IP位址再配置設定到備份LVS Router的公網接口上。
并在公網接口和區域網路接口上分别發送一個指令去關掉活動LVS Router上的lvs程序。同時啟動自己的lvs程序來排程用戶端請求。
3.Piranha方案基本套件安裝:
3.1 #yum install ipvsadm modcluster piranha system-config-cluster php php-cli php-common
3.2 # piranha-passwd 輸入一個密碼,要記住,後面登入WEB管理頁面要用到。
3.3 # /etc/init.d/piranha-gui start 啟動piranha頁面服務。
3.4 在浏覽器裡輸入http://10.6.1.210:3636 , 點選login . 使用者名:piranha 密碼:redhat (就是剛才設定的密碼)
4.配置檔案介紹及常用指令:
/etc/sysconfig/ha/lvs.cf //由http://ip:3636 web界面配置的配置檔案寫入此檔案.
/etc/init.d/piranha-gui start //啟動piranha服務的WEB配置界面.
/etc/init.d/pulse start //啟動piranha服務讀取的就是/etc/sysconfig/ha/lvs.cf.
/etc/init.d/pulse stop //停止LVS服務
二。 Piranha配置
配置主備LVS伺服器(主備Server都要提前按3步驟安裝Piranha).
# vi /etc/sysctl.conf找到下面行 //啟用資料轉發.
net.ipv4.ip_forward = 0将0 改成1,net.ipv4.ip_forward = 1
執行如下指令來應用:sysctl -p
通過WEB界面配置Piranha服務.
http://10.6.1.210:3636, 使用者名:piranha 密碼:redhat
登陸後,選擇Global Settings 這是對LVS的配置
Primary server public IP 輸入公網IP:10.6.1.210,應用後按ACCEPT按鈕儲存設定。
通過WEB配置主LVS的資訊
1. 配置主LVS
<a href="http://s3.51cto.com/wyfs02/M01/73/E9/wKiom1YJ_nqjSMUXAAHFPH3XqkE789.jpg" target="_blank"></a>
2.配置備份LVS
<a href="http://s3.51cto.com/wyfs02/M00/73/E9/wKiom1YJ_nrgSk_2AAHY8Am5DQE937.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/73/E7/wKioL1YJ_oWyoSYgAAM58sYmfRw695.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/73/E9/wKiom1YJ_nuyAd31AAGHlcahNg0710.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/73/E7/wKioL1YJ_oWA6-ZmAAENqusl8HY603.jpg" target="_blank"></a>
5.啟動LVS服務pulse
# /etc/init.d/pulse start
如果不報錯,表示啟動成功!到此LVS的伺服器已經配置完成了啟動兩個程式
1、piranha-gui 是用來配置LVS的
2、pulse 是用來啟動LVS的
6.備份LVS安裝與配置
備份LVS安裝同主LVS安裝方法同樣.直接将lvs.conf拷貝到相應的目錄下:
注: 主備伺服器上lvs.cf配置檔案内容是一樣的。
在LVS-BACKUP 10.6.1.211上啟動LVS服務.
# /etc/init.d/pulse start 啟動服務即可.
7.安裝配置Realserver, 主要在realserver上安裝nginx服務和配置nginx檔案等,此處省略。
注:LVS網絡模式選擇DR,即直接路由; 且選擇不同的模式,相應的realserver執行的腳本是不同的,此處隻對DR做配置。
有兩種方法,任取其一即可,推薦方法二。
方法一:
1)
通過iptables實作Real Server的目标位址重定向:
[root@server3 ~]# iptables -t nat -A PREROUTING -d 10.6.1.214/32 -p tcp -m tcp --dport 80 -j REDIRECT
[root@server3 ~]# /etc/init.d/iptables save
[root@server3 ~]# chkconfig iptables on
要求在所有Real Server中通過iptables在防火牆的nat鍊中加入規則,将所有通過80端口外發資料包的目标位址模拟成虛拟IP的位址 10.6.1.214,然後發送給使用者端,以便使用者端可以正常接收此傳回資訊。是以請確定沒有其他iptables規則與此規則沖突,并保證所有 通過80端口外發的包都經過了此規則的處理。
2) 把下面的寫成腳本,加入/etc/rc.local中開機執行
##################################################################
#!/bin/bash
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
或者把下面指令寫入/etc/sysctl.conf檔案中,然後執行sysctl -p指令,使生效。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
+++++++++++++++++++++++++++++++++++++++++++++
方法二:
寫如下腳本,命名為realserver, 放入目錄/etc/init.d/realserver,
啟動腳本
service realserver start
把該腳本加入系統自動啟動
chkconfig realserver on
####################################################################
#!/bin/bash
# description: Config realserver
#Written by shixl
# chkconfig: 2345 10 90
# description: realserver ...
SNS_VIP=10.6.1.169
. /etc/rc.d/init.d/functions
case "$1" in
start)
/sbin/ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP up
;;
stop)
/sbin/ifconfig lo:0 down
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
到此配置完成。
三。 測試。
說明: 可以通過停止主LVS,看備LVS能否接管服務; 可以停止其中一台realserver,看連接配接狀态裡是否還能看到停止的伺服器,多注意日志的變化并分析。
下面有幾個指令可檢視狀态:
檢視LVS的連接配接情況:ipvsadm -L -n
檢視LVS的吞吐量情況: ipvsadm -L -n --rate
檢視LVS的統計資訊:ipvsadm -L -n --stats
實時檢視LVS連接配接狀态變化: watch ipvsadm -ln
ipvsadm –ln //檢視LVS連接配接狀态.
[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.6.1.214:80 wlc persistent 600
-> 10.6.1.212:80 Route 1 0 0
-> 10.6.1.213:80 Route 1 0 0
檢視日志。tail -f /var/log/messages
Sep 28 16:03:03 localhost kernel: IPVS: stopping backup sync thread 7242 ...
Sep 28 16:03:04 localhost nanny[7302]: [ active ] making 10.6.1.213:80 available
Sep 28 16:03:04 localhost kernel: IPVS: sync thread started: state = MASTER, mcast_ifn = eth0, syncid = 0
Sep 28 16:03:04 localhost kernel: send_arp uses obsolete (PF_INET,SOCK_PACKET)
Sep 28 16:03:04 localhost nanny[7301]: [ active ] making 10.6.1.212:80 available
Sep 28 16:03:05 localhost ntpd[1546]: Listen normally on 21 eth0:1 10.6.1.214 UDP 123
Sep 28 16:03:05 localhost ntpd[1546]: peers refreshed
Sep 28 16:03:09 localhost pulse[7309]: gratuitous lvs arps finished
Sep 28 16:32:11 localhost nanny[7301]: [inactive] shutting down 10.6.1.212:80 due to connection failure
Sep 28 16:33:11 localhost nanny[7301]: [ active ] making 10.6.1.212:80 available
分析:
如日志中出現: gratuitous lvs arps finished, 表示LVS啟動成功。
如日志中出現:[inactive] shutting down 10.6.1.212:80 due to connection failure,我把一台realserver停止了。
如日志中出現:ocalhost nanny[7301]: [ active ] making 10.6.1.212:80 available ,我把realserver又啟動了。
——————————————————————————————————————
備機LVS處于監聽狀态,主LVS關閉後,備機在設定的時間内接替主服務,如下日志顯示。
Sep 29 11:59:20 localhost kernel: IPVS: sync thread started: state = BACKUP, mcast_ifn = eth0, syncid = 0
Sep 29 12:00:08 localhost pulse[16199]: partner dead: activating lvs
Sep 29 12:00:08 localhost lvsd[16212]: starting virtual service WEB_LVS active: 80
Sep 29 12:00:08 localhost lvsd[16212]: create_monitor for WEB_LVS/WEB_A running as pid 16216
Sep 29 12:00:08 localhost lvsd[16212]: create_monitor for WEB_LVS/WEB_B running as pid 16217
Sep 29 12:00:08 localhost nanny[16216]: starting LVS client monitor for 10.6.1.214:80 -> 10.6.1.212:80
Sep 29 12:00:08 localhost nanny[16217]: starting LVS client monitor for 10.6.1.214:80 -> 10.6.1.213:80
Sep 29 12:00:08 localhost kernel: IPVS: stopping backup sync thread 16204 ...
Sep 29 12:00:08 localhost kernel: IPVS: sync thread started: state = MASTER, mcast_ifn = eth0, syncid = 0
Sep 29 12:00:09 localhost nanny[16217]: [ active ] making 10.6.1.213:80 available
Sep 29 12:00:09 localhost nanny[16216]: [ active ] making 10.6.1.212:80 available
Sep 29 12:00:10 localhost ntpd[1672]: Listen normally on 9 eth0:1 10.6.1.214 UDP 123
Sep 29 12:00:10 localhost ntpd[1672]: peers refreshed
Sep 29 12:00:13 localhost pulse[16223]: gratuitous lvs arps finished
—————————————————————————————————————————
【注】服務切換測試:
測試過程中多注意分析日志.在Linuxtone網站編寫heartbeat+lvs方案的時候還需要自己送一個arping指令告訴網關我的MAC發生變化了.但是Piranha方案能自動送一個arp指令.
<a href="http://s3.51cto.com/wyfs02/M01/73/E7/wKioL1YKDiSwu9_3AAF5v_gEUAE912.jpg" target="_blank"></a>
本文轉自pizibaidu 51CTO部落格,原文連結:http://blog.51cto.com/pizibaidu/1699080,如需轉載請自行聯系原作者