LVS+Keepalived

LVS+Keepalived

一,**簡介**

1,**負載均衡的類型**

l 負載均衡能夠採用硬件設備(例如經常聽見的 F5),也能夠採用軟件負載html

l 商用硬件負載設備成本一般較高(一臺幾十萬甚至上百萬),因此通常 狀況下會採用軟件負載前端

l 軟件負載解決的兩個核心問題是:選誰、轉發,其中最著名的是 lvs node

2,**LVS介紹**

2.1 LVS是什麼?

l 英文全稱是 Linux Virtual Server,即 Linux 虛擬服務器linux

l 由 章 文 嵩 博 士 發 起 的 自 由 軟 件 項 目 , 它 的 官 方 站 點 是 www.linuxvirtualserver.orgnginx

l Linux2.4 內核之後,LVS 已是 Linux 標準內核的一部分web

l 能夠將請求分發給後端真實服務器處理算法

l 有許多比較著名網站和組織都在使用 LVS 架設的集羣系統,例如:Linux 的門 戶網站(www.linux.com)、向 RealPlayer 提供音頻視頻服務而聞 名的 Real 公 司(www.real.com )、全球最大的開源網站 (sourceforge.net)等數據庫

l 提供了多種調度算法vim

1) 輪詢調度(Round-Robin Scheduling)RR算法後端

2) 加權輪詢調度(Weighted Round-Robin Scheduling)WRR算法

3) 最小鏈接調度(Least-Connection Scheduling)LC算法

4) 加權最小鏈接調度(Weighted Least-Connection Scheduling)WLC算法

5) 基於局部性的最少連接(Locality-Based Least Connections Scheduling)LBLC算法

6) 帶 復 制 的 基 於 局 部 性 最 少 鏈 接 ( Locality-Based Least Connections with Replication Scheduling)LBLCR算法

7) 目標地址散列調度(Destination Hashing Scheduling)DH算法

8) 源地址散列調度(Source Hashing Scheduling)SH算法

9) 最短預期延時調度(Shortest Expected Delay Scheduling)SED算法

10) 不 排 隊 調 度 ( Never Queue Scheduling )NQ算法

l 有三種轉發規則

1) NAT:簡單理解,就是數據進出都經過 LVS,性能不是很好。

2) TUNL:簡單理解:隧道

3) DR:最高效的負載均衡規則

2.2 lvs的體系結構

l 最前端的負載均衡層,用 Load Balancer 表示

l 中間的服務器集羣層,用 Server Array 表示

l 最底端的數據共享存儲層,用 Shared Storage 表示

l 在用戶看來,全部的內部應用都是透明的,用戶只是在使用一個虛擬服 務器提供的高性能服務

 

2.3 lvs的優勢

l 抗負載能力強,由於 lvs 工做方式的邏輯是很是之簡單,並且工做在網絡 4 層僅作請求分發之用,沒有流量,因此在效率上基本不須要太過考慮。

l 有完整的雙機熱備方案,當節點出現故障時,lvs 會自動判別,因此係統總體是很是穩定的。

l 使用集羣技術和Linux操做系統實現一個高性能、高可用的服務器.

l 很好的可伸縮性(Scalability)

l 很好的可靠性(Reliability)

l 很好的可管理性(Manageability)

l 基本上能支持全部應用,由於 lvs 工做在 4 層,因此它能夠對幾乎全部應用作負載均衡,包括 http、數據庫、聊天室等等。

2.4 lvs的負載均衡機制

l lvs 是四層負載均衡,也就是說創建在 OSI 模型的第四層——傳輸層之 上

l 傳輸層上有 TCP/UDP,lvs 支持 TCP/UDP 的負載均衡

l 由於 LVS 是四層負載均衡,所以它相對於其它高層負載均衡的解決辦法, 好比 DNS 域名輪流解析、應用層負載的調度、客戶端的調度等,它的效 率是很是高的

l lvs 的轉發能夠經過修改 IP 地址實現(NAT 模式)

l lvs 的轉發還能夠經過修改直接路由實現(DR 模式)

2.5 lvs於nginx對比

l 負載度 lvs 優於 nginx

l 穩定度 lvs 優於 nginx

l 服務器性能要求 lvs 優於 nginx

