1. 程式人生 > >Linux下部署搭建Keepalived+LVS負載均衡實戰

Linux下部署搭建Keepalived+LVS負載均衡實戰

1.1 LVS簡介     LVS(Linux Virtual Server),也就是Linux虛擬伺服器, 是一個自由軟體專案。使用LVS技術要達到的目標是:通過LVS提供的負載均衡技術和Linux作業系統實現一個高效能、高可用的伺服器群集,它具有良好可靠性、可擴充套件性和可操作性。從而以低廉的成本實現最優的服務效能。     LVS主要用來做四層負載均衡。   1.2 Keepalived簡介     Keepalived是分散式部署系統解決系統高可用的軟體,結合LVS(Linux Virtual Server)使用,其功能類似於heartbeat,解決單機宕機的問題。     Keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。通過VRRP協議結合LVS,對組群伺服器監控情況,若master出現宕機情況,則將VIP漂移到backup機上。實現了分散式系統高可用。可以理解為:keepalived是LVS的管理軟體,根據監控情況,將宕機伺服器從ipvsadm移除掉。       Keepalived的誕生最初是為LVS ipvs(director)提供高可用性的,後來發展一個多功能、通用的輕量級高可用元件,可以為ipvs、nginx、haproxy等諸多服務提供高可用功能,主要應用在負載均衡排程器上,同時也可以檢查後端各realserver的健康狀態。   1.3 負載均衡
    四層負載均衡工作在OSI模型的傳輸層,由於在傳輸層,只有TCP/UDP協議,這兩種協議中除了包含源IP、目標IP以外,還包含源埠號及目的埠號。四層負載均衡伺服器在接受到客戶端請求後,以後通過修改資料包的地址資訊(IP+埠號)將流量轉發到應用伺服器。       七層負載均衡工作在OSI模型的應用層,應用層協議較多,常用http、radius、dns等。七層負載就可以基於這些協議來負載。這些應用層協議中會包含很多有意義的內容。比如同一個Web伺服器的負載均衡,除了根據IP加埠進行負載外,還可根據七層的URL、瀏覽器類別、語言來決定是否要進行負載均衡。       四層通過虛擬 IP + 埠接收請求,然後再分配到真實的伺服器,七層通過虛擬的 URL 或主機名接收請求,然後再分配到真實的伺服器。所謂的四到七層負載均衡,就是在對後臺的伺服器進行負載均衡時,依據四層的資訊或七層的資訊來決定怎麼樣轉發流量。   2. 搭建過程及測試
  2.1 主機配置
