背景:最近公司上了一個項目,項目主要是實現手機終端訪問WEB頁面,可是用戶量較大,須要實現負載均衡,通過方案選型,最終選擇了用Piranha+LVS+nginx來實現。php
環境:
nginx
操做系統 Centos 6.6 _X64
web
WEB nginx瀏覽器
結構:
bash
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接管。
網絡
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方案基本套件安裝:tcp
3.1 #yum install ipvsadm modcluster piranha system-config-cluster php php-cli php-commonide
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
5.啓動LVS服務pulse
# /etc/init.d/pulse start
若是不報錯,表示啓動成功!到此LVS的服務器已經配置完成了啓動兩個程序
一、piranha-gui 是用來配置LVS的
二、pulse 是用來啓動LVS的
6.備份LVS安裝與配置
備份LVS安裝同主LVS安裝方法一樣.直接將lvs.conf拷貝到相應的目錄下:
#scp lvs.cf root@10.6.1.211:/etc/sysconfig/ha/
注: 主備服務器上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
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
echo "RealServer Start OK"
;;
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命令.
在測試的過程當中,我本機訪問VIP http://10.6.1.214 時,老是訪問到realserver10.6.1.212 上,換瀏覽器也是同樣,我覺得配置有問題,後來才發現:原來同一個IP訪問的請求會分配到同一臺服務器上。 你換個IP訪問就OK了。