2008夏 較全的lvs+ha 個人文檔(2機,3機,4機以上)

火星人 @ 2014-03-04 , reply:0


2008夏 較全的lvs+ha 個人文檔(2機,3機,4機以上)

近期配了幾個lvs   一是給自己個小結
二是 所查網上lvs 大多陳舊 或語焉不詳   所以補個較新的 有不對之處請大家指正


vip :
192.168.1.198
虛擬ip
master:192.168.1.196
主分發伺服器
slave:
192.168.1.197
備份分發伺服器
real1:
192.168.1.191
響應伺服器1
real2:
192.168.1.192
響應伺服器2


實現以下目的
一)配置基於DR模式簡單Lvs
集群配置基於隧道模式Lvs
二)集群配置基於高可用Lvs+heartbeat
三)雙機lvs-ha

一、
配置基於DR模式Lvs集群


1、下載ipvsadm管理程序
ipvsadm-*.tar.gz

tar zxvf ipvsadm-*.tar.gz
cd ipvsadm-*
make && make install


注意在make時可能會出現很多錯誤的信息,請按照如下操作就可以心編譯正常
ln -s /usr/src/kernels/2.6.9-22.EL-i686//usr/src/linux

cd ipvsadm-*

make && make install
我機器是centos4
所以我yum安裝
yum -y install ipvsadm
# ipvs管理器

yum -y installlibnet
# 庫文件
yum -y install e2fsprogs
# 庫文件
yum -y installheartbeat
# linux-ha
yum –y installheartbeat-ldirectord

cp/usr/share/doc/heartbeat-2.1.*/ha.cf /etc/ha.d/
cp/usr/share/doc/heartbeat-2.1.*/authkeys /etc/ha.d/
cp/usr/share/doc/heartbeat-2.1.*/haresources /etc/ha.d/
cp /usr/share/doc/heartbeat-ldirectord-2.1.*/ldirectord.cf/etc/ha.d/




2、配置VIP腳本

# more/etc/init.d/lvsdr-basic
#!/bin/sh
#
# This script willbe executed *after* all the other init scripts.
# You can put yourown initialization stuff in here if you don't
# want to do thefull Sys V style init stuff.

VIP=192.168.1.198
RIP1=192.168.1.191
RIP2=192.168.1.192
###########################
# ifconfig a
#
#/sbin/ifconfigeth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
#
############################

#/sbin/route add-host $VIP dev eth0:0
#echo "1"> /proc/sys/net/ipv4/ip_forward

/etc/rc.d/init.d/functions

case "$1"in

start)

echo "startLVS of DirectorServer"
#Set the Virtual IPAddress

/sbin/ifconfigeth0:1 $VIP broadcast $VIP netmask 255.255.255.255 up

/sbin/route add-host $VIP dev eth0:1

#Clear IPVS Table

/sbin/ipvsadm -C

#Set Lvs



/sbin/ipvsadm -A -t$VIP:80 -s rr

/sbin/ipvsadm -a -t$VIP:80 -r $RIP1:80 -g

/sbin/ipvsadm -a -t$VIP:80 -r $RIP2:80 -g

#Run Lvs

/sbin/ipvsadm

;;

stop)

echo "closeLVS Directorserver"

/sbin/ipvsadm -C

;;

*)
echo "Usage:$0 {start|stop}"

exit 1

esac

下例是其他類似的lvsdr配置文件

more /etc/init.d/lvsDR
#!/bin/sh
# description: start LVS   of  Directorserver
VIP=192.168.1.198
RIP1=192.168.1.191
RIP2=192.168.1.192

. /etc/rc.d/init.d/functions

case "$1" in
    start)
        echo " start LVS  ofDirectorServer"
       # set the Virtual  IP Address
       /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask255.255.255.255 up
       /sbin/route add -host $VIP dev eth0:0
       #Clear IPVS table
       /sbin/ipvsadm -C
      #set LVS
      /sbin/ipvsadm -A -t $VIP:80 -s rr  (如果需要session保持添加-p 默認保持300秒)
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
      #/sbin/ipvsadm -a -t $VIP:80 -r $RIP3:80 -g
      #Run LVS
      /sbin/ipvsadm
      #end

        ;;
    stop)
        echo "close LVS Directorserver"
        /sbin/ipvsadm -C
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
esac

隧道模式
(tun )
more /etc/init.d/tunlvs
#!/bin/sh
# description: start LVS   of  Directorserver
VIP=192.168.1.198
RIP1=192.168.1.191
RIP2=192.168.1.192

. /etc/rc.d/init.d/functions

