利用Piranha+LVS方案實現WEB負載均衡

                          


背景:最近公司上了一個項目,項目主要是實現手機終端訪問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)HeartbeatHA (pulse,send_arp)
LoadBalancerReal 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接管。
網絡

wKioL1YJFWeR1c75AAE-Ln2SF1Y661.jpg


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 (就是剛纔設置的密碼)

     wKioL1YJFRqAoeYqAAGf4wkhns0017.jpg




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

wKiom1YJ_nqjSMUXAAHFPH3XqkE789.jpg


2.配置備份LVS

wKiom1YJ_nrgSk_2AAHY8Am5DQE937.jpg



3. 配置添加LVS( VIP信息)

wKioL1YJ_oWyoSYgAAM58sYmfRw695.jpg



4.配置Realserver

wKiom1YJ_nuyAd31AAGHlcahNg0710.jpg



點擊」編輯」添加具體的Realsever信息.

wKioL1YJ_oWA6-ZmAAENqusl8HY603.jpg


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了。


wKioL1YKDiSwu9_3AAF5v_gEUAE912.jpg

相關文章
相關標籤/搜索