l 網絡層數的效率 lvs 優於 nginx ² 網絡七層:應用層、會話層、表示層、傳輸層、網絡層、鏈路層、 物理層

l 功能多少 nginx 優於 lvs

3,**Keepalived介紹**

3.1 什麼是keepalived

keepalived是一個相似於layer3, 4 & 5交換機制的軟件,也就是咱們平時說

第3層、第4層和第5層交換。Keepalived是自動完成,不需人工干涉

3.2 簡介

Keepalived的做用是檢測服務器的狀態,若是有一臺web服務器宕機,或工

出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時

用其餘服務器代替該服務器的工做,當服務器工做正常後Keepalived自動將

務器加入到服務器羣中,這些工做所有自動完成,不須要人工干涉,須要人

作的只是修復故障的服務器

3.3 工做原理

Layer3,4,5工做在IP/TCP協議棧的IP層,TCP層,及應用層,原理分別以下:

l Layer3:Keepalived使用Layer3的方式工做式時,Keepalived會按期向服務器羣中的服務器發送一個ICMP的數據包(既咱們平時用的Ping程序),若是發現某臺服務的IP地址沒有激活,Keepalived便報告這臺服務器失效,並將它從服務器羣中剔除,這種狀況的典型例子是某臺服務器被非法關機。Layer3的方式是以服務器的IP地址是否有效做爲服務器工做正常與否的標準。

l Layer4:若是您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的狀態來決定服務器工做正常與否。如web server的服務端口通常是80,若是Keepalived檢測到80端口沒有啓動,則Keepalived將把這臺服務器從服務器羣中剔除。

l Layer5:Layer5對指定的URL執行HTTP GET。而後使用MD5算法對HTTP GET結果進行求和。若是這個總數與預期值不符,那麼測試是錯誤的,服務器將從服務器池中移除。該模塊對同一服務實施多URL獲取檢查。若是您使用承載多個應用程序服務器的服務器,則此功能頗有用。此功能使您可以檢查應用程序服務器是否正常工做。MD5摘要是使用genhash實用程序(包含在keepalived軟件包中)生成的。

l SSL_GET與HTTP_GET相同,但使用SSL鏈接到遠程Web服務器。

l MISC_CHECK:此檢查容許用戶定義的腳本做爲運行情況檢查程序運行。結果必須是0或1.該腳本在導演盒上運行,這是測試內部應用程序的理想方式。可使用完整路徑(即/path_to_script/script.sh)調用能夠不帶參數運行的腳本。那些須要參數的須要用雙引號括起來(即「/path_to_script/script.sh arg 1 … arg n」)

3.4 做用

主要用做RealServer的健康狀態檢查以及LoadBalance主機和BackUP主機之間 failover的實現

3.5 爲何使用keepalived

當咱們的服務器意外掛了以後,咱們要怎麼作?

固然是找一臺新的機器,替代現有的機器,而後作新的環境部署,端口映射, 域名解析等等一系列的工做,再將服務從新啓動;可是若是這一系列的操做都 是手動完成的,那麼等你把這些工做搞好,可能服務已經中止個把小時了,這 會兒估計運營早就提着菜刀架在你脖子上了;

可是若是使用了KeepAlived以後,而後提早將備用機準備好,當主的機器掛掉 以後,自動將VIP給你切換到備用機,而且以郵件的形式告訴你說主服務已經 掛了,你得趕忙恢復起來;這時候你就能夠慢慢的去找主服務的問題,這時候 並不會影響到你的正常業務運行。

二,**安裝**

1 環境規劃

兩臺webserver

Centos7.6 lvs keepalived 主 192.168.25.31 master

Centos7.6 lvs keepalived 備 192.168.25.32 slave

VIP地址 192.168.25.50

2 配置

2.1 修改兩臺主機名

25.31:master

25.32:slave

2.2 配置

兩臺都須要的配置

(1) 在線安裝httpd
 [root@master ~]# yum -y install httpd
(2) 設置開機自啓動
 [root@master ~]# systemctl enable httpd.service
 
 [root@master ~]# systemctl list-unit-files |grep httpd
 
 httpd.service                                 enabled
(3) 開啓http服務
 [root@master ~]# systemctl start httpd.service
