keepalived+LVS 實現雙機熱備、負載均衡、失效轉移 高性能 高可用 高伸縮性 服務器集群

JaniceGil 8年前發布 | 44K 次閱讀 LVS 高性能 集群/負載均衡 keepalived

來自: http://www.cnblogs.com/painsOnline/p/5177464.html

本章筆者親自動手,使用LVS技術實現實現一個可以支持龐大訪問量、高可用性、高伸縮性的服務器集群

在讀本章之前,可能有不少讀者尚未使用該技術,或者部分讀者使用Nginx實現應用層的負載均衡。這里大家都可以閱讀本章,即使部分讀者使用Nginx負載均衡,但是在大流量下性能相對于工作在鏈路層的LVS真是不能同日而語,并且LVS不僅可以實現WEB方面的負載均衡,其他諸如數據庫、FTP、Mail等都可以實現。

通常對于小型網站,很多都使用單臺服務器,頂多在弄個緩存服務器、數據庫服務器。但是一旦流量上來,單臺服務器在再害也無法應對流量洪峰,況且如果這臺服務器掛了整個網站就算是掛了。而且大家會發現,一般都是在節假日或者做活動時流量突增,如果使用單臺性能十分高的服務器,很多時候資源都在閑置著,那么我們是否能在流量高峰之前加幾臺等流量過去了再減幾臺,這樣是不是省了很多money了。

高性能、搞可用性、高伸縮性,這些我想都是大部分IT人員日夜追尋的,筆者不才,親自手動搭建一個LVS負載均衡集群來實現讀者的夢想。

首先介紹下雙機熱備,負載均衡的架構

"主director server"和"備用director server"是路由調度層,平時由"住director server"進行路由分發,"備用director server"平時作為"主director server" 的備份,當"主director server"出現故障的時候自動切換到"備用director server"上面,當其恢復后再次切換回來,這樣主備一起就實現了雙機熱備避免單點故障。

當用戶訪問時,包被發送到"主director server","主director server"根據相應規則以及服務器集群各個節點的負載情況將流量均衡分配給相應服務器節點。當服務器集群中有節點出現故障時,自動將該節點踢出,待修復后再自動加入該節點。以此實現分流,降低單臺服務器壓力,同時保證整個服務器集群的高可用性。

LVS是通過IP負載均衡技術實現負載均衡的,具體到本章的Centos環境,就是通過IPVS模塊來實現的。IPVS的主要作用是:它安裝在director server 上面,同時在director server上面虛擬出一個IP,用戶必須通過虛擬的IP地址訪問服務器,這個虛擬的IP一般稱為LVS的虛擬IP,訪問者的請求先經過VIP到達負載均衡調度器,然后由負載均衡調度器容從Real Server 列表中選擇一個節點響應用戶的請求。在用戶的請求到達director server 后,director server如何提供服務器到real server, real server 節點如何返回數據給用戶是IPVS技術的重點

IPVS實現負載均衡的技術有三種:

VS/NAT : 即網絡地址翻譯技術實現負載均衡, 當用戶請求到達負載均衡調度器后,調度器將請求的目標地址(即虛擬IP)改為選定的real server地址,同時將目標端口改成相應的real server 端口,最后將報文發送給選定的real server。real server將數據返回給用戶時,需要再次經過負載均衡調度器,將報文的源地址和端口地址改為相應的虛擬IP和端口,然后經過調度器發送給客戶端。可以看出NAT模式下,報文都必須通過director server 對地址和端口進行改寫,流量大的情況下,director server將成為瓶頸。

VS/TUN:通過IP隧道技術實現虛擬服務器。這種方式的鏈接調度管理和NAT方式相同,只是報文轉發方法不一樣。在VS/TUN模式下,調度器采用IP隧道技術將用戶的請求轉發到某個real server節點上,而這個real server 將直接響應用戶的請求,不再經過前端調度器。此外對real server的地域位置沒有要求,其可以喝director server在同一個網絡,也可以位于單獨的網絡。因此,相對于NAT模式,VS/TUN模式大大提高系統吞吐量。

VS/DR:也就是直接路由技術實現虛擬服務器。這種方式的鏈接調度管理和前兩種方式一樣,但它的報文轉發方法又有所不同,VS/DR通過改寫報文的請求MAC地址,將請求發送到real server, 而real server將相應直接返回給客戶,免去VS/TUN的IP隧道開銷。這三種方式中,VS/TR的負載調度模式性能最好,但要求director server 與 real server 由同一塊網卡鏈接在同一個物理網絡中。

負載調度算法有四中:

輪叫調度:通過"輪叫"調度算法將外部用戶請求按1:1的分配到集群中每個real server節點上,這種算法平等對待每臺real server。