case "$1" in
    start)
        echo " start LVS  ofDirectorServer"
       # set the Virtual  IP Address
       /sbin/ifconfig tunl0 $VIP broadcast $VIP netmask255.255.255.255 up
       /sbin/route add -host $VIP dev tunl0
       #Clear IPVS table
       /sbin/ipvsadm -C
      #set LVS
      /sbin/ipvsadm -A -t $VIP:80 -s rr
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -i
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -i
      #/sbin/ipvsadm -a -t $VIP:80 -r $RIP3:80 -i
      #Run LVS
      /sbin/ipvsadm
      #end

        ;;
    stop)
        echo "close LVS Directorserver"
        ifconfig tunl0 down
        /sbin/ipvsadm -C
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
esac


(-s rr 是使用了輪叫演算法,可以自行選擇相應的演算法,更改rr就可以了,ipvsadm -h查看幫助。-g 是使用lvs工作DR直接路由模式,也可自行修改)
如果有多個realserver直接添加就可以了,之後啟動此腳本就可以了。
NAT用法本來是因為網路IP地址不足而把內部保留IP地址通過映射轉換成公網地址的一種上網方式(原地址NAT)。如果把NAT的過程稍微變化,就可以成為負載均衡的一種方式。原理其實就是把從客戶端發來的IP包的IP頭目的地址在DR上換成其中一台REAL SERVER的IP地址併發至此REALSERVER,而REAL SERVER則在處理完成後把數據經過DR主機發回給客戶端,DR在這個時候再把數據包的原IP地址改為DR介面上的IP地址即可。期間,無論是進來的流量,還是出去的流量,都必須經過DR。
隧道模式則類似於VPN的方式,使用網路分層的原理,在從客戶端發來的數據包的基礎上,封裝一個新的IP頭標記(不完整的IP頭,只有目的IP部)發給REAL SERVER,REAL SERVER收到后,先把DR發過來的數據包的頭給解開,還原其數據包原樣,處理后,直接返回給客戶端,而不需要再經過DR。
直接路由模式比較特別,很難說和什麼方面相似,前2種模式基本上都是工作在網路層上(三層),而直接路由模式則應該是工作在數據鏈路層上(二層)。其原理為,DR和REAL SERVER都使用同一個IP對外服務。但只有DR對ARP請求進行響應,所有REALSERVER對本身這個IP的ARP請求保持靜默。也就是說,網關會把對這個服務IP的請求全部定向給DR,而DR收到數據包后根據調度演算法,找出對應的REAL SERVER,把目的MAC地址改為REAL SERVER的MAC併發給這台REALSERVER。這時REAL SERVER收到這個數據包,則等於直接從客戶端收到這個數據包無異,處理后直接返回給客戶端。由於DR要對二層包頭進行改換,所以DR和REALSERVER之間必須在一個廣播域,也可以簡單的理解為在同一台交換機上。




[ 本帖最後由 gunguymadman 於 2008-7-31 10:00 編輯 ]
《解決方案》

3、配置realserver腳本

#!/bin/bash
#description : start realserver
VIP=192.168.1.198
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
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
#end
此腳本使realserver不響應arp請求,將此腳本分別在realserver上執行就可以了。Ok后寫入rc.local

測試:分別啟動realserver上的httpd服務
在realserver1 執行  echo "191"  /var/www/html/index.html
在realserver2 執行  echo "192"  /var/www/html/index.html

打開瀏覽器輸入http://192.168.1.198  應該可以分別看到:191 和 192.

以上是最簡單的lvs 。  一個dr ,2個real 。 2個配置文件,幾個rpm包。
我們需要的是高可用,主備dr,master down后 bak自動接管, master啟動后bak交出管理權。
現在我們開始配置這樣的lvs。

二)集群配置基於高可用Lvs+heartbeat

主伺服器配置: 
1- 修改/etc/hosts文件
192.168.1.196           ct1
192.168.1.197           ct2
192.168.1.191                    xxx
192.168.1.192                    xxxx
1-        修改haresources文件
ct1 IPaddr::192.168.1.198 lvsdr-basic ldirectord   
a. 定義主伺服器和主伺服器eth0虛擬ip,
b. 定義heartbeat啟動監控的服務 ,ldirectord  , lvsdr-basic
3- 修改authkeys文件  修改許可權 chmod 600 authkeys
   auth 1
   1 crc
4- 修改ha.cf
           debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility     local0
deadtime 20
initdead 20
#bcast   eth1                                                在eth1上發送心跳廣播
ucast eth1 192.168.2.20
auto_failback on
node    ct1
node    ct2
ping_group group1 192.168.1.196 192.168.1.197
respawn root /usr/lib/heartbeat/ipfail     
apiauth ipfail gid=root uid=root