(4) 經過瀏覽器訪問http服務,默認端口是80

 

 

 

(5) 建立html文件,寫入內容,區分兩個節點

Master:

 [root@master ~]# vim /var/www/html/index.html
 
 [root@master ~]# cat /var/www/html/index.html

node01 service

 

Slave:

 [root@slave ~]# vim /var/www/html/index.html
 
 [root@slave ~]# cat /var/www/html/index.html
 
 node02 service
(6) 建立腳本並寫入以下內容,而後賦予權限並啓動

在centos7裏面須要先執行安裝net_tools否則執行腳本時會報錯

 [root@slave ~]# yum -y install net-tools
 
 [root@master ~]# vim /etc/init.d/realserver
 
 \#!bin/bash
 
 SNS_VIP=192.168.25.100 #定義一個VIP變量,必須跟真實服務在一個網段
 
 source /etc/rc.d/init.d/functions
 
 case "$1" in
 
 start)
 
 echo "start lvs of realserver"
 
 /sbin/ifconfig lo:0 $SNS_VIP broadcast $SNS_VIP netmask 255.255.255.255 up #增長一個本地路由 lo:0
 
 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 Directorserver"
 
 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" >/prco/sys/net/ipv4/conf/all/arp_anounce
 
 ;;
 
 *)
 
 echo "Usage: $0 {start|stop}"
 
 exit 1
 
 esac
 
 [root@master ~]# chmod 777 /etc/init.d/realserver
 
 [root@master init.d]# service realserver start
 
 Starting realserver (via systemctl):                       [ 肯定 ]
 
 [root@master ~]# ifconfig

(7) 第二臺http也一樣作上面的步驟,增長路由,SNS_VIP要跟第一臺同樣

Master:

 [root@master init.d]# scp realserver root@192.168.25.32:/etc/init.d/

Slave:

 [root@slave init.d]# chmod 777 realserver 
 
 [root@slave init.d]# service realserver start
 
 Reloading systemd:                           [ 肯定 ]
 
 Starting realserver (via systemctl):               [ 肯定 ]
 
 [root@slave init.d]# ifconfig

(8) 查看系統內核版本,2.4之後就有lvs,不用安裝

Master:

[root@master ~]# uname -a

Linux master 3.10.0-957.27.2.el7.x86_64 #1 SMP Mon Jul 29 17:46:05 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

Slave:

[root@slave ~]# uname -a

