1.虛擬IP是什么?
要是單講解虛擬 IP,理解起來很困難,所以干脆把
動態(tài) IP 、固定 IP 、實體 IP 與虛擬 IP都講解一下,加深理解和知識擴展
實體 IP:在網(wǎng)絡(luò)的世界里,為了要辨識每一部計算機的位置,因此有了計算機 IP 位址的定義。一個 IP 就好似一個門牌!例如,你要去微軟的網(wǎng)站的話,就要去『 207.46.197.101 』這個 IP 位置!這些可以直接在網(wǎng)際網(wǎng)絡(luò)上溝通的 IP 就被稱為『實體 IP 』了。
虛擬 IP:不過,眾所皆知的,IP 位址僅為 xxx.xxx.xxx.xxx 的資料型態(tài),其中, xxx 為 1-255 間的整數(shù),由于近來計算機的成長速度太快,實體的 IP 已經(jīng)有點不足了,好在早在規(guī)劃 IP 時就已經(jīng)預(yù)留了三個網(wǎng)段的 IP 做為內(nèi)部網(wǎng)域的虛擬 IP 之用。這三個預(yù)留的 IP 分別為:
A級:10.0.0.0 - 10.255.255.255
B級:172.16.0.0 - 172.31.255.255
C級:192.168.0.0 - 192.168.255.255
上述中最常用的是192.168.0.0這一組。不過,由于是虛擬 IP ,所以當您使用這些地址的時候﹐當然是有所限制的,限制如下:
私有位址的路由信息不能對外散播
使用私有位址作為來源或目的地址的封包﹐不能透過Internet來轉(zhuǎn)送
關(guān)于私有位址的參考紀錄(如DNS)﹐只能限于內(nèi)部網(wǎng)絡(luò)使用
由于虛擬 IP 的計算機并不能直接連上 Internet ,因此需要特別的功能才能上網(wǎng)。不過,這給我們架設(shè)IP網(wǎng)絡(luò)做成很大的方便﹐比如﹕即使您目前的公司還沒有連上Internet﹐但不保證將來不會啊。如果使用公共IP的話﹐如果沒經(jīng)過注冊﹐等到以后真正要連上網(wǎng)絡(luò)的時候﹐就很可能和別人沖突了。也正如前面所分析的﹐到時候再重新規(guī)劃IP的話﹐將是件非常頭痛的問題。這時候﹐我們可以先利用私有位址來架設(shè)網(wǎng)絡(luò)﹐等到真要連上intetnet的時候﹐我們可以使用IP轉(zhuǎn)換協(xié)定﹐如 NAT (Network Addresss Translation)等技術(shù)﹐配合新注冊的IP就可以了。
固定 IP 與 動態(tài) IP:基本上,這兩個東西是由于近來網(wǎng)絡(luò)公司大量的成長下的產(chǎn)物,例如,你如果向中華電信申請一個商業(yè)型態(tài)的 ADSL 專線,那他會給你一個固定的實體 IP ,這個實體 IP 就被稱為『固定 IP 』了。而若你是申請計時制的 ADSL ,那由于你的 IP 可能是由數(shù)十人共同使用,因此你每次重新開機上網(wǎng)時,你這部計算機的 IP 都不會是固定的!于是就被稱為『動態(tài) IP』或者是『浮動式IP』?;旧希@兩個都是『實體IP』,只是網(wǎng)絡(luò)公司用來分配給用戶的方法不同而產(chǎn)生不同的名稱而已。
自己的理解
我們用路由器時,每個手機或電腦都有一個ip地址,這個IP就是虛擬IP。想象一下,如果世界上的每臺設(shè)備(電腦手機都算)都有一個實際IP地址,IP地址肯定不夠用。但如果每個實際的IP地址再對應(yīng)幾萬個虛擬的IP地址(比如 192.168.0.0 - 192.168.255.255),那不就夠了嗎?
我們給一個路由器分配一個實體IP(只是舉個例子),之后每個連接這個路由器的設(shè)備給他分配一個虛擬IP(比如 192.168.0.0 - 192.168.255.255 中隨機給一個),路由器記下這個虛擬IP和對應(yīng)的設(shè)備,當某個設(shè)備訪問網(wǎng)絡(luò)數(shù)據(jù)時,先經(jīng)過路由器,然后路由器與網(wǎng)絡(luò)進行數(shù)據(jù)交換,因為路由器有實體IP,所以網(wǎng)絡(luò)可以給路由器發(fā)送數(shù)據(jù),然后路由器再根據(jù)自己分配的虛擬IP發(fā)送到相應(yīng)的設(shè)備。
資料來源:http://blog.csdn.net/u014290233/article/details/53635658
2.虛擬IP與arp協(xié)議
一、虛擬IP
二、arp協(xié)議
三、虛擬IP與arp協(xié)議
虛擬IP和arp協(xié)議
虛擬IP常用于系統(tǒng)高可用性的場景,那么虛擬IP實現(xiàn)的原理是什么?虛擬能夠自由漂浮的原理是什么?
從前文介紹arp協(xié)議里面來看,主機與主機的通信過程都會涉及到一個ip地址轉(zhuǎn)換mac地址的過程,那么虛擬IP的通信也不會例外。因此,IP地址在主機通信的過程中其實就是一個邏輯地址。我們知道,每一個主機都存放著網(wǎng)絡(luò)內(nèi)一些主機的邏輯地址與物理地址(MAC地址)的映射,問題來了,當虛擬IP VIP在主機A上時,主機A的MAC地址為MAC_A某主機M的arp緩存中存放著一個映射關(guān)系:VIP ---à MAC_A;當主機A宕機后,虛擬IPVIP漂浮到了主機B,主機B的MAC地址為MAC_B,那么此時主機M想與虛擬IP通信時,是做不到,因為它的arp高速緩存中的虛擬IP VIP的映射還指向主機A的MAC地址。這個問題解決的思路就是當虛擬IP漂浮后,刷新所有其他主機的arp緩存。
那么虛擬IP是如何實現(xiàn)漂浮后,是如何刷新所有其他主機的arp緩存的呢?
這里就會引入另一個概念,garp()簡稱無端arp或者免費arp,主要是用來當某一個主機C開機時,用來確認自己的IP地址沒有被人占用而做的一個檢測。廣播發(fā)送這個arp,請求得到本機IP地址的MAC地址,主機C并不希望此次arp請求會有arp應(yīng)答,因為應(yīng)答意味著IP地址沖突了。當其他主機收到這個arp請求后,會刷新關(guān)于這個arp請求源的主機IP地址的映射。
Garp的作用主要有兩個:
1. 檢測IP地址是否有沖突
2. 刷新其他主機關(guān)于本次IP地址的映射關(guān)系
集群管理軟件Pacemaker里面的資源代理ocf:heartbeat:IPaddr2中,在虛擬IP漂浮后,會向網(wǎng)絡(luò)內(nèi)廣播發(fā)送garp請求,以此來刷新其他主機的arp緩存。
在配置OpenStack控制節(jié)點高可用性的時候,出現(xiàn)過虛擬IP切換時,某一個主機不能通信的問題,后來發(fā)現(xiàn)是arp緩存沒有刷新,有時候由于網(wǎng)絡(luò)的原因,某些主機沒有接收到此garp請求,因此ocf:heartbeat:IPaddr2資源代理中可以配置發(fā)送garp的次數(shù),這里建議次數(shù)配置得多一點,這樣可以保證其他主機成功刷新arp緩存。
資料來源:http://blog.csdn.net/u014532901/article/details/52245138
3. 談?wù)刅IP漂移那點破事
一直以來都是用nginx的upstream模塊做網(wǎng)站最前端的負載均衡,為了防止nginx本身宕機導(dǎo)致網(wǎng)站不能訪問,通常都會做兩套nginx反向代理,然后用keepalive之類的軟件提供VIP。
常見的環(huán)境是nginx主節(jié)點和從節(jié)點各有一個公網(wǎng)IP,一個私有IP,VIP地址也使用公網(wǎng)IP來提供,正常情況下VIP只會在nginx主節(jié)點上工作,只有主節(jié)點宕機或者網(wǎng)絡(luò)不可達等情況下,VIP才會漂移到nginx從節(jié)點上。如果keepalive配置了非搶占模式,則主節(jié)點恢復(fù)后,VIP也不會漂移會主節(jié)點,而是繼續(xù)在從節(jié)工作。這種配置要求機房網(wǎng)絡(luò)不做mac地址綁定。
最近做的兩套培訓(xùn)系統(tǒng)測試情況如下:
系統(tǒng)一:主從節(jié)點做雙網(wǎng)卡綁定,都只有一個私有IP,VIP也為私有IP,通過防火墻的NAT轉(zhuǎn)發(fā)用戶的訪問請求。主節(jié)點宕機后,VIP可以漂移至從節(jié)點,但用戶無法訪問網(wǎng)站,telnet防火墻公網(wǎng)IP的80端口提示無法連接。
系統(tǒng)二:主從節(jié)點各有兩張網(wǎng)卡,分別配置一個公網(wǎng)IP和一個私有IP。VIP地址也使用公網(wǎng)IP來提供。
主節(jié)點宕機后,VIP可以漂移至從節(jié)點,但用戶無法ping通VIP,自然網(wǎng)站也就打不開。
于是分別對這兩種情況進行排查:
系統(tǒng)二:屬于比較常見的配置方案。VIP漂移后無法ping通,第一反應(yīng)詢問機房工作人員,是否相應(yīng)的設(shè)備做了mac地址綁定。得知無綁定策略后繼續(xù)排查。
發(fā)現(xiàn)配置net.ipv4.ip_nonlocal_bind = 1 參數(shù)并使其生效后重新測試正常。
系統(tǒng)一:情況有點特殊,按系統(tǒng)二的解決方法嘗試無果后,懷疑端口路由器映射上出現(xiàn)問題。于是繼續(xù)測試VIP漂移,發(fā)現(xiàn)VIP漂移到從節(jié)點后,防火墻上的arp表中vip對應(yīng)的mac地址依舊是主節(jié)點網(wǎng)卡的mac地址,原來防火墻才是罪魁禍首,坑爹的貨。機房使用的防火墻型號華為Quidway Eudemon1000E,據(jù)說默認配置下,這個arp地址表自動刷新需要20分鐘!
好吧!于是用下面的命名手工刷新后,萬事大吉,網(wǎng)站訪問也很順暢,比較郁悶的是當主節(jié)點重新?lián)屨糣IP后,依然需要手工刷新下,否則防火墻還是把請求轉(zhuǎn)給從節(jié)點響應(yīng)。
# arping -I 網(wǎng)卡地址 -c 3 -s VIP地址 網(wǎng)關(guān)地址
后記:
要徹底解決系統(tǒng)一的問題,可以從兩方面去著手,首先是考慮去調(diào)整防火墻的arp表的自動刷新時間;其次是考慮在從節(jié)點上部署一個無限循環(huán)的腳本,時時去檢測是否搶占到了VIP,若搶占成功,則運行前面的刷新命令,命令成功運行后退出腳本,同時可以用nagios監(jiān)控該腳本,了解最新的主從切換情況。切記,循環(huán)運行一次接受后sleep 1秒,否則會死機的哦!
如果在主節(jié)點上也部署類似的腳本,則會對網(wǎng)絡(luò)帶來負擔,因而主節(jié)點恢復(fù)后的刷新手工運行下就好了,如果忘記運行了,從節(jié)點依然可以工作,無傷大雅!
資料來源:
http://ylw6006.blog.51cto.com/470441/1314004/
4.HA集群中的虛擬IP原理
高可用性HA(High Availability)指的是通過盡量縮短因日常維護操作(計劃)和突發(fā)的系統(tǒng)崩潰(非計劃)所導(dǎo)致的停機時間,以提高系統(tǒng)和應(yīng)用的可用性。HA系統(tǒng)是目前企業(yè)防止核心計算機系統(tǒng)因故障停機的最有效手段。
實現(xiàn)HA的方式,一般采用兩臺機器同時完成一項功能,比如數(shù)據(jù)庫服務(wù)器,平常只有一臺機器對外提供服務(wù),另一臺機器作為熱備,當這臺機器出現(xiàn)故障時,自動動態(tài)切換到另一臺熱備的機器。
怎么實現(xiàn)故障檢測的那?
心跳,采用定時發(fā)送一個數(shù)據(jù)包,如果機器多長時間沒響應(yīng),就認為是發(fā)生故障,自動切換到熱備的機器上去。
怎么實現(xiàn)自動切換那?
虛IP。何為虛IP那,就是一個未分配給真實主機的IP,也就是說對外提供數(shù)據(jù)庫服務(wù)器的主機除了有一個真實IP外還有一個虛IP,使用這兩個IP中的 任意一個都可以連接到這臺主機,所有項目中數(shù)據(jù)庫鏈接一項配置的都是這個虛IP,當服務(wù)器發(fā)生故障無法對外提供服務(wù)時,動態(tài)將這個虛IP切換到備用主機。
開始我也不明白這是怎么實現(xiàn)的,以為是軟件動態(tài)改IP地址,其實不是這樣,其實現(xiàn)原理主要是靠TCP/IP的ARP協(xié)議。因為ip地址只是一個邏輯 地址,在以太網(wǎng)中MAC地址才是真正用來進行數(shù)據(jù)傳輸?shù)奈锢淼刂罚颗_主機中都有一個ARP高速緩存,存儲同一個網(wǎng)絡(luò)內(nèi)的IP地址與MAC地址的對應(yīng)關(guān) 系,以太網(wǎng)中的主機發(fā)送數(shù)據(jù)時會先從這個緩存中查詢目標IP對應(yīng)的MAC地址,會向這個MAC地址發(fā)送數(shù)據(jù)。操作系統(tǒng)會自動維護這個緩存。這就是整個實現(xiàn) 的關(guān)鍵。
下邊就是我電腦上的arp緩存的內(nèi)容。
(192.168.1.219) at 00:21:5A:DB:68:E8 [ether] on bond0
(192.168.1.217) at 00:21:5A:DB:68:E8 [ether] on bond0
(192.168.1.218) at 00:21:5A:DB:7F:C2 [ether] on bond0
192.168.1.217、192.168.1.218是兩臺真實的電腦,
192.168.1.217為對外提供數(shù)據(jù)庫服務(wù)的主機。
192.168.1.218為熱備的機器。
192.168.1.219為虛IP。
大家注意紅字部分,219、217的MAC地址是相同的。
再看看那217宕機后的arp緩存
(192.168.1.219) at 00:21:5A:DB:7F:C2 [ether] on bond0
(192.168.1.217) at 00:21:5A:DB:68:E8 [ether] on bond0
(192.168.1.218) at 00:21:5A:DB:7F:C2 [ether] on bond0
這就是奧妙所在。當218 發(fā)現(xiàn)217宕機后會向網(wǎng)絡(luò)發(fā)送一個ARP數(shù)據(jù)包,告訴所有主機192.168.1.219這個IP對應(yīng)的MAC地址是00:21:5A:DB:7F:C2,這樣所有發(fā)送到219的數(shù)據(jù)包都會發(fā)送到mac地址為00:21:5A:DB:7F:C2的機器,也就是218的機器。
5. 基于keepalived 實現(xiàn)VIP轉(zhuǎn)移,lvs,nginx的高可用
一、Keepalived 高可用集群的解決方案
二、VRRP的有限狀態(tài)機
三、利用keepalived 實現(xiàn)主從VIP的切換
四、實現(xiàn)在狀態(tài)轉(zhuǎn)變的時候自定義進行通知,
五、實現(xiàn)負載均衡
六:實現(xiàn)nginx的高可用
一、Keepalived 高可用集群的解決方案
最初的誕生是為ipvs提供高可用的,在后端的realserver接收不到主節(jié)點的信息之后,keepalived能夠自己調(diào)用ipvsadm命令生成規(guī)則,能夠自動實現(xiàn),將主節(jié)點的VIP以及ipvs規(guī)則“拿過來”,應(yīng)用在從節(jié)點上,繼續(xù)為用戶服務(wù)。還可以實現(xiàn)對后端realserver的健康狀況做檢測。
keepalived在一個節(jié)點上啟動之后,會生成一個Master主進程,這個主進程又會生成兩個子進程,分別是VRRP Stack(實現(xiàn)vrrp協(xié)議的) Checkers(檢測ipvs后端realserver的健康狀況檢測)
二、VRRP的有限狀態(tài)機
VRRP雙方節(jié)點都啟動以后,要實現(xiàn)狀態(tài)轉(zhuǎn)換的,剛開始啟動的時候,初始狀態(tài)都是BACKUP,而后向其它節(jié)點發(fā)送通告,以及自己的優(yōu)先級信息,誰的優(yōu)先級高,就轉(zhuǎn)換為MASTER,否則就還是BACKUP,這時候服務(wù)就在狀態(tài)為MASTER的節(jié)點上啟動,為用戶提供服務(wù),如果,該節(jié)點掛掉了,則轉(zhuǎn)換為BACKUP,優(yōu)先級降低,另一個節(jié)點轉(zhuǎn)換為MASTER,優(yōu)先級上升,服務(wù)就在此節(jié)點啟動,VIP,VMAC都會被轉(zhuǎn)移到這個節(jié)點上,為用戶提供服務(wù),
實驗環(huán)境:
虛擬主機版本:
CentOS6.4-i686
兩個節(jié)點:
node1.limian.com 172.16.6.1
node2.limian.com 172.16.6.10
準備
1、節(jié)點一:
同步時間:
[root@node1 ~]# ntpdate 172.16.0.1
安裝keepalived
[root@node1 ~]# yum -y install keepalived
2、節(jié)點二做同樣的工作
三、利用keepalived 實現(xiàn)主從VIP的切換
3.1我們修改下keepalived的配置文件:
1 2 3 | [root@node1 ~]# cd /etc/keepalived/ [root@node1 keepalived]# cp keepalived.conf keepalived.conf.back //先給配置文件備份一下 [root@node1 keepalived]# vim keepalived.conf |
3.2全局階段
1 2 3 4 5 6 7 8 9 | global_defs { notification_email { //定義郵件服務(wù)的 root@localhost //定義收件人,這里改為本機,只是測試使用 } notification_email_from kaadmin@localhost //定義發(fā)件人, smtp_server 127.0 . 0.1 //定義郵件服務(wù)器,一定不能使用外部地址 smtp_connect_timeout 30 //超時時間 router_id LVS_DEVEL } |
3.3定義vrrp階段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | vrrp_instance VI_1 { //定義虛擬路由,VI_1 為虛擬路由的標示符,自己定義名稱 state MASTER //開啟后,該節(jié)點的優(yōu)先級比另一節(jié)點的優(yōu)先級高,所以轉(zhuǎn)化為MASTER狀態(tài) interface eth0 //所有的通告等信息都從eth0這個接口出去 virtual_router_id 7 //虛擬路由的ID,而且這個ID也是虛擬MAC最后一段的來源,這個ID號一般不能大于255,且這個ID一定不能有沖突 priority 100 //初始優(yōu)先級 advert_int 1 //通告的個數(shù) authentication { //認證機制 auth_type PASS //認證類型 auth_pass 1111 //密碼,應(yīng)該為隨機的字符串 } virtual_ipaddress { //虛擬地址,即VIP 172.16 . 6.100 } } |
這樣我們主節(jié)點的配置文件就修改好了,需要復(fù)制到從節(jié)點上,再做適當?shù)男薷木涂梢允褂昧?/span>
1 | [root@node1 keepalived]# scp keepalived.conf 172.16 . 6.1 :/etc/keepalived/ |
3.4登錄到從節(jié)點;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [root@node2 ~]# cd /etc/keepalived/ [root@node2 keepalived]# vim keepalived.conf vrrp_instance VI_1 { state BACKUP //修改從節(jié)點的狀態(tài),主節(jié)點為MASTER,從節(jié)點就為BACKUP interface eth0 virtual_router_id 7 priority 99 //修改優(yōu)先級,注意從節(jié)點的優(yōu)先級一定要小于主節(jié)點 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16 . 6.100 } } |
3.5然后在主節(jié)點啟動服務(wù)
1 2 | [root@node1 keepalived]# service keepalived start [root@node1 ~]# ip addr show //查看我們定義的VIP |
3.6在從節(jié)點啟動服務(wù)
[root@node2 keepalived]# service keepalived start
把主節(jié)點上的服務(wù)停掉,看VIP會不會到從節(jié)點上
[root@node2 ~]# ip addr show
3.7在主節(jié)點上啟動服務(wù)
1 2 | [root@node1 ~]# service keepalived start [root@node1 ~]# ip addr show //檢測結(jié)果發(fā)現(xiàn)VIP轉(zhuǎn)移到了主節(jié)點 |
注:
默認情況下ARRP工作在“搶占模式”下,如果發(fā)現(xiàn)一個節(jié)點的服務(wù)停止了,另一個節(jié)點會立即把VIP和VMAC“搶過來”,如果在“非搶占模式”下,無論你的優(yōu)先級過高,一個節(jié)點服務(wù)停止,另一個節(jié)點也不會“搶”VIP和VMAC,除非這個節(jié)點掛了,兩一個節(jié)點才會“搶”。
四、實現(xiàn)在狀態(tài)轉(zhuǎn)變的時候自定義進行通知,
4.1這需要依賴于腳本來完成
主節(jié)點
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | [root@node1 ~]# cd /etc/keepalived/ [root@node1 keepalived]# vim notify.sh //編寫腳本 #!/bin/bash vip= 172.16 . 6.100 contact= 'root@localhost' thisip=`ifconfig eth0 | awk '/inet addr:/{print $2}' | awk -F: '{print $2}' ` Notify() { mailsubject= "$thisip is to bi $vip master" mailbody= "vrrp transaction, $vip floated to $thisip" echo $mailbody | mail -s "$mailsubject" $contact } case "$1" in master) notify master exit 0 ;; backup) notify backup exit 0 ;; fault) notify fault exit 0 ;; *) echo 'Usage: `basename $0` {master|backup|fault}' exit 1 ;; esac [root@node1 keepalived]# chmod +x notify.sh [root@node1 keepalived]# ./notify.sh master [root@node1 keepalived]# mail //查看有沒有收到通知 Heirloom Mail version 12.4 7 / 29 / 08 . Type ? for help. "/var/spool/mail/root" : 1 message 1 new >N 1 root Wed Sep 25 14 : 54 18 / 668 "172.16.6.10 is to bi 172.16.6.100 mas" & |
轉(zhuǎn)換狀態(tài)查看是否會收到通知
1 2 3 4 5 6 7 8 9 | [root@node1 keepalived]# ./notify.sh backup [root@node1 keepalived]# ./notify.sh fault [root@node1 keepalived]# mail Heirloom Mail version 12.4 7 / 29 / 08 . Type ? for help. "/var/spool/mail/root" : 3 messages 2 new 1 root Wed Sep 25 14 : 54 19 / 679 "172.16.6.10 is to bi 172.16.6.100 mas" >N 2 root Wed Sep 25 14 : 57 18 / 668 "172.16.6.10 is to bi 172.16.6.100 mas" N 3 root Wed Sep 25 14 : 57 18 / 668 "172.16.6.10 is to bi 172.16.6.100 mas" & |
說明腳本正常工作,那么去編輯配置文件
1 | [root@node1 keepalived]# vim keepalived.conf |
在全局階段添加
1 2 3 4 5 | vrrp_script chk_mantaince_down{ //定義可以手動控制狀態(tài)的腳本 script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 //檢查時間間隔 weight - 2 //如果檢測失敗,優(yōu)先級-2 } |
在vrrp階段添加如下幾行
1 2 3 4 5 6 | track_script { //引用定義的腳本 chk_mantaince_down } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" |
4.2將該腳本復(fù)制到另一個節(jié)點,
1 | [root@node1 keepalived]# scp notify.sh 172.16 . 6.1 :/etc/keepalived/ |
并在配置文件中相應(yīng)的位置添加相同內(nèi)容
兩個節(jié)點都重啟服務(wù)
4.3讓主節(jié)點變成從節(jié)點
1 | root@node1 keepalived]# touch down |
通過監(jiān)控,發(fā)現(xiàn)主節(jié)點立即變成從節(jié)點,并收到一封郵件
1 2 | [root@node1 keepalived]# tail -f / var /log/messages You have new mail in / var /spool/mail/root |
五、實現(xiàn)負載均衡
5.1編輯配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | [root@node1 keepalived]# vim keepalived.conf #####負載均衡階段################# virtual_server 172.16 . 6.100 80 { //指定VIP和端口 delay_loop 6 //延遲多少個周期再啟動服務(wù),做服務(wù)檢測 lb_algo rr loadbalance 負載均衡調(diào)度算法 lb_kind DR 類型 nat_mask 255.255 . 0.0 掩碼 persistence_timeout 0 持久連接時間 protocol TCP //協(xié)議 real_server 172.16 . 6.11 80 { //定義后端realserver的屬性 weight 1 HTTP_GET { //定義檢測的方法 url { //檢測的URL path / status_code 200 //獲取結(jié)果的狀態(tài)碼 } connect_timeout 3 //連接超時時間 nb_get_retry 3 //嘗試次數(shù) delay_before_retry 3 //每次嘗試連接的等待時間 } } real_server 172.16 . 6.12 80 { //定義后端realserver的屬性 weight 1 HTTP_GET { //定義檢測的方法 url { //檢測的URL path / status_code 200 //獲取結(jié)果的狀態(tài)碼 } connect_timeout 3 //連接超時時間 nb_get_retry 3 //嘗試次數(shù) delay_before_retry 3 //每次嘗試連接的等待時間 } } } |
5.2、在從節(jié)點上做同樣的修改
5.3重啟服務(wù)并用ipvsadm命令檢測是否會生成規(guī)則
1 2 3 4 5 6 7 | [root@node1 keepalived]# service keepalived restart [root@node1 keepalived]# ipvsadm -L -n IP Virtual Server version 1.2 . 1 (size= 4096 ) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16 . 6.100 : 80 rr [root@node1 keepalived]# |
但是為什么沒有我們定義的兩個realserver呢?那是因為沒啟動虛擬機呢,健康狀況檢測沒通過,就不會顯示了,我們?nèi)右粋€虛擬機,并啟動服務(wù)即可。
并執(zhí)行如下命令,做lvs負載均衡的DR模型
1 2 3 4 5 6 | #ifconfig lo: 0 172.16 . 6.11 broadcast 172.16 . 6.11 netmask 255.255 . 255.255 up #route add -host 172.16 . 6.11 dev lo: 0 #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 |
注:
1、后端的realserver的數(shù)量可以添加多臺,但是需要在主節(jié)點的配置文件中給出相應(yīng)的配置,并在添加的realserver上執(zhí)行相關(guān)命令即可
2、盡管keepalived可以自行添加ipvs規(guī)則,實現(xiàn)負載均衡,但是無法實現(xiàn)動靜分離,在生產(chǎn)環(huán)境中我們要根據(jù)場景選擇最佳的方案。
六:實現(xiàn)nginx的高可用
6.1前提
兩個節(jié)點上都裝上nginx服務(wù),并確保httpd沒啟用
# netstat -tunlp //確保80端口沒占用
# service nginx start
6.2為每個節(jié)點的nginx編輯一個頁面,以便于效果更直觀一些
1 2 3 4 | [root@node1 ~]# vim /usr/share/nginx/html/index.html //節(jié)點1 172.16 . 6.10 [root@node2 ~]# vim /usr/share/nginx/html/index.html //節(jié)點2 172.16 . 6.1 |
6.3確保nginx可以正常訪問
6.4然后停掉服務(wù),
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@node1 keepalived]# vim notify.sh //修改腳本,讓它可以監(jiān)測nginx服務(wù),并可以啟動或關(guān)閉服務(wù) ################## case "$1" in master) notify master /etc/rc.d/init.d/nginx start exit 0 ;; backup) notify backup /etc/rc.d/init.d/nginx stop exit 0 ;; fault) notify fault /etc/rc.d/init.d/nginx stop exit 0 ;; ###################################### |
6.5同步腳本到節(jié)點2
1 | [root@node1 keepalived]# scp notify.sh 172.16 . 6.1 :/etc/keepalived/ |
6.6在主節(jié)點上
1 2 3 4 | [root@node1 keepalived]# touch down [root@node1 keepalived]#ss -tunl //發(fā)現(xiàn)80端口未被監(jiān)聽 [root@node1 keepalived]# rm -f down [root@node1 keepalived]#ss -tunl //發(fā)現(xiàn)80端口已經(jīng)被監(jiān)聽 |