【LVS+Nginx+Keepalived】
【LVS+Nginx+Keepalived】
其實這樣的三個組合在一起是最合適不過了。
因爲LVS通過集羣管理工具ipvsadm來對集羣進行管理,而Nginx提供web端的服務以及性能調優,最後keepalived則提供了
整個集羣的健康監測功能,除了可以實現對兩臺LVS的雙機熱備,還可以實現對內的Nginx的健康監測。
LVS的對外的VIP地址和Keepalived的浮動地址是一個地址。
先來看一張組合圖:
【前期準備】
1. 兩臺LVS服務器及兩臺Nginx服務器
兩臺LVS服務器分別爲:
LVS_one---->eth0:192.168.60.94/24 vip:192.168.60.90
LVS_two---->eth0:192.168.60.103/24 vip:192.168.60.90
兩臺Nginx服務器分別爲:
Nginx_one----->eth0:192.168.60.107/24 vip:192.168.60.90
Nginx_two----->eth0:192.168.60.108/24 vip:192.168.60.90
a. eth0地址如果不在同一網段,請自行調整
b. 統一添加eth-lo:0方法:(這個地址實際就是LVS的DR模式下的vip地址)
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
----------------修改爲下面的內容-------------------------------
DEVICE=lo:0
IPADDR=192.168.60.90
NETMASK=255.255.255.255
#NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
--------------------------------------------------------------------------------------------------------------
最後重啓網卡:service network restart
這樣之後通過ifconfig命令查看,其結果應該有出現如下所示:
-----------------------------------------------------------------------------------
lo:0 Link encap:Local Loopback
inet addr:192.168.60.90 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:65536 Metric:1
-----------------------------------------------------------------------------------
2. LVS的服務器上分別安裝keepalived和ipvsadm
Nginx服務器上安裝相應的nginx服務,並按照之前文章的列子,修改web首頁便於區分流量走向,並關閉相關服務。
LVS: 解壓並安裝keepalived: yum -y install gcc* 如果沒有安裝會導致安裝失敗 yum -y install openssl* 如果沒有安裝會導致功能不全 tar -zxvf keepalived-1.2.23.tar.gz cd keepalived-1.2.23 ./configure --prefix=/usr/local/keepalived make && make install 將keepalived註冊成爲系統服務: -------------------------------------------- cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf ---------------------------這樣就可以將keepalived做成系統服務了----- /etc/rc.d/init.d/keepalived 加入init.d的啓動列表 chkconfig keepalived on 加入開機啓動 ---------------------------------------------------- 安裝ipvsadm工具: yum -y install ipvsadm Nginx: 安裝依賴包: yum -y install pcre* yum -y install openssl* yum -y install zlib* 解壓安裝: tar -zxvf nginx-1.8.1.tar.gz cd nginx-1.8.1 ./configure make && make install 啓動進程: /usr/local/nginx/sbin/nginx 啓動nginx進程 /usr/local/nginx/sbin/nginx -s reload 重啓進程 /usr/local/nginx/sbin/nginx -s stop 停止進程 關閉防火牆:service iptables stop 或者添加防火牆規則: vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j AccEPT 修改web首頁: vim /usr/local/nginx/html/index.html <h1>Welcome to nginx!192.168.60.107</h1> #另外一臺nginx加入108的地址 關閉重定向功能: vim etc/sysctl.conf 加入以下內容: net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.eth0.send_redirects = 0 關閉ARP查詢功能: 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 添加路由條目: route add -host 192.168.60.90 dev lo:0 驗證Nginx的可用性: 是否可以正常打開index.html的首頁,分別在瀏覽器輸入兩臺Nginx的服務器地址,然後打開測試。 出現首頁則爲正常。
【arp_ignore和arp_announce說明】
DR和TUN模式都需要在真實服務器上對arp_ignore和arp_announce參數進行配置,主要是實現禁止響應對VIP的ARP請求。
arp_ignore:
定義對目標地址爲本地IP的ARP詢問不同的應答模式
0 - (默認值): 迴應任何網絡接口上對任何本地IP地址的arp查詢請求
1 - 只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求
2 -只回答目標IP地址是來訪網絡接口本地地址的ARP查詢請求,且來訪IP必須在該網絡接口的子網段內
3 - 不迴應該網絡界面的arp請求,而只對設置的唯一和連接地址做出迴應
4-7 - 保留未使用
8 -不迴應所有(本地地址)的arp查詢
arp_announce:
對網絡接口上,本地IP地址的發出的,ARP迴應,作出相應級別的限制: 確定不同程度的限制,宣佈對來自本地源IP地址發出Arp請求的接口
0 - (默認) 在任意網絡接口(eth0,eth1,lo)上的任何本地地址
1 -儘量避免不在該網絡接口子網段的本地地址做出arp迴應.
當發起ARP請求的源IP地址是被設置應該經由路由達到此網絡接口的時候很有用.
此時會檢查來訪IP是否爲所有接口上的子網段內ip之一.如果改來訪IP不屬於各個網絡接口上的子網段內,
那麼將採用級別2的方式來進行處理.
2 - 對查詢目標使用最適當的本地地址.
在此模式下將忽略這個IP數據包的源地址並嘗試選擇與能與該地址通信的本地地址.
首要是選擇所有的網絡接口的子網中外出訪問子網中包含該目標IP地址的本地地址.
如果沒有合適的地址被發現,將選擇當前的發送網絡接口或其他的有可能接受到該ARP迴應
的網絡接口來進行發送.
【兩個LVS端的Keepalived配置文件更改】
1. 接合上一次的Nginx+keepalived的keepalived.conf配置文件更改,這次來進行基於LVS雙機熱備以及實現對內nginx
實現健康監測的配置更改。
2. 接下來進行簡單keepalived的配置。由於keepalived沒有做在Nginx上面,所以之前的腳本可以取消。
-----------------------------------Global全局配置部分---------------------------------------------- ------------------------------------------------- [root@SLC-one keepalived]# less keepalived.conf ! Configuration File for keepalived #全局設置 global_defs { #存在於同一個網段中,一組keepalived的各個節點都有不同的名字 #在全局設置中,這裏可以設置管理員的email郵箱信息 notification_email { #通知郵件 [email protected] [email protected] [email protected] } notification_email_from [email protected] #通知郵件來源 smtp_server 192.168.200.1 #設置郵件服務器地址爲本地 smtp_connect_timeout 30 #設置連接超時時間 router_id LVS_one #設置本keepalived的ID名稱 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } ----------------------------------------Vrouter的配置部分----------------------------------------------- ------------------------------------------------------------ vrrp_instance VI_1 { #設置第一個實例 state MASTER #設置本機keepalived角色爲MASTER(如果是另一臺臺則設置爲BACKUP) interface eth0 #綁定網卡爲eth0(可以用ifconfig命令查看當前使用的網卡名稱及地址) virtual_router_id 51 #虛擬路由節點ID,在同一組keepalived中,這個ID一定必須要一樣,纔會被識別 #nopreempt #如果不希望在MASTER恢復後重新搶佔,那麼這裏一定要配置非搶佔模式(一般默認爲搶佔模式) #這裏可以不開啓 priority 100 #設置此MASTER的優先級(MASTER的優先級一定比SLAVE的優先級高,值越大優先級越高) advert_int 1 #設置組播信息發送間隔,兩臺主從也必須一樣 authentication { #認證信息 auth_type PASS #只有兩邊的認證信息一致才能加入到同一個組中 auth_pass 1111 } virtual_ipaddress { #浮動虛擬ip設置,這個原本的配置文件裏面有三個,可目前我們只需要一個 192.168.60.90 #設置浮動ip } }
3. 接下來進行LVS使用虛擬ip監測和下層真實ip監測的設置:
-----------------------------------------LVS配置部分--------------------------------------------------- ------------------------------------- virtual_server 192.168.60.90 80 { #設置虛擬服務地址,端口爲80 delay_loop 6 #健康檢查時間延時爲6秒 lb_algo rr #負載均衡調度算法爲輪詢制,和LVS使用的調度算法要保持一致 lb_kind DR #負載均衡的轉發規則爲LVS下的DR轉發模式 persistence_timeout 50 #會話保持時間爲50秒,因爲我們經常使用的是無狀態的集羣架構,所以這個設置可有可無 protocol TCP #使用的轉發協議爲TCP協議 real_server 192.168.60.107 80 { #設置真實的下層節點的健康監測,端口爲80 weight 1 #權重值設置 SSL_GET { #設置檢查的方式可以是SSL_GET或者HTTP_GET url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd } connect_timeout 3 #連接超時時間設置,單位秒,如果這個時間內沒有返回,則說明一次監測失敗 nb_get_retry 3 #設置多少次監測失敗,這個節點就判斷爲已經宕掉了 delay_before_retry 3 #重試間隔時間 } } } real_server 192.168.60.108 80 { #設置監測另外一臺Nginx的服務器地址,端口爲80 weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
這樣的話,keepalived就可以監測架構中的所有節點的狀態了。而不用再通過腳本去實現。
****其實原本這個配置文件裏面是:一個服務器一個節點
一個服務器一個節點
一個服務器兩個節點
最後我直接選擇了最後面一個服務器兩個節點,上面的都刪除掉了,其實這個是彈性的,根據自己的需要,
自己進行服務器或者節點的配置文件複製或者添加。
-------------------------------------------------------------------------------------------------------
其實在另外一臺LVS_two上面的配置文件跟這個差不多一樣,不同的只是角色state和優先級priority的不同設置而已,
但看上面的架構環境,其他的配置都是一樣的。所以這裏不再贅述。
【LVS_one和LVS_two虛擬服務器及節點添加及狀態檢查】
ipvsadm -C #清除內核虛擬服務器中的所有記錄
ipvsadm -At 192.168.60.90:80 -s rr
ipvsadm -at 192.168.60.90:80 -r 192.168.60.107:80 -g
ipvsadm -at 192.168.60.90:80 -r 192.168.60.108:80 -g
保存分配策略:
service ipvsadm save
最後開啓keepalived的服務:
service keepalived start
或者
/etc/rc.d/init.d/keepalived start
最後檢查兩臺LVS和兩臺Nginx服務器的整機狀態: /etc/rc.d/init.d/keepalived status keepalived (pid 5770) is running... ps -C nginx PID TTY TIME CMD 1029 ? 00:00:00 nginx 1031 ? 00:00:00 nginx
再次分別在MASTER和BACKUP上檢查LVS的集羣成員列表: [root@SL-one keepalived]# 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.60.90:80 rr -> 192.168.60.107:80 Route 1 0 0 -> 192.168.60.108:80 Route 1 0 0
證明所有服務都起來了,就可以開始測試驗證了。
【驗證實驗】
如果是在真實環境中一定注意:
關閉防火牆,或者添加規則。否則服務器一旦重啓,那麼LVS_one會默認搶佔回來,可是因爲防護牆沒
關閉或者防火牆通路規則沒有添加,那麼搶佔回來反而致使訪問不到節點nginx的首頁。
1.在LVS_one宕機的時候,是否可以正常訪問nginx首頁
測試證明,依然可以訪問nginx的首頁,注意測試的時候清空瀏覽器的緩存。否則測試結果不準確。
2.在LVS_one宕機的時候,在Nginx_one的Nginx服務沒啓動的時候,依然可以通過LVS_two的虛擬vip訪問nginx首頁,
只是這時候應該是由Nginx_two傳回首頁。反之亦然。
實驗證明:
在關閉Nginx_one(192.168.60.107)的nginx服務的時候,Nginx_two(192.168.60.108)的nginx服務還在運行
/usr/local/nginx/sbin/nginx -s stop
可以通過VIP訪問到由Nginx_two(192.168.60.108)傳回的nginx首頁。
在關閉Nginx_two(192.168.60.108)的nginx服務的時候,啓用Nginx_one(192.168.60.107)的nginx服務,
那麼立刻也可以得到由Nginx_one(192.168.60.107)傳回的nginx首頁。
當最後同時啓動Nginx_one(192.168.60.107)和Nginx_two(192.168.60.108)的nginx服務的時候,首頁依然可以
訪問,且通過ipvsadm -Lnc可以查看到:
[root@SL-two keepalived]# ipvsadm -Lnc IPVS connection entries pro expire state source virtual destination TCP 01:43 FIN_WAIT 192.168.60.67:14639 192.168.60.90:80 192.168.60.108:80 TCP 14:34 ESTABLISHED 192.168.60.67:14638 192.168.60.90:80 192.168.60.107:80
【最終的主MASTER端配置文件】
------------------------------------------------------------------- ! Configuration File for keepalived global_defs { notification_email { [email protected] [email protected] [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_one vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.60.90 } } virtual_server 192.168.60.90 80 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 192.168.60.107 80 { weight 1 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.60.108 80 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } --------------------------------------------------------------------