在rhel5中自帶了集羣軟件,我個人認爲不好用,還不如直接編輯配置文件效率高,快!下面是我在rhel5中使用LVS和heartbeat組合來實現集羣和負載均衡。
簡要說明:服務器四臺,server3和server4上兩塊網卡,分別爲:
服務器名稱 IP(eth0) IP(eth1)
server3.rhel5.net 192.168.1.30 10.0.0.2
server4.rhel5.net 192.168.1.40 10.0.0.1
server5.rhel5.net 192.168.1.50
server7.rhel5.net 192.168.1.71
虛擬ip爲192.168.1.70,server3和server4主要提供集羣和負載均衡服務,server3爲主,server4爲從,server5和server7提供httpd服務。心跳使用的eth1網卡。
heartbeat軟件包下載地址,可以在網上找,一大堆,至於ipvsadm軟件包,rhel5光盤中有,自行安裝。
所需軟件包:heartbeat、libnet、net-snmp、net-snmp-libs、perl-Compress-Zlib、perl-HTML-Parser、perl-HTML-Tagset、perl-libwww-perl、perl-MailTools、perl-TimeDate、perl-URI、ipvsadm.以上軟件包,有的在rhel5光盤中,有的要在網上搜索的。至於heartbeat、libnet軟件包可以到如下網址下載:
http://www.packetfactory.net/libnet/dist/libnet.tar.gz
建議先安裝以上除heartbeat、libnet之外的其他軟件包,然後安裝heartbeat、libnet.
建議先安裝以上除heartbeat、libnet之外的其他軟件包,然後安裝heartbeat、libnet.
下來直接從安裝heartbeat、libnet開始:
在server3上首先安裝libnet,否則在安裝heartbeat軟件時會報錯的。
[root@server3 ~]#tar -xvzf libnet.tar.gz
[root@server3 ~]#cd libnet
[root@server3 ~]#./configure
[root@server3 ~]#make;make install
[root@server3 ~]# tar -xvzf heartbeat-2.1.3.tar.gz
[root@server3 ~]# cd heartbeat-2.1.3
[root@server3 ~]# ./ConfigureMe
[root@server3 ~]# make;make install
安裝這兩個軟件包過程比較慢,請耐心等待;安裝完了後,在/etc/ha.d目錄下默認沒有ldirectord.cf文件,我們複製heartbeat-2.1.3/ldirectord/ldirectord.cf文件到/etc/ha.d目錄下。
下來編輯ldirectord.cf、authkeys、ha.cf、haresources四個文件。
我的配置如下所示:
ldirectord.cf文件:
checktimeout=3 #檢測超時3s
checkinterval=1 #檢查時間間隔1s
autoreload=yes #配置文件改變時自動加載配置文件
logfile="/var/log/ldirectord.log" #定義日誌文件
quiescent=yes
virtual=192.168.1.70:80 #虛擬IP
real=192.168.1.50:80 gate #realserver server5
real=192.168.1.71:80 gate #realserver server7
fallback=127.0.0.1:80 #所有服務器發生故障時訪問該服務器
service=http #服務名稱
scheduler=rr #我這裏使用的直連路由調度算法
protocol=tcp
checktype=negotiate
checkinterval=1 #檢查時間間隔1s
autoreload=yes #配置文件改變時自動加載配置文件
logfile="/var/log/ldirectord.log" #定義日誌文件
quiescent=yes
virtual=192.168.1.70:80 #虛擬IP
real=192.168.1.50:80 gate #realserver server5
real=192.168.1.71:80 gate #realserver server7
fallback=127.0.0.1:80 #所有服務器發生故障時訪問該服務器
service=http #服務名稱
scheduler=rr #我這裏使用的直連路由調度算法
protocol=tcp
checktype=negotiate
ha.cf文件:
debugfile /var/log/ha-debug #定義日誌文件,其實這個文件的內容與ldirectord.cf文件中定義的/var/log/ldirectord.log文件內容相同。
logfile /var/log/ha-log #同上
logfacility local0 #默認
keepalive 2 #設定heartbeat之間的時間間隔爲2秒.
deadtime 30 #在30秒後宣佈節點死亡。
warntime 10 #在日誌中發出“late heartbeat“警告之前等待的時間,單位爲秒。
initdead 120 #在某些配置下,重啓後網絡需要一些時間才能正常工作。這個單獨的”deadtime”選項可以處理這種情況。它的取值至少應該爲通常deadtime的兩倍。
udpport 694 # 使用端口694進行bcast和ucast通信。這是默認的,並且在IANA官方註冊的端口號。
bcast eth1 # Linux 表示在eth1接口上使用廣播heartbeat(將eth1替換爲eth0,eth2),或者您使用的任何接口。
mcast eth0 225.0.0.1 694 1 0 #默認即可
ucast eth0 192.168.1.30 #改爲你eth0的地址。
auto_failback on #該選項是必須配置的。值爲on or off
node server3.rhel5.net #負載均衡服務器名,必須與uname -n的輸出一致。
node server4.rhel5.net #同上
ping 10.0.0.1
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
logfile /var/log/ha-log #同上
logfacility local0 #默認
keepalive 2 #設定heartbeat之間的時間間隔爲2秒.
deadtime 30 #在30秒後宣佈節點死亡。
warntime 10 #在日誌中發出“late heartbeat“警告之前等待的時間,單位爲秒。
initdead 120 #在某些配置下,重啓後網絡需要一些時間才能正常工作。這個單獨的”deadtime”選項可以處理這種情況。它的取值至少應該爲通常deadtime的兩倍。
udpport 694 # 使用端口694進行bcast和ucast通信。這是默認的,並且在IANA官方註冊的端口號。
bcast eth1 # Linux 表示在eth1接口上使用廣播heartbeat(將eth1替換爲eth0,eth2),或者您使用的任何接口。
mcast eth0 225.0.0.1 694 1 0 #默認即可
ucast eth0 192.168.1.30 #改爲你eth0的地址。
auto_failback on #該選項是必須配置的。值爲on or off
node server3.rhel5.net #負載均衡服務器名,必須與uname -n的輸出一致。
node server4.rhel5.net #同上
ping 10.0.0.1
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster
haresources文件:
server3.rhel5.net ldirectord::ldirectord.cf LVSSyncDaemonSwap::master IPaddr::192.168.1.70/24/eth0/192.168.1.255
authkeys文件,這裏我使用的是md5方式,注意,該文件的權限必須是600:
auth 3
3 md5 test
3 md5 test
然後編輯/etc/sysctl.conf文件,加入以下行:
net.ipv4.ip_forward = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_announce = 2
再執行sysctl -p命令,使其立即生效!
以上是server3上的配置,下來進入server4上,重複以上安裝配置,切記,server4上的/etc/ha.d/目錄下的authkeys、haresources、ha.cf、ldirectord.cf四個文件必須和server3上的相同。完成後先啓動server3上的heartbeat服務,查看日誌,是否有報錯,然後在啓動server4上的heartbeat服務,檢查日誌文件,是否有報錯.
server3上:
[root@server3 ~]ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:8E:52:05
inet addr:192.168.1.30 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe8e:5205/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:113693 errors:0 dropped:0 overruns:0 frame:0
TX packets:137301 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12951968 (12.3 MiB) TX bytes:11335533 (10.8 MiB)
Interrupt:169 Base address:0x2000
inet addr:192.168.1.30 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe8e:5205/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:113693 errors:0 dropped:0 overruns:0 frame:0
TX packets:137301 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12951968 (12.3 MiB) TX bytes:11335533 (10.8 MiB)
Interrupt:169 Base address:0x2000
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:8E:52:05
inet addr:192.168.1.70 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:169 Base address:0x2000
inet addr:192.168.1.70 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:169 Base address:0x2000
eth1 Link encap:Ethernet HWaddr 00:0C:29:8E:52:0F
inet addr:10.0.0.2 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: fe80::20c:29ff:fe8e:520f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3680 errors:0 dropped:0 overruns:0 frame:0
TX packets:3853 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:720033 (703.1 KiB) TX bytes:748019 (730.4 KiB)
Interrupt:193 Base address:0x2080
inet addr:10.0.0.2 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: fe80::20c:29ff:fe8e:520f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3680 errors:0 dropped:0 overruns:0 frame:0
TX packets:3853 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:720033 (703.1 KiB) TX bytes:748019 (730.4 KiB)
Interrupt:193 Base address:0x2080
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:3982 errors:0 dropped:0 overruns:0 frame:0
TX packets:3982 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1010816 (987.1 KiB) TX bytes:1010816 (987.1 KiB)
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:3982 errors:0 dropped:0 overruns:0 frame:0
TX packets:3982 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1010816 (987.1 KiB) TX bytes:1010816 (987.1 KiB)
server4上:
[root@server4 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:FF:1A:AB
inet addr:192.168.1.40 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:feff:1aab/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2983 errors:0 dropped:0 overruns:0 frame:0
TX packets:4766 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:617725 (603.2 KiB) TX bytes:1118790 (1.0 MiB)
Interrupt:169 Base address:0x2000
eth0 Link encap:Ethernet HWaddr 00:0C:29:FF:1A:AB
inet addr:192.168.1.40 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:feff:1aab/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2983 errors:0 dropped:0 overruns:0 frame:0
TX packets:4766 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:617725 (603.2 KiB) TX bytes:1118790 (1.0 MiB)
Interrupt:169 Base address:0x2000
eth1 Link encap:Ethernet HWaddr 00:0C:29:FF:1A:B5
inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: fe80::20c:29ff:feff:1ab5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4135 errors:0 dropped:0 overruns:0 frame:0
TX packets:4070 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:813997 (794.9 KiB) TX bytes:790753 (772.2 KiB)
Interrupt:193 Base address:0x2080
inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0
inet6 addr: fe80::20c:29ff:feff:1ab5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4135 errors:0 dropped:0 overruns:0 frame:0
TX packets:4070 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:813997 (794.9 KiB) TX bytes:790753 (772.2 KiB)
Interrupt:193 Base address:0x2080
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:3374 errors:0 dropped:0 overruns:0 frame:0
TX packets:3374 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:431408 (421.2 KiB) TX bytes:431408 (421.2 KiB)
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:3374 errors:0 dropped:0 overruns:0 frame:0
TX packets:3374 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:431408 (421.2 KiB) TX bytes:431408 (421.2 KiB)
server3上多了個eth0:0接口,若你的沒有出現,請等待一會,再使用ifconfig查看,若還是沒有eth0:0接口出現,請檢查配置文件是否正確!若停止server3上的heartbeat服務,則server4會接管,併產生一個eth0:0接口!
[root@server3 ~]# /etc/ha.d/resource.d/LVSSyncDaemonSwap master status
master running
(ipvs_syncmaster pid: 9132)
[root@server3 ~]# /etc/ha.d/resource.d/LVSSyncDaemonSwap backup status
backup stopped
(ipvs_syncmaster pid: 9132)
master running
(ipvs_syncmaster pid: 9132)
[root@server3 ~]# /etc/ha.d/resource.d/LVSSyncDaemonSwap backup status
backup stopped
(ipvs_syncmaster pid: 9132)
server4上:
[root@server4 ~]# /etc/ha.d/resource.d/LVSSyncDaemonSwap master status
master stopped
(ipvs_syncbackup pid: 5830)
master stopped
(ipvs_syncbackup pid: 5830)
[root@server4 ~]# /etc/ha.d/resource.d/LVSSyncDaemonSwap backup status
backup running
(ipvs_syncbackup pid: 5830)
backup running
(ipvs_syncbackup pid: 5830)
現在停止server3上的heartbeat服務,看server4是否可以正常接管,可以查看日誌文件。若沒有報錯,則說明heartbeat服務沒有問題,若存在問題請根據日誌文件進行排錯!
然後啓動server3和server4上的ipvsadm服務,使用ipvsadm命令查看:
[root@server3 ha.d]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.70:80 rr
-> 192.168.1.50:80 Route 1 0 0
-> 192.168.1.71:80 Route 1 0 0
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.70:80 rr
-> 192.168.1.50:80 Route 1 0 0
-> 192.168.1.71:80 Route 1 0 0
server4上的輸出應該和server3上的一致。ok,以上是heartbeat與LVS配置。下面是realserver上的配置:
server5和server7上的配置:
[root@server5 ~]# echo "This is server5">/var/www/html/index.html
[root@server5 ~]# vi /etc/sysctl.conf加入以下行:
net.ipv4.ip_forward = 1
然後編寫如下腳本,我這裏命名爲lvs.sh
#!/bin/sh
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
ifconfig lo:0 192.168.1.70 broadcast 192.168.1.70 netmask 255.255.255.255 up
route add -host 192.168.1.70 dev lo:0
sysctl -p
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
ifconfig lo:0 192.168.1.70 broadcast 192.168.1.70 netmask 255.255.255.255 up
route add -host 192.168.1.70 dev lo:0
sysctl -p
然後在/etc/rc.local文件中把lvs.sh文件的絕對路徑,讓其在開機是運行。
[root@server7 ~]# echo "This is server7">/var/www/html/index.html
然後把httpd設置爲在開機時就啓動,chkconfig httpd on.在server7上切記不要忘記那個lvs腳本!重啓server5和server7,啓動後,檢查一下是否多了個網絡接口lo:0.我的如下:
lo:0 Link encap:Local Loopback
inet addr:192.168.1.70 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
inet addr:192.168.1.70 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
再查看一下,你的httpd服務是否啓動。
在其他機器上的IE裏輸入http://192.168.1.70,看是否可以訪問,我的成功顯示This is server5,然後刷新一下,顯示server7。
在server3上使用ipvsadm -Lnc查看那些客戶端通過192.168.70訪問realserver上的httpd服務:
[root@server3 ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:52 FIN_WAIT 192.168.1.156:4204 192.168.1.70:80 192.168.1.71:80
TCP 01:53 FIN_WAIT 192.168.1.156:4207 192.168.1.70:80 192.168.1.71:80
TCP 01:51 FIN_WAIT 192.168.1.156:4203 192.168.1.70:80 192.168.1.50:80
TCP 01:53 FIN_WAIT 192.168.1.156:4208 192.168.1.70:80 192.168.1.50:80
TCP 01:50 FIN_WAIT 192.168.1.156:4202 192.168.1.70:80 192.168.1.71:80
TCP 01:53 FIN_WAIT 192.168.1.156:4205 192.168.1.70:80 192.168.1.50:80
IPVS connection entries
pro expire state source virtual destination
TCP 01:52 FIN_WAIT 192.168.1.156:4204 192.168.1.70:80 192.168.1.71:80
TCP 01:53 FIN_WAIT 192.168.1.156:4207 192.168.1.70:80 192.168.1.71:80
TCP 01:51 FIN_WAIT 192.168.1.156:4203 192.168.1.70:80 192.168.1.50:80
TCP 01:53 FIN_WAIT 192.168.1.156:4208 192.168.1.70:80 192.168.1.50:80
TCP 01:50 FIN_WAIT 192.168.1.156:4202 192.168.1.70:80 192.168.1.71:80
TCP 01:53 FIN_WAIT 192.168.1.156:4205 192.168.1.70:80 192.168.1.50:80
ok,以上說明192.168.1.156通過192.168.1.70訪問192.168.1.50和192.168.1.71的httpd服務!
Good luck for you!