架構圖:
(1)保證前端路由器將目標IP爲VIP的請求報文發送給director,將RS上的VIP配置爲lo接口的別名;
解決辦法:
靜態綁定
arptables
修改RS主機內核參數:/proc/sys/net/ipv4/conf
arp_ignore=1
arp_announce=2
(2)RS的RIP可以使用私有地址,也可以使用公網地址
(3)RS和Director必須在同一物理網絡中
(4)請求報文經由Director調度,但響應報文一定不能經由Director,由RS直接響應給client。
(5)不支持端口映射
(6)RS可以支持大多數OS
(7)RS網關不能指向DIP
工作方式:
上面說了NAT模型的實現方式,那麼NAT模型有個缺陷,因爲進出的每個數據包都要經過Director Server,當集羣系統負載過大的時候Director Server將會成爲整個集羣系統的瓶頸,
那麼DR模型就避免了這樣的情況發生,DR模型在只有請求的時候纔會經過Director Server, 迴應的數據包由Real Server 直接響應用戶不需要經過Director Server,其實三種模型中最常用的也就是DR模型了。
下面是它的工作流程:
1, 首先用戶用CIP請求VIP
2, 根據上圖可以看到,不管是Director Server還是Real Server上都需要配置VIP,那麼當用戶請求到達我們的集羣網絡的前端路由器的時候,請求數據包的源地址爲CIP目標地址爲VIP,
此時路由器會發廣播問誰是VIP,那麼我們集羣中所有的節點都配置有VIP,此時誰先響應路由器那麼路由器就會將用戶請求發給誰,這樣一來我們的集羣系統是不是沒有意義了,
那我們可以在網關路由器上配置靜態路由指定VIP就是Director Server,或者使用一種機制不讓Real Server 接收來自網絡中的ARP地址解析請求,這樣一來用戶的請求數據包都會經過Director Servrer
3,當Director Server收到用戶的請求後根據此前設定好的調度算法結果來確定將請求負載到某臺Real Server上去,假如說此時根據調度算法的結果,會將請求負載到RealServer 1上面去,
此時Director Server 會將數據幀中的目標MAC地址修改爲Real Server1的MAC地址,然後再將數據幀發送出去
4,當Real Server1 收到一個源地址爲CIP目標地址爲VIP的數據包時,Real Server1發現目標地址爲VIP,而VIP是自己,於是接受數據包並給予處理,當Real Server1處理完請求後,
會將一個源地址爲VIP目標地址爲CIP的數據包發出去,此時的響應請求就不會再經過Director Server了,而是直接響應給用戶。
編輯DR有三種方式(目的是讓用戶請求的數據都通過Director Server)
第一種方式:在路由器上明顯說明vip對應的地址一定是Director上的MAC,只要綁定,以後再跟vip通信也不用再請求了,這個綁定是靜態的,所以它也不會失效,也不會再次發起請求,但是有個前提,我們的路由設備必須有操作權限能夠綁定MAC地址,萬一這個路由器是運行商操作的,我們沒法操作怎麼辦?第一種方式固然很簡便,但未必可行。
第二種方式:在給別主機上(例如:紅帽)它們引進的有一種程序arptables,它有點類似於iptables,它肯定是基於arp或基於MAC做訪問控制的,很顯然我們只需要在每一個real server上定義arptables規則,如果用戶arp廣播請求的目標地址是本機的vip則不予相應,或者說相應的報文不讓出去,很顯然網關(gateway)是接受不到的,也就是director相應的報文才能到達gateway,這個也行。第二種方式我們可以基於arptables。
第三種方式:在相對較新的版本中新增了兩個內核參數(kernelparameter),第一個是arp_ignore定義接受到ARP請求時的相應級別;第二個是arp_announce定義將自己地址向外通告是的通告級別。【提示:很顯然我們現在的系統一般在內核中都是支持這些參數的,我們用參數的方式進行調整更具有樸實性,它還不依賴於額外的條件,像arptables,也不依賴外在路由配置的設置,反而通常我們使用的是第三種配置】
arp_ignore:定義接受到ARP請求時的相應級別
0:只要本地配置的有相應地址,就給予響應。
1:僅在請求的目標地址配置請求到達的接口上的時候,纔給予響應(當別人的arp請求過來的時候,如果接收的設備上面沒有這個ip,就不響應,默認是0,只要這臺機器上面任何一個設備上面有這個ip,就響應arp請求,併發送MAC地址應答。)
2:只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求,且來訪IP必須在該網絡接口的子網段內
3:不迴應該網絡界面的arp請求,而只對設置的唯一和連接地址做出迴應
4-7:保留未使用
8:不迴應所有(本地地址)的arp查詢
arp_announce:定義將自己地址向外通告是的通告級別;
0: 將本地任何接口上的任何地址向外通告
1:試圖僅想目標網絡通告與其網絡匹配的地址
2:僅向與本地藉口上地址匹配的網絡進行通告
部署
在Real Server1 和Real Server2上做以下配置
# 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
#以上命令需填加到/etc/rc.local文件中讓其開機自動生效
# vim /etc/sysconfig/network-scripts/ifcfg-lo:0 內容如下
DEVICE=lo:0
IPADDR=100.64.227.87
NETMASK=255.255.255.255
BROADCAST=100.64.227.87
ONBOOT=yes
NAME=loopback
# ifdown lo:0
# ifup lo:0
# route add -host 100.64.227.87 dev lo:0
# echo "route add -host 100.64.227.87 dev lo:0" >> /etc/rc.local
在Director Server上做以下配置
# vim /etc/sysconfig/network-scripts/ifcfg-ens33:0 內容如下
DEVICE=ens33:0
IPADDR=100.64.227.87
NETMASK=255.255.255.255
BROADCAST=100.64.227.87
ONBOOT=yes
# ifdown ens33:0
#命令
# ifup ens33:0
# route add -host 100.64.227.87 dev ens33:0
# echo "route add -host 100.64.227.86 dev ens33:0" >> /etc/rc.local
# echo "1" > /proc/sys/net/ipv4/ip_forward
# echo "echo "1" > /proc/sys/net/ipv4/ip_forward" >> /etc/rc.local
# ipvsadm -A -t 100.64.227.87:80 -s wlc
# ipvsadm -a -t 100.64.227.87:80 -r 172.16.100.10 -g -w 2
# ipvsadm -a -t 100.64.227.87:80 -r 172.16.100.11 -g -w 1