本章筆者親自動手,使用LVS技術實現實現一個能夠支持龐大訪問量、高可用性、高伸縮性的服務器集羣前端
在讀本章以前,可能有很多讀者還沒有使用該技術,或者部分讀者使用Nginx實現應用層的負載均衡。這裏你們均可以閱讀本章,即便部分讀者使用Nginx負載均衡,可是在大流量下性能相對於工做在鏈路層的LVS真是不能同日而語,而且LVS不只能夠實現WEB方面的負載均衡,其餘諸如數據庫、FTP、Mail等均可以實現。nginx
一般對於小型網站,不少都使用單臺服務器,頂多在弄個緩存服務器、數據庫服務器。可是一旦流量上來,單臺服務器在再害也沒法應對流量洪峯,何況若是這臺服務器掛了整個網站就算是掛了。並且你們會發現,通常都是在節假日或者作活動時流量突增,若是使用單臺性能十分高的服務器,不少時候資源都在閒置着,那麼咱們是否能在流量高峯以前加幾臺等流量過去了再減幾臺,這樣是否是省了不少money了。算法
高性能、搞可用性、高伸縮性,這些我想都是大部分IT人員日夜追尋的,筆者不才,親自手動搭建一個LVS負載均衡集羣來實現讀者的夢想。shell
首先介紹下雙機熱備,負載均衡的架構數據庫
"主director server"和"備用director server"是路由調度層,平時由"住director server"進行路由分發,"備用director server"平時做爲"主director server" 的備份,當"主director server"出現故障的時候自動切換到"備用director server"上面,當其恢復後再次切換回來,這樣主備一塊兒就實現了雙機熱備避免單點故障。緩存
當用戶訪問時,包被髮送到"主director server","主director server"根據相應規則以及服務器集羣各個節點的負載狀況將流量均衡分配給相應服務器節點。當服務器集羣中有節點出現故障時,自動將該節點踢出,待修復後再自動加入該節點。以此實現分流,下降單臺服務器壓力,同時保證整個服務器集羣的高可用性。bash
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
而後放到 '/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 #鏈接端口 } } }
而後筆者再貼出備分主機的配置
#這裏是全局定義部分 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 #鏈接端口 } } }
整完了以後要把'/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
而後運行之
./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.
瞅着了吧先是鏈接不上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,自此,筆者所說的雙機熱備+負載均衡+實效轉移 實現高可用、高性能、高伸縮性能的服務集羣已經搭建完成,但願能應用到讀者平常工做中