Director對於LVS來說,是重中之重,所有對服務的請求都要經過它 向他身後提供服務的集羣進行轉發,但它也是LVS高負載均衡集羣的不穩定因素,如果Director主機宕機,後方的服務集羣也就不能夠提供服務了,這是堅決不允許出現的情況,因此我們可以通過爲Director提供高可用集羣服務來保證當一個Director宕機之後,還有其它的Director可以替代提供服務,知道宕機的Director重新恢復。
我們使用高可用集羣解決方案之一 ——Heartbeat來實現這個目的
我們先來考慮一個問題,當Director的主節點宕機之後,必須要將資源轉移到備節點上,否則備節點也只是擺設,並不能替代宕機的主節點來完成Director的工作。關鍵就在這個資源轉移的方法上。
Heartbeat爲LVS中的Director實現高可用集羣量身定做了套解決方案,我們只需要在Heartbeat的幾個配置文件中進行簡單的配置,我們所需要的目的都統統能夠實現,不僅如此,它自身還具備了幫我們檢測後方服務集羣中主機服務狀態的功能,簡直讓我們喜出望外,下面我們就通過一個簡單的實驗來闡明這個觀點。
實驗拓撲如圖:
我們要實現的LVS的類型爲DR,即直接路由
route爲連接外網的路由器,switch爲內網中的交換機,RS1、RS2爲提供web服務的集羣,直接和交換機相連,ND1、ND2爲LVS中的兩個Director節點,我們要對這連個Director節點實現高可用集羣服務,兩個Director和交換機直接相連之外,兩個節點之間還需要直接連接進行心跳等基本信息的傳遞。
每個有標記的塊狀物爲網卡,上面是編號,在連個ND節點之間有一個被稱爲資源一部分的VIP在哪個節點上是不固定的,外網的用戶也是通過這個VIP來訪問我們的web服務的。
開始配置: 設定VIP爲192.168.0.85/24
一、我們先來RS1和RS2讓其稱爲一個web服務的集羣
1、對RS1的配置
(1)、對realserver配置內核參數:
先來解釋一下修改內核參數的原因,因爲在DR模型中RS1、RS2在lo:0上都配置了VIP的地址,是爲了在數據包響應用戶的時候源地址爲用戶訪問的VIP地址,但是在數據包進入路由器之後,在我們的內網中有多個VIP地址,路由器將不能將其轉發到應該得到數據包的ND上,爲了避免這種情況出現,我們就修改內核參數來讓RS上的VIP網卡不對路由器的產生響應即可。
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
(2)、爲RS1配置虛擬的VIP地址(是爲了實現在數據包返回用戶的時候源地址爲用戶訪問的地址)
ifconfig lo:0 192.168.0.85 broadcast 192.168.0.85 netmask 255.255.255.255 up
爲RS1的eth0網卡添加地址
ifconfig eth0 192.168.0.206/24
(3)、給realserver主機添加路由信息
route add -host 192.168.0.85 dev lo:0 設定相應的數據包的源地址都爲這個地址
(4)、爲RS1安裝web服務
yum install php php-mbstring mysql mysql-server httpd php-mysql
(5)、爲實現結果爲web指定一個有其代號的網頁,並寫一個有ok的測試網頁
echo RS1 > /var/www/html/index.html
echo ok > /var/www/html/.ok.html
(6)、測試httpd服務能否正常運行,測試結果如下:
2、對RS2進行配置
(1)、RS2的eth0端口配置
ifconfig eth0 192.168.0.207/24
(2)、寫入網頁
echo RS2 > /var/www/html/index.html
其他配置和RS1完全一樣,不再演示:
對RS2的web服務進行驗證,結果如下:
二、對兩個Director節點進行配置:
配置兩個Director節點,ND1爲node1,ND2爲node2
1、給node1配置地址
ifconfig eth0 192.168.0.202/24
ifconfig eth1 1.1.1.1
給noid2配置地址
ifconfig eth0 192.168.0.204/24
ifconfig eth1 1.1.1.2
2、配置本地主機名稱解析
在node1上
vim /etc/hosts 添加如下內容
192.168.0.202 node1.a.org
192.168.0.204 node2.a.org
對node1、node2的主機名進行相應的修改
在node1上
hostname node1.a.org
在node2上
hostname node2.a.org
3、只有我們要多次在連個節點間拷貝文件,爲了省去繁瑣的密碼輸入,我們在兩個節點上進行如下配置
在node1上
ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub [email protected]
在node2上
ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub [email protected]
從此我們在兩個節點上拷貝文件就不需要輸入密碼了
4、開始安裝集羣服務
(1)、下載安裝包
heartbeat-ldirectord-2.1.4-9.el5.i386.rpm
perl-MailTools-1.77-1.el5.noarch.rpm
heartbeat-2.1.4-9.el5.i386.rpm
heartbeat-pils-2.1.4-10.el5.i386.rpm
heartbeat-devel-2.1.4-9.el5.i386.rpm
heartbeat-stonith-2.1.4-10.el5.i386.rpm
heartbeat-gui-2.1.4-9.el5.i386.rpm
libnet-1.1.4-3.el5.i386.rpm
創建一個目錄將所用的安裝包都放在這個目錄內
mkdir node
將軟件包移動進目錄的命令我就不再說明了
(2)、安裝 這些軟件包,因爲他們之間有依賴關係,所以使用yum安裝
cd node
yum localinstall * --nogpgcheck –y
前兩步需要在兩個節點上都進行同樣的操作
(3)、將heartbeat的配置文件移動到/etc/下
cd /usr/share/doc/hearbeat-2.1.4
cp ha.cf authkeys /etc/ha.d
cd /usr/share/doc/heartbeat-ldirectord-2.1.4
cp ldirectord.cf /etc/ha.d/
(4)、編輯配置文件/etc/ha.d/ha.cf
vim /etc/ha.d/ha.cf 進行如下修改
打開日誌 logfile /var/log/ha-log
打開 udpport 694 兩節點用此端口發送心跳信息
添加 bcast eth1 發送心跳信息的網卡
添加定義節點 node node1.a.org
node node2.a.org
(5)、編輯配置文件/etc/ha.d/authkeys
vim /etc/ha.d/authkeys 添加如下內容
auth 2
2 sha1 kfhslkdhfsk(md5加密後的字符串,想要得到這個字符串運行如下命令,在將結果粘貼即可
dd if=/dev/urandom bs=512 count=1 | md5sum)
將此文件的權限改爲400
chmod 400 authkeys
(6)、編輯配置文件/etc/ha.d/ldirectord.cf
修改結果如下:
checktimeout=3 對後端的RS進行服務狀態檢測的超時時間
checkinterval=1 每次一秒檢測一次
autoreload=yes
logfile="/var/log/ldirectord.log" 開啓錯誤日誌
quiescent=yes
virtual=192.168.0.85:80 指定VIP地址
real=192.168.206:80 gate 200 指定RS1的IP、服務端口、lvs的類型、權重(實際的大小爲*100)
real=192.168.207:80 gate 600
fallback=127.0.0.1:80 gate
service=http 提供的服務
request=".ok.html" 對RS進行狀態檢測是檢測的網頁
receive="ok" 在網頁中搜索的關鍵字,只要找到這個關鍵字就認爲是服務正常
scheduler=rr LVS使用的調度算法
protocol=tcp 使用的協議
checktype=negotiate 檢測的類型
checkport=80 檢測的端口
(7)、將我們配置的這三個文件拷貝到node2上
cd /etc/ha.d
scp ha.cf authkeys ldirectord node2.a.org:/etc/ha.d
(8)、啓動heartbeat
在哪個節點上啓動第一個該服務,以後所有的這個服務必須在這個節點上啓動
我們就在node1上啓動heartbeat服務
/etc/init.d/heartbeat start
在node1上啓動node2的heartbeat服務
ssh node2 --‘/etc/init.d/heartbeat start’
(9)、在每個節點上都啓動ldirectord服務
service ldirectord start
查看我們的Director高可用集羣是否正常啓動:
執行命令:
crm_mon
可能剛開始看到的顯示爲:
表示沒有啓動,但是別急多等一會,比較慢,我們過一會再看,如果看到顯示如下表示成功:
圖片底部的信息表示Director的主節點爲ND1
接下來我們在瀏覽器中輸入192.168.0.85進行測試,看能夠看到網頁,如果看到表示LVS的服務正常:
我們將主節點的服務關閉,看資源是否成功流轉到ND2上
在node1上執行 /etc/init.d/heartbeat stop
至執行成功之後到node2上,在此查看資源狀態
結果顯示,node1已經宕機,此時node2已經稱爲主節點
我們再次驗證,Director高性能集羣能否提供LVS功能:
繼續在瀏覽器中數據192.168.0.85
結果顯示,RS集羣還能夠提供web服務,表示Director集羣依然能夠正常工作