Linux slave 3.10.0-957.27.2.el7.x86_64 #1 SMP Mon Jul 29 17:46:05 UTC 	2019 x86_64 x86_64 x86_64 GNU/Linux
(9) 在兩臺機器上安裝keepalived,作心跳檢查用的
[root@master ~]# yum -y install keepalived
(10) 備份keepalived配置文件,而後進行更改
[root@master ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

[root@master ~]# vim /etc/keepalived/keepalived.conf

global_defs {                       

#   notification_email {             

#   }

#   smtp_connect_timeout 30

​        router_id LVS_DEVEL             

}

vrrp_instance VI_1 {            

​        state MASTER   				 #指定keepalived的角色,MASTER表示此主機是主服務器,BACKUP表示此主機是備用服務器    

​        interface ens160   			 #指定HA監測網絡的接口

​        virtual_router_id 51  			 #虛擬路由標識,這個標識是一個數字,同一個vrrp實例使用惟一的標識。即同一vrrp_instance下,MASTER和BACKUP必須是一致的

​        priority 100         			 #定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級

​        advert_int 1         			 #設定MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位是       

​	authentication {      		  	 #設置驗證類型和密碼

​                auth_type PASS  		 #設置驗證類型,主要有PASS和AH兩種

​                auth_pass 1111  		 #設置驗證密碼,在同一個vrrp_instance下,MASTER與BACKUP必須使用相同的密碼才能正常通訊

​        }

​        virtual_ipaddress {         

​                192.168.25.100 			 #設置虛擬IP地址,能夠設置多個虛擬IP地址,每行一個

​        }

}

virtual_server 192.168.25.100 80 {  		 #設置虛擬服務器,須要指定虛擬IP地址和服務端口,IP與端口之間用空格隔開

​        delay_loop 6           			 #設置運行狀況檢查時間,單位是秒

​        lb_algo wrr            			 #設置負載調度算法,這裏設置爲wrr,即加權輪詢調度

​        lb_kind DR        			 #設置LVS實現負載均衡的機制,有NAT、TUN、DR三個模式可選這裏使用LVSDR模式                 

​        nat_mask 255.255.255.0   

​        persistence_timeout 0    		 #會話保持時間,單位是秒。這個選項對動態網頁是很是有用的,爲集羣系統中的session共享提供了一個很好的解決方案。

​                                		 #有了這個會話保持功能,用戶的請求會被一直分發到某個服務節點,直到超過這個會話的保持時間。

​                              			 #須要注意的是,這個會話保持時間是最大無響應超時時間,也就是說,用戶在操做動態頁面時,若是50秒內沒有執行任何操做

​                              			 #那麼接下來的操做會被分發到另外的節點,可是若是用戶一直在操做動態頁面,則不受50秒的時間限制

 

​        protocol TCP       			 #指定轉發協議類型,有TCP和UDP兩種                    

​        real_server 192.168.25.31 80 {   	 #配置服務節點1,須要指定real server的真實IP地址和端口,IP與端口之間用空格隔開

​                weight 1       			 #配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值大小能夠爲不一樣性能的服務器

​			     		    	 #分配不一樣的負載,能夠爲性能高的服務器設置較高的權值,而爲性能較低的服務器設置相對較低的權值,這樣才能合理地利用和分配系統資源

​                TCP_CHECK {                      #realserver的狀態檢測設置部分,單位是秒

​                        connect_timeout 10       #表示10秒無響應超時

​                        nb_get_retry 3           #表示重試次數

​                        delay_before_retry 3     #表示重試間隔

​                        connect_port 80

​                }

​        }

​        real_server 192.168.25.32 80 {

​                weight 2

​                TCP_CHECK {

​                        connect_timeout 10

​                        nb_get_retry 3

​                        delay_before_retry 3

​                        connect_port 80

​                }

​        }

}

 

(11) 啓動keepalived
[root@master ~]# systemctl start keepalived.service
(12) Slave修改配置文件
[root@slave ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

[root@slave ~]# vim /etc/keepalived/keepalived.conf

(在slave上只須要修改state MASTER  爲state backup和優先級低於master就行)

global_defs {                       

#   notification_email {             

#   }

#   smtp_connect_timeout 30

​        router_id LVS_DEVEL             

}

vrrp_instance VI_1 {            

​        state BACKUP   				

​        interface ens160   			

​        virtual_router_id 51  			

​        priority 90         			 

​        advert_int 1         			 

​	authentication {      		 

​                auth_type PASS  		 

​                auth_pass 1111  		 

​        }

​        virtual_ipaddress {         

​                192.168.25.100 			 

​        }

}

virtual_server 192.168.25.100 80 {  		

​        delay_loop 6           			

​        lb_algo wrr            			 

​        lb_kind DR        			 

​        nat_mask 255.255.255.0   

​        persistence_timeout 0    		 

​                                		 

​                              			 

​                              			 

 

​        protocol TCP       			 

​        real_server 192.168.25.31 80 {   	 

​                weight 1       			 

​			     		    	 

​                TCP_CHECK {                      

​                        connect_timeout 10       

​                        nb_get_retry 3         

​                        delay_before_retry 3  

​                        connect_port 80

​                }

​        }

​        real_server 192.168.25.32 80 {

​                weight 2

​                TCP_CHECK {

​                        connect_timeout 10

​                        nb_get_retry 3

​                        delay_before_retry 3

​                        connect_port 80

​                }

​        }

}

 

(13) 啓動keepalived
[root@slave ~]# systemctl start keepalived.service

三,**測試**

1. 訪問虛擬IP192.168.25.100 ,查看當前服務器提供的服務

2. 把master的http服務停掉再次訪問虛擬ip,故障移除,認爲down掉了就會自動切換到備上

[root@master ~]# systemctl stop httpd.service

3. 啓動主lvs,自動切換到優先級較高的主上

[root@master ~]# systemctl start httpd.service

4. 測試後,證實主備自動切換,lvs高可用

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息