加權輪叫調度:該算法根據real server的不同處理能力來調度訪問請求。可以對每臺real server設置不同的調度權值,性能高的設置高些,性能低的設置低些,進而保證性能好的處理更多流量,充分合理利用服務器資源。同時調度器動態查詢real server的負載情況,并動態調整其權值。

最少連接調度:該調度算法動態的將請求調度到連接數最少的real server 上。

加權最少連接調度:該算法是"最少連接調度"算法的增強版,每個服務器可以設定相應的權值表示其處理能力,而系統管理員可以設置其權值,其在分配請求時盡可能使服務器連接數和其權值成正比。

好了,介紹完以上知識,我們這里就要實踐一下這個HA雙機熱備、負載均衡集群了

架構圖如下

第一步:配置各個服務器IP

這里私有IP怎樣配置筆者就不再累述了,這里就講下虛擬IP如何配置(主備不需要虛擬IP的配置,keepalived或者heartbeat會自動進行配置,筆者這里主要是講的real server節點的虛擬IP配置),這里筆者通過shell腳本實現,shell的內如如下(/etc/init.d/functions 要給755權限奧)

#!/bin/bash

開啟或關閉real server 服務

VIP=192.168.138.200 ./etc/rc.d/init.d/functions case "$1" in start) echo "Start LVS of Real Server 3" /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up 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 ;; stop) /sbin/ifconfig lo:0 down echo "Close LVS Director Server" echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce ;; *) echo "Usage:$0 {start|stop}" exit 1 esac</pre>

然后放到 '/etc/init.d/lvsrs' 并賦予權限

chomd 755 /etc/init.d/lvsrs

第二步:在主、備 director server 上安裝 keepalived ipvsadm 等軟件

其中keepalived 用來監控服務器集群各個節點的狀態,如果某個服務節點出現異常或工作出現故障,keepalived將檢測到并將故障的節點從集群中踢出出去,當節點恢復正常后keepalived又自動的將節點加入到集群中。

ipvsadm 是ipvs模塊的管理軟件,而LVS(Linux 虛擬主機)就是通過IPVS模塊來實現的,由于筆者使用的是Centos6.4,內核已經默認支持LSV功能了,這里可以通過命令檢測kernel是否已經支持LVS的IPVS模塊

modprobe -l|grep 'ipvs'

如果列出以下結果就算支持了

kernel/net/netfilter/ipvs/ip_vs.ko

kernel/net/netfilter/ipvs/ip_vs_rr.ko

kernel/net/netfilter/ipvs/ip_vs_wrr.ko

kernel/net/netfilter/ipvs/ip_vs_lc.ko

kernel/net/netfilter/ipvs/ip_vs_wlc.ko

kernel/net/netfilter/ipvs/ip_vs_lblc.ko

kernel/net/netfilter/ipvs/ip_vs_lblcr.ko

kernel/net/netfilter/ipvs/ip_vs_dh.ko

kernel/net/netfilter/ipvs/ip_vs_sh.ko

kernel/net/netfilter/ipvs/ip_vs_sed.ko

kernel/net/netfilter/ipvs/ip_vs_nq.ko

kernel/net/netfilter/ipvs/ip_vs_ftp.ko

先到其官網上下載最新版本的源碼安裝包

安裝之前你先確認下 /usr/src/kernels/目錄是不是空的,如果是空的還要安裝這兩個東東

yum install -y kernel-devel kernel
tar -zxvf keepalived-1.2.19.tar.gz 
cd keepalived-1.2.19
./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-573.12.1.el6.i686
make && make install

安裝ipvsadm 管理軟件

yum install ipvsadm

第三步:配置keepalived

用keepalived + lvs 來實現雙機熱備和負載均衡

先對"主director server"進行配置,這里筆者貼出自己的配置文件 '/usr/local/keepalived/etc/keepalived/keepalived.conf'

#這里是全局定義部分
global_defs {
   notification_email {
    admin@laiwojia.la   #設置報警郵件地址 每行一個 可以設置多個
    boss@laiwojia.la
    cto@laiwojia.la
   }
   notification_email_from server@laiwojia.la #郵件的發送地址
   smtp_server 192.168.138.10 #smtp 地址
   smtp_connect_timeout 30 #連接smtp服務器超時的實際
   router_id LVS_DEVEL
}

vrrp 實例定義部分

