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 配置文件即可