authkeys
這個配置文件非常簡單,就是在auth選擇一個值。每個值對應一種演算法,這個演算法是在主節點和從節點間數據校驗用的。這個配置文件許可權必須是0600。

chmod 0600 authkeys
配置文件的值如下:
auth 3
1 crc
#2 sha1 HI!
#3 md5 Hello!
haresources
這個文件配置的是節點要管理的資源也就你的高可用服務,這些資源在主節點down調時候,從節點就會開啟這些資源。Heartbeat認為
你配置資源名稱 start/stop
就可以開啟/停止這些資源。所以讓你的資源支持start/stop。其實這你只需要對你的應用服務作個腳本,腳本接受start參數就會啟動應用服務,接受stop參數就會停止服務。個人建議,你什麼都不要做,就把應用程序名當作資源名就可以了,啟動資源名的時候就自動啟動你的服務了。而在down機的時候,所有的程序都死了,根本就不需要heartbeat調用
你配置資源名稱stop
命令來結束程序。
在文件中找到:
#node1  10.0.0.170 Filesystem::/dev/sda1::/data1::ext2
這一項,去掉#號,根據格式配置你的資源。第一欄位(Node1):主節點名稱(必須uname –n的保持一致);第二欄位(10.0.0.170):對外虛擬服務IP;第三欄位(Filesystem::/dev/sda1::/data1::ext2):Filesystem表示資源名稱,/dev/sda1表示資源啟動時的第一個參數,/data1表示第二個參數,/ext2表示第三個參數,依此類推。

ha.cf
這個配置文件比較複雜。我只配了關鍵的幾項:
debugfile /var/log/ha-debug
說明:調試日誌文件文件,取默認值
logfile /var/log/ha-log
說明:系統運行日誌文件,取默認值
logfacility local0
說明:日誌等級,取默認值
keepalive 1
說明:心跳頻率,自己設定。1:表示1秒;200ms:表示200毫秒
deadtime 10
說明:節點死亡時間閥值,就是從節點在過了10后還沒有收到心跳就認為主節點死亡,自己設定
warntime 5
說明:發出警告時間,自己設定
udpport 28855
說明:心跳信息傳遞的udp埠,自己設定
#bcast   eth0        # Linux
說明:採用udp廣播播來通知心跳,建議在副節點不只一台時使用
ucast eth0 xxx
說明:採用網卡eth0的udp單播來通知心跳,eth0的IP
#mcast eth0 225.0.0.1 694 1 0
說明:採用udp多播播來通知心跳,建議在副節點不只一台時使用
auto_failback off
說明:主節點重啟成功后,資源是自動拿回到主節點還是等到副節點down調后拿回資源
node heartbeat1
說明:主節點名稱,與uname –n保持一致。排在第一的默認為主節點,所以不要搞措順序
node heartbeat2
說明:副節點名稱,與uname –n保持一致
watchdog /dev/watchdog
說明:看門狗。如果本節點在超過一分鐘后還沒有發出心跳,那麼本節點自動重啟

以上這些是我個人認為必配項,下面這些是可選項。
stonith baytech /etc/ha.d/conf/stonith.baytech
說明:主/副等所有節點的一種校驗。
respawn userid /path/name/to/run
說明:和heartbeat必須一起啟動的本地服務
ping 10.10.10.254
說明:偽節點IP,偽節點就是其失效時主/副節點不會正常工作但本身不是主/副節點之一。
respawn hacluster /usr/lib/heartbeat/ipfail
說明:與ping選項一起使用,取默認值。
baud   19200
說明:串口波特率,與serial一起使用。
serial /dev/ttyS0  # Linux
說明:採用串口來傳遞心跳信息。


ldirectord.cf
  checktimeout=3
checkinterval=1
autoreload=no
logfile="/var/log/ldirectord.log"
quiescent=no
virtual=192.168.1.198:80
        real=192.168.1.191:80 gate
        real=192.168.1.192:80 gate
        service=http                        // 服務名稱http
        request="test.html"    //  lvs伺服器測試代碼
        receive="Test"        //
        scheduler=sh                        // 按照source hash 調度
        protocol=tcp               
在192,191機器apache htdocs里建立test.html文件 輸入Test 確保web頁面可訪問

