天天看點

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

背景:最近公司上了一個項目,項目主要是實作手機終端通路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" &gt;/proc/sys/net/ipv4/conf/lo/arp_ignore

       echo "2" &gt;/proc/sys/net/ipv4/conf/lo/arp_announce

       echo "1" &gt;/proc/sys/net/ipv4/conf/all/arp_ignore

       echo "2" &gt;/proc/sys/net/ipv4/conf/all/arp_announce

       sysctl -p &gt;/dev/null 2&gt;&amp;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" &gt;/proc/sys/net/ipv4/conf/lo/arp_ignore

       echo "0" &gt;/proc/sys/net/ipv4/conf/lo/arp_announce

       echo "0" &gt;/proc/sys/net/ipv4/conf/all/arp_ignore

       echo "0" &gt;/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

  -&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  10.6.1.214:80 wlc persistent 600

  -&gt; 10.6.1.212:80                Route   1      0          0         

  -&gt; 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 -&gt; 10.6.1.212:80

Sep 29 12:00:08 localhost nanny[16217]: starting LVS client monitor for 10.6.1.214:80 -&gt; 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,如需轉載請自行聯系原作者