主機名 ip 作業系統 軟體
lvs01 10.1.28.253 7.0 lvs  keepalived 8080
lvs02 10.1.28.70 CentOS 7.0 lvs keepalived 8080
Nginxsever01 10.1.28.30 CentOS 7.0 nginx 8080
  Nginxsever01  10.1.28.40  CentOS 7.0  nginx  8080
  2.3 搭建準備 2.3.1 關閉所有機器防火牆 [[email protected] ~]#systemctl stop firewalld.service   2.3.2 關閉防selinux 關閉所有伺服器selinux,修改/etc/selinux/config,將SELINUX由enforcing設定為disabled,重啟伺服器。   2.4 ipvs安裝 LVS無需安裝,安裝的是管理工具,第一種叫ipvsadm,第二種叫keepalive。ipvsadm是通過命令列管理,而keepalive讀取配置檔案管理。 分別在lvs01和lvs02執行如下操作: [[email protected] ~]# yum -y install ipvsadm   2.4.1 把模組載入進系統 [[email protected] ~]#ipvsadm   2.5 keepalived安裝 分別在lvs01和lvs02執行如下操作: [[email protected] ~]# yum -y install keepalived   2.6 keepalived配置 ! Configuration File for keepalived   global_defs { router_id MASTER    ## keepalived 伺服器識別符號,可以隨意設定( 貌似也是全域性唯一 ) }  vrrp_instance VI_1 {     ## 定義一個名為 VI_1 的 VRRP 例項 state MASTER   ## Keepalived 伺服器角色,MASTER 為主、BACKUP 為備 interface eth0    ## 指定 HA 監測網路介面 virtual_router_id 51    ## 虛擬路由標識,同一個 VRRP 例項使用唯一的標識,主備必須一樣 priority 100    ## 節點優先順序,同一 VRRP 例項中 MASTER 的優先順序必須大於 BACKUP advert_int 1    ## MASTER / BACKUP 之間同步檢查間隔時間,單位 秒 authentication {   ## 節點之間通訊驗證型別、密碼 ,同一 VRRP 例項中,MASTER / BACKUP 必須使用相同的密碼才可以通訊 auth_type PASS auth_pass 123456 } virtual_ipaddress { ## 虛擬 IP 地址,又稱漂移 IP 。可以通過 ip add 在 MASTER 上檢視是否繫結 10.1.28.123 } } virtual_server 10.1.28.123 8080 {   ## 定義虛擬伺服器 delay_loop 6   ## 定義健康檢查時間間隔,單位 秒 lb_algo rr   ## 負載均衡排程演算法,支援 rr 、wrr 、lc 、wlc 、lblc 、sh 、dh 等 lb_kind DR   ## LVS 負載均衡機制,支援 NAT 、TUN 、DR persistence_timeout 120   ## 會話保持時間,單位 秒。提供動態頁面 session 保持功能,同一 IP 該值時間內被持續分配到同一臺節點伺服器上 protocol TCP   ## 轉發協議型別,支援 TCP 、UDP real_server 10.1.28.30 8080 { ## 定義節點伺服器 weight 1   ## 節點權重值,數字越大權重越高,分配到的連線越多。主要用於後端節點伺服器效能不統一 notify_down /etc/keepalived/real_down.sh   ## 該節點伺服器處於 DOWN 狀態後執行的指令碼 TCP_CHECK {   ## 健康檢測方式,支援 HTTP_GET 、SSL_GET 、TCP_CHECK 、SMTP_CHECK 、MISC_CHECK connect_port 8080   ## 檢測埠,不指定時預設為 real_server 指定的埠 connect_timeout 3  ## 無響應超時時間,單位 秒 nb_get_retry 3  ## 重試次數 delay_before_retry 3  ## 重試間隔,單位 秒 } } real_server 10.1.28.40 8080  { ## 第二臺節點伺服器 weight 1 notify_down /etc/keepalived/real_down.sh TCP_CHECK { connect_port 8080 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }   lvs02配置 ! Configuration File for keepalived   global_defs {    router_id lvs02 } 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 {        10.1.28.123     } } virtual_server 10.1.28.123 8080 {     delay_loop 6     lb_algo rr     lb_kind DR    # persistence_timeout 50     protocol TCP     real_server 10.1.28.30 8080 {         weight 1         TCP_CHECK{         connetct_timeout 10         retry 3         delay_before_retry 3         connetct_port 8080   } }      real_server 10.1.28.40 8080 {         weight 2         TCP_CHECK{         connetct_timeout 10         retry 3         delay_before_retry 3         connetct_port 8080   } } }   2.7 引數說明 IPVS三種IP負載均衡技術: VS/NAT: 即(Virtual Server via Network Address Translation) 也就是網路地址翻譯技術實現虛擬伺服器,當用戶請求到達排程器時,排程器將請求報文的目標地址(即虛擬IP地址)改寫成選定的Real Server地址,同時報文的目標埠也改成選定的Real Server的相應埠,最後將報文請求傳送到選定的Real Server。在伺服器端得到資料後,Real Server返回資料給使用者時,需要再次經過負載排程器將報文的源地址和源埠改成虛擬IP地址和相應埠,然後把資料傳送給使用者,完成整個負載排程過程。可以看出,在NAT方式下,使用者請求和響應報文都必須經過Director Server地址重寫,當用戶請求越來越多時,排程器的處理能力將稱為瓶頸。   VS/TUN:即(Virtual Server via IP Tunneling) 也就是IP隧道技術實現虛擬伺服器。它的連線排程和管理與VS/NAT方式一樣,只是它的報文轉發方法不同,VS/TUN方式中,排程器採用IP隧道技術將使用者請求轉發到某個Real Server,而這個Real Server將直接響應使用者的請求,不再經過前端排程器,此外,對Real Server的地域位置沒有要求,可以和Director Server位於同一個網段,也可以是獨立的一個網路。因此,在TUN方式中,排程器將只處理使用者的報文請求,集群系統的吞吐量大大提高。   VS/DR: 即(Virtual Server via Direct Routing) 也就是用直接路由技術實現虛擬伺服器。它的連線排程和管理與VS/NAT和VS/TUN中的一樣,但它的報文轉發方法又有不同,VS/DR通過改寫請求報文的MAC地址,將請求傳送到Real Server,而Real Server將響應直接返回給客戶,免去了VS/TUN中的IP隧道開銷。這種方式是三種負載排程機制中效能最高最好的,但是必須要求Director Server與Real Server都有一塊網絡卡連在同一物理網段上,且真實伺服器網路裝置或裝置別名不作 ARP 響應。   IPVS排程器實現瞭如下八種負載排程演算法: 輪叫(Round Robin) 排程器通過"輪叫"排程演算法將外部請求按順序輪流分配到叢集中的真實伺服器上,它均等地對待每一臺伺服器,而不管伺服器上實際的連線數和系統負載。   加權輪叫(Weighted Round Robin) 排程器通過"加權輪叫"排程演算法根據真實伺服器的不同處理能力來排程訪問請求。這樣可以保證處理能力強的伺服器處理更多的訪問流量。排程器可以自動問詢真實伺服器的負載情況,並動態地調整其權值。   最少連結(Least Connections) 排程器通過"最少連線"排程演算法動態地將網路請求排程到已建立的連結數最少的伺服器上。如果集群系統的真實伺服器具有相近的系統性能,採用"最小連線"排程演算法可以較好地均衡負載。   加權最少連結(Weighted Least Connections) 在集群系統中的伺服器效能差異較大的情況下,排程器採用"加權最少連結"排程演算法優化負載均衡效能,具有較高權值的伺服器將承受較大比例的活動連線負載。排程器可以自動問詢真實伺服器的負載情況,並動態地調整其權值。   基於區域性性的最少連結(Locality-Based Least Connections) "基於區域性性的最少連結" 排程演算法是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。該演算法根據請求的目標IP地址找出該目標IP地址最近使用的伺服器,若該伺服器 是可用的且沒有超載,將請求傳送到該伺服器;若伺服器不存在,或者該伺服器超載且有伺服器處於一半的工作負載,則用"最少連結"的原則選出一個可用的服務 器,將請求傳送到該伺服器。   帶複製的基於區域性性最少連結(Locality-Based Least Connections with Replication) "帶複製的基於區域性性最少連結"排程演算法也是針對目標IP地址的負載均衡,目前主要用於Cache集群系統。它與LBLC演算法的不同之處是它要維護從一個 目標IP地址到一組伺服器的對映,而LBLC演算法維護從一個目標IP地址到一臺伺服器的對映。該演算法根據請求的目標IP地址找出該目標IP地址對應的服務 器組,按"最小連線"原則從伺服器組中選出一臺伺服器,若伺服器沒有超載,將請求傳送到該伺服器,若伺服器超載;則按"最小連線"原則從這個叢集中選出一 臺伺服器,將該伺服器加入到伺服器組中,將請求傳送到該伺服器。同時,當該伺服器組有一段時間沒有被修改,將最忙的伺服器從伺服器組中刪除,以降低複製的 程度。   目標地址雜湊(Destination Hashing) "目標地址雜湊"排程演算法根據請求的目標IP地址,作為雜湊鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且未超載,將請求傳送到該伺服器,否則返回空。   源地址雜湊(Source Hashing) "源地址雜湊"排程演算法根據請求的源IP地址,作為雜湊鍵(Hash Key)從靜態分配的散列表找出對應的伺服器,若該伺服器是可用的且未超載,將請求傳送到該伺服器,否則返回空。   本例中採用DR負載均衡和wrr負載排程演算法   3. 負載均衡及高可用測試 3.1 啟動Keepalived lvs01和lvs02分別執行: [[email protected] ~]# service keepalived start 執行ip a,lvs01上有vip10.1.28.123,lvs02沒有   3.2 頁面訪問 通過不同瀏覽器訪問http://10.1.28.30:8080 3.3 Master上檢查連線情況 lvs01上執行ipvsadm -ln: 3.4 ipvsadm引數說明 ipvsadm: -L|-l(–list):顯示核心虛擬伺服器表 -n(–numeric):輸出IP 地址和埠的數字形式 輸出引數說明: Forward 轉發方式,當前是路由轉發 Weight 權重 ActiveConn 當前活躍的連線數 InActConn 當前不活躍的連線數   3.5 修改keepalived引數 通過ipvsadm命令發現訪問請求都被分配到92(nginx02)這臺伺服器,沒有實現負載均衡。這個和keepalived引數配置persistence_timeout有關,這個引數的意義是保持客戶端的請求在這個時間段內全部發到同一個真實伺服器。 分別註釋lvs01和lvs02的persistence_timeout: [[email protected] keepalived]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak [[email protected] keepalived]# view /etc/keepalived/keepalived.conf #persistence_timeout 50 重啟兩臺lvs伺服器keepalived服務: [[email protected] keepalived]# service keepalived restart 再次測試: 發現連線均勻的分配到後臺兩臺nginx伺服器。   3.5.5 lvs高可用測試 恢復keepalived配置並重啟服務。 lvs01宕機前訪問頁面: 停止lvs01的keepalived服務,模擬lvs01宕機: systemctl stop keepalived  檢視lvs02情況: 發現vip已飄至lvs02。   http://10.1.28.123:8080,訪問正常: 恢復lvs01的keepalived服務: 發現vip飄回至lvs01,vip頁面訪問正常   總結: 當 MASTER 伺服器無法提供服務時,VIP 會在 MASTER 上自動移除,BACKUP 伺服器會提升為 MASTER 狀態,繫結 VIP 、接管服務。 當 MASTER 修復加入網路後,會自動搶回 VIP ,成為 MASTER 身份。