checktimeout=3  (一個真實的伺服器被認為出錯所需的時間間隔)
checkinterval=1 (發出檢查的時間間隔)
#autoreload=no (自動重載,默認值是no,選yes時配置文件發生變化后就會自動載入)
#callback=配置文件的路徑(用來重載配置文件)
fallback=127.0.0.1:80 (當所有的真實伺服器出錯時,web服務重定向的地址)
#logfile="/var/log/ldirectord.log" (日誌文件的目錄)
#logfile="local0"
#execute=」configuration」(為這個配置文件啟動ldirectord的實例)
quiescent=yes(當選擇yes時,一台真實伺服器down以後,並不是把它從lvs的表中刪除,而是把它的權值設為0,新的鏈接將不可達)
virtual=192.168.1.198:80  (虛擬的ip和埠號)
real=192.168.1.191:80 gate   ( 真實的伺服器)  
real=192.168.1.192:80 gate
fallback=127.0.0.1:80 gate
checktype=negotiate(檢測類型,默認為negotiate)
service=http
checkport:80 (檢查的埠號)
request="test.html" (負載平衡機將查詢實際server的服務目錄下面是不是    有該文件,如果有說明server還是在服務的,沒有將認為它已經出錯)
receive="Test "
scheduler=rr  (調度演算法)
#persistent=600
#netmask=255.255.255.255
protocol=tcp   (協議)
3.        啟動
輸入 ldirectord start 啟動服務,ldirectord stop停止服務,ldirectord rload 重新載入配置信息。

同樣  bak伺服器也配置如上。  
另外,bak服務 cd /etc/ha.d
               ln –s tmp/harc .
/etc/rc.d/rc.local 中寫入 /etc/init.d/heartbeat start
主伺服器rc.local 中寫入 /etc/init.d/lvsdr-basic start
                      /etc/init.d/heartbeat start
內網伺服器可關閉iptables
公網伺服器最好是heartbeat通訊口專用  iptables相對應的網口過濾

Ok 到此為止 高可用配完
《解決方案》

下面做雙機cluster
三)雙機lvs-ha
       
主伺服器+真實的web伺服器 :192.168.2.28
備伺服器+ 真實的web伺服器:192.168.2.20
Lvs director 配置在主伺服器上,根據源地址分配伺服器。
集群的虛擬ip為60.*.165,初始分配在主伺服器的eth0, 主伺服器宕機后,ip由備份伺服器接管,分配在備份伺服器的eth0.
   




二、集群軟體安裝
主伺服器安裝:
yum -y install ipvsadm    # ipvs管理器   
yum -y install libnet      # 庫文件
yum -y install e2fsprogs  # 庫文件
yum -y install heartbeat   # linux-ha
yum –y install heartbeat-ldirectord  # connector of linux-ha and lvs   【備份伺服器不用安裝】

2- 拷貝配置文件
cp /usr/share/doc/heartbeat-2.1.*/ha.cf /etc/ha.d/
cp /usr/share/doc/heartbeat-2.1.*/authkeys /etc/ha.d/
cp /usr/share/doc/heartbeat-2.1.*/haresources /etc/ha.d/
cp /usr/share/doc/heartbeat-ldirectord-2.1.*/ldirectord.cf /etc/ha.d/【備份伺服器不用】

三、集群配置
主伺服器配置: 
1- 修改/etc/hosts文件
192.168.2.28           name1
192.168.2.20           name2

2-        修改haresources文件
liuyuxi IPaddr::60.*.165 lvsdr-basic ldirectord   
3- 修改authkeys文件  修改許可權 chmod 600 authkeys
   auth 1
   1 crc
4- 修改ha.cf
           debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility     local0
deadtime 20
initdead 20
ucast 192.168.2.20
auto_failback on
node    name1
node    name2
ping_group group1 192.168.2.28 192.168.2.20
respawn root /usr/lib/heartbeat/ipfail     
apiauth ipfail gid=root uid=root





5- ldirectord.cf
  checktimeout=3
checkinterval=1
autoreload=no
logfile="/var/log/ldirectord.log"
quiescent=no
virtual=60.*.165:80
        real=60.*.171:80 gate
        real=60.*.164:80 gate
        service=http                       
        request="test.html"   
        receive="Test"        
        scheduler=sh                       
        protocol=tcp               



       
6- lvsdr-basic
/etc/init.d/lvsdr-basic
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

VIP=60.*.165
RIP1=60.*.171
RIP2=60.*.164
###########################
# ifconfig a
#
#/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
#
############################

/sbin/route add -host $VIP dev eth0:0
echo "1" > /proc/sys/net/ipv4/ip_forward




備份伺服器配置:     
1- 修改/etc/hosts文件  同主伺服器
2-        修改haresources文件
liuyuxi switchdr IPaddr::60.*.165
虛擬ip地址是 60.*.165
備份伺服器在接管主伺服器前,執行switchdr start
備份伺服器在移交主伺服器前,執行switchdr stop
switchdr 見備份伺服器配置第5條.