vrrp_instance VI_1 { state MASTER #keepalived 的角色 MASTER 表示主機是主服務器 BACKUP表示是以備用服務器 interface eth0 #指定監測的網絡網卡 virtual_router_id 51 #虛擬路由標示 priority 100 #定義優先級 數字越大 優先級越高 MASTER的優先級必須大于BACKUP的優先級 advert_int 1 #設定主備之間檢查時間 單位s authentication { #設定驗證類型和密碼 auth_type PASS auth_pass 1111 } virtual_ipaddress { #設定虛擬IP地址 可以設置多個 每行一個 192.168.138.200 } }

虛擬服務器部分

virtual_server 192.168.138.200 80 { delay_loop 6 #設定運行情況檢查時間 單位s lb_algo rr #負載調度算法 rr即輪叫算法 lb_kind DR #設置LVS負載機制 NAT TUN DR 三種模式可選 nat_mask 255.255.255.0 persistence_timeout 0 #會話保持時間

                        #有了這個會話保持功能 用戶的請求會被一直分發到某個服務節點
                        #如果用戶在動態頁面50s內沒有任何動作,那么后面就會被分發到其他節點
                        #如果用戶一直有動作,不受50s限制

protocol TCP  #協議

#real server部分
real_server 192.168.138.3 80 {
    weight 1  #服務節點權值,數字越大,權值越高
              #權值的大小可以為不同性能的服務器分配不同的負載
              #這樣才能有效合理的利用服務器資源
    TCP_CHECK {  #狀態檢查部分    
      connect_timeout 3 #3s無響應超時                                                     
      nb_get_retry 3  #重試次數
      delay_before_retry 3   #重試間隔
      connect_port 80 #連接端口                                                    
    }  
}

#real server部分
real_server 192.168.138.4 80 {
    weight 1  #服務節點權值,數字越大,權值越高
              #權值的大小可以為不同性能的服務器分配不同的負載
              #這樣才能有效合理的利用服務器資源
    TCP_CHECK {  #狀態檢查部分    
      connect_timeout 3 #3s無響應超時                                                     
      nb_get_retry 3  #重試次數
      delay_before_retry 3   #重試間隔
      connect_port 80 #連接端口                                                    
    }  
}

}</pre>

然后筆者再貼出備分主機的配置

#這里是全局定義部分
global_defs {
   notification_email {
    admin@laiwojia.la   #設置報警郵件地址 每行一個 可以設置多個
    boss@laiwojia.la
    cto@laiwojia.la
   }
   notification_email_from server@laiwojia.la #郵件的發送地址
   smtp_server 192.168.138.10 #smtp 地址
   smtp_connect_timeout 30 #連接smtp服務器超時的實際
   router_id LVS_DEVEL
}

vrrp 實例定義部分

vrrp_instance VI_1 { state BACKUP #keepalived 的角色 MASTER 表示主機是主服務器 BACKUP表示是以備用服務器 interface eth0 #指定監測的網絡網卡 virtual_router_id 51 #虛擬路由標示 priority 80 #定義優先級 數字越大 優先級越高 MASTER的優先級必須大于BACKUP的優先級 advert_int 1 #設定主備之間檢查時間 單位s authentication { #設定驗證類型和密碼 auth_type PASS auth_pass 1111 } virtual_ipaddress { #設定虛擬IP地址 可以設置多個 每行一個 192.168.138.200 } }

虛擬服務器部分

virtual_server 192.168.138.200 80 { delay_loop 6 #設定運行情況檢查時間 單位s lb_algo rr #負載調度算法 rr即輪叫算法 lb_kind DR #設置LVS負載機制 NAT TUN DR 三種模式可選 nat_mask 255.255.255.0 persistence_timeout 0 #會話保持時間

                        #有了這個會話保持功能 用戶的請求會被一直分發到某個服務節點
                        #如果用戶在動態頁面50s內沒有任何動作,那么后面就會被分發到其他節點
                        #如果用戶一直有動作,不受50s限制

protocol TCP  #協議

#real server部分
real_server 192.168.138.3 80 {
    weight 1  #服務節點權值,數字越大,權值越高
              #權值的大小可以為不同性能的服務器分配不同的負載
              #這樣才能有效合理的利用服務器資源
    TCP_CHECK {  #狀態檢查部分    
      connect_timeout 3 #3s無響應超時                                                     
      nb_get_retry 3  #重試次數
      delay_before_retry 3   #重試間隔
      connect_port 80 #連接端口                                                    
    }  
}

#real server部分
real_server 192.168.138.4 80 {
    weight 1  #服務節點權值,數字越大,權值越高
              #權值的大小可以為不同性能的服務器分配不同的負載
              #這樣才能有效合理的利用服務器資源
    TCP_CHECK {  #狀態檢查部分    
      connect_timeout 3 #3s無響應超時                                                     
      nb_get_retry 3  #重試次數
      delay_before_retry 3   #重試間隔
      connect_port 80 #連接端口                                                    
    }  
}

}</pre>

整完了之后要把'/usr/local/keepalived/etc/rc.d/init.d/keepalived'復制到'/etc/rc.d/init.d/'目錄下

吧'/usr/local/keepalived/etc/sysconfig/keepalived' 復制到'/etc/sysconfig/'目錄下

把'/usr/local/keepalived/sbin/keepalived' 復制到'/sbin/'目錄下

把'/usr/local/keepalived/etc/keepalived/keepalived.conf'復制到'/etc/keepalived/'目錄下

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/rc.d/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/
cp  /usr/local/keepalived/sbin/keepalived /sbin/
mkdir -p /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf  /etc/keepalived/

由于keepalived日志文件放在'/var/log/message'下,該文件還有其他東西的日志不便于閱讀,這里筆者為其指定單獨的位置 '/usr/local/keepalived/logs/keepalived.log'

先要修改 '/etc/sysconfig/keepalived' 文件,在最后一行 KEEPALIVED_OPTIONS="-D" 換成 KEEPALIVED_OPTIONS="-D -d -S 0" (筆者算是醉了,尼瑪軟件開發者難道不能給個參數指定日志文件路徑嗎),然后在/etc/rsyslog.conf 后面加上一句

#keepalived -S 0 
local0.*                                                /usr/local/keepalived/logs/keepalived.log

然后建立日志目錄

mkdir -p /usr/local/keepalived/logs

然后重新啟動系統日志

/etc/init.d/rsyslog restart

然后我們啟動 主備 keepalived 和 服務節點的lvsrs

service keepalived start
service lvsrs start

然后我們啟動 real server 的nginx

/usr/local/nginx/sbin/nginx

第四步:測試

首先我們來測試負載均衡部分,筆者這里整個腳本 test.sh

#!/bin/bash

if [ ! -f "/root/backup/test.txt" ] then touch /root/backup/test.txt fi

for((i=0;i<10;i++)) do curl http://192.168.138.200 >> /root/backup/test.txt sleep 1 done</pre>

然后運行之

./test.sh

然后我們到 主director server 上面瞅瞅

ipvsadm

然后出現下面這個結果

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.138.200:http rr

-> 192.168.138.3:http Route 1 0 5

-> 192.168.138.4:http Route 1 0 5

就對了,每個都被分發了5次

當然,你不放心可以查看'/root/backup/test.txt'文件,看看里面的內容是否都是循環的列出的(筆者這里兩個首頁內容略有不同以便于區分)

接著我們將real server 某臺nginx停掉,看看效果

/usr/local/nginx/sbin/nginx -s stop

我們來看看master的日志

cat /usr/local/keepalived/keepalived.log

Feb 3 18:01:46 localhost Keepalived_healthcheckers[706]: TCP connection to [192.168.138.3]:80 failed !!!

Feb 3 18:01:46 localhost Keepalived_healthcheckers[706]: Removing service [192.168.138.3]:80 from VS [192.168.138.200]:80

Feb 3 18:01:46 localhost Keepalived_healthcheckers[706]: SMTP connection ERROR to [192.168.138.10]:25.

</div>

瞅著了吧先是連接不上192.168.138.3,然后從列表中移除,然后發送預警郵件(筆者這里郵件瞎配的所以連接不上SMTP服務器)

當然你也可以訪問下頁面,再也看不到192.168.138.4 了

最后我們來驗證雙機熱備部分

我們把master keepalived 服務停掉

service  keepalived stop

然后我們查看下backup的日志

Feb 3 18:05:06 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) Transition to MASTER STATE

Feb 3 18:05:07 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) Entering MASTER STATE

Feb 3 18:05:07 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) setting protocol VIPs.

Feb 3 18:05:07 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.138.200

Feb 3 18:05:07 localhost Keepalived_healthcheckers[5548]: Netlink reflector reports IP 192.168.138.200 added

Feb 3 18:05:12 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.138.200

可以看到backup director 自動變為MASTER , 我們可以訪問下 192.168.138.200

OK,然后我們再次啟動MASTER

service keepalived start

再看看BACKUP的日志文件

b 3 18:08:09 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) Received higher prio advert

Feb 3 18:08:09 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) Entering BACKUP STATE

Feb 3 18:08:09 localhost Keepalived_vrrp[5549]: VRRP_Instance(VI_1) removing protocol VIPs.

Feb 3 18:08:09 localhost Keepalived_healthcheckers[5548]: Netlink reflector reports IP 192.168.138.200 removed

自動切換回BACKUP

OK,自此,筆者所說的雙機熱備+負載均衡+實效轉移 實現高可用、高性能、高伸縮性能的服務集群已經搭建完成,希望能應用到讀者日常工作中

</div>

 本文由用戶 JaniceGil 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!