3- 修改authkeys文件  同伺服器
4- 修改ha.cf 同主伺服器   注意ucast
5- switchdr 腳本
/etc/init.d/switchdr
#!/bin/sh
# description: close lo0 and arp_ignore
VIP=60.*.165

./etc/rc.d/init.d/functions

case "$1" in
    start)
        echo "************* start director server and close tunl ***********"
        ifconfig lo:0 down
        echo 0>/proc/sys/net/ipv4/conf/all/arp_announce   //允許arp解析虛ip
        ;;
    stop)
        echo "start Real Server"
//          ---------------------------------------------------禁止arp 解析虛ip
        ifconfig eth0:0 down
        ifconfig lo:0  $VIP netmask 255.255.255.255 broadcast $VIP up
        /sbin/route add -host $VIP dev lo:0

        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
        ;;
    *)
        echo "Usage: switchdr {start|stop}"
        exit 1
esac


主伺服器上:
/usr/local/apache/bin/apachectl start
/etc/init.d/heartbeat start
備伺服器上:
/etc/init.d/httpd start
/etc/init.d/switchdr stop
/etc/init.d/heartbeat start


到此ok,如果有問題就是配置問題,好好檢查你的log,所有的信息都在log上顯示的。Ipvsadm可顯示lvs連接,ipvsadm –l –c 命令查看當前響應。

最後感謝劉俊,ghbspecial 等同志 ,我是參照他們的文檔作出的,
有問題請聯繫我  xu_pj#hotmail.com (#替代@)
《解決方案》

好貼,暫時就要第一個功能。
收藏了!!!
《解決方案》

提個建議啊:樓主可不可以給個按照使用集群管理軟體來配置集群的說明文檔;對於我等新手來說,圖形的東西遠比文字的東西要來的直觀。
先說聲謝謝了!
《解決方案》

原帖由 新手前來報到 於 2008-7-2 22:34 發表 http://linux.chinaunix.net/bbs/images/common/back.gif
提個建議啊:樓主可不可以給個按照使用集群管理軟體來配置集群的說明文檔;對於我等新手來說,圖形的東西遠比文字的東西要來的直觀。
先說聲謝謝了!
ls的   這是我 自認為非常簡單 明了的文檔了   

如果你深入些   你就會發現的  

圖形在1樓已給出
《解決方案》

很不錯的文檔
記錄下
《解決方案》

正學習,先收下了,謝謝樓主
《解決方案》

感謝lz的好文。有些不明白的地方,望lz賜教:
1。文章最後
   
下面做雙機cluster
三)雙機lvs-ha
        
主伺服器+真實的web伺服器 :192.168.2.28
備伺服器+ 真實的web伺服器:192.168.2.20
Lvs director 配置在主伺服器上,根據源地址分配伺服器。
集群的虛擬ip為60.*.165,初始分配在主伺服器的eth0, 主伺服器宕機后,ip由備份伺服器接管,分配在備份伺服器的eth0.
................................ ............................................... ..................................................................................  
這一步和之前「 二)集群配置基於高可用Lvs+heartbeat 」這一步有何區別?是否前者為realserver節點備份,而後者為lvsdr的熱備?
但從lz拓撲圖來看似乎不是這樣的。

2。看過一些資料說ldirectord只是用於後台realserver的監控?而在兩台lvs(即主lvs,從lvs)做ha,還是利用ldirectord嗎?
如果不是,那該用什麼軟體?

恕我愚鈍。望lz能解答。
《解決方案》

原帖由 long904 於 2008-7-7 17:34 發表 http://linux.chinaunix.net/bbs/images/common/back.gif
感謝lz的好文。有些不明白的地方,望lz賜教:
1。文章最後
   
下面做雙機cluster
三)雙機lvs-ha
        
主伺服器+真實的web伺服器 :192.168.2.28
備伺服器+ 真實的web伺服器:192.168.2.20
Lvs d ...
ls 過獎了    大家共同研究  
三 和 二 沒有任何關係   僅僅是雙機做lvs   
雙機一個是master 另一個是備份   而real分發就是他倆本身        
第一張圖片 僅是供給 二用的   

ld還是用來監控的   事實上 無論是master 還是back  還是realn(n=1,2,3.。。) 都可監控
只要把realserver的腳本在heartbeat之前執行 再修改ld 配置文件即可



[火星人 via ] 2008夏 較全的lvs+ha 個人文檔(2機,3機,4機以上)已經有114次圍觀

http://www.coctec.com/docs/service/show-post-5281.html