LVS + Keepalived 實現高可用、負載均衡 Web 集群

来源:http://www.cnblogs.com/wangxiaoqiangs/archive/2016/08/04/5736210.html
-Advertisement-
Play Games

簡介: LVS 是 Linux Virtual Server 的簡寫,Linux 虛擬伺服器的意思,是一個虛擬的伺服器集群系統,此項目由章文嵩博士於 1998 年 5 月成立,是中國最早出現的自由軟體項目之一。 LVS 負載均衡集群系統的優點: 1、提高吞吐量 想獲得更高的吞吐量,在 LVS 中只需 ...



簡介:

LVS 是 Linux Virtual Server 的簡寫,Linux 虛擬伺服器的意思,是一個虛擬的伺服器集群系統,此項目由章文嵩博士於 1998 年 5 月成立,是中國最早出現的自由軟體項目之一。

LVS 負載均衡集群系統的優點:

1、提高吞吐量

想獲得更高的吞吐量,在 LVS 中只需增加 Real-server 即可,其開銷只是線性增長。如選擇更換一臺更高性能的伺服器來獲得相當的吞吐量,開銷要大很多。

2、冗餘

如果 LVS 中某台 Real-server 由於需要升級或其它原因不能對外提供服務,其退出及恢復工作並不會對用戶造成服務中斷。

3、適應性

不管是需要吞吐量逐漸變化、還是快速變化,伺服器的增減對客戶都是透明的。

LVS 負載均衡集群系統的三種轉發機制:

1、Virtual Server via NAT ( VS/NAT )

VS/NAT 網路地址轉換模式,伺服器可以運行任何支持 TCP/IP 協議的操作系統,它只需要一個公網 IP 地址配置在 LVS 主機上,後端真實伺服器都可以使用私有地址。
它的缺點是擴充能力有限,當後端真實伺服器達到一定數量時,LVS 本機有可能成為集群瓶頸,因為整個集群中的客戶端請求和響應封包都要通過 LVS 負載均衡主機。

2、Virtual Server via IP Tunneling ( VS/TUN )

VS/TUN IP 隧道模式,負載均衡 LVS 主機只將請求分配到不同的真實伺服器,真實伺服器將結果直接返回給客戶端。這樣 LVS 可以處理海量的請求,而不會成為集群系統瓶頸。
並且 IP 隧道模式不限制真實伺服器位置,只要系統支持 IP 隧道協議並且網路可達就可以。多了一層 IP 隧道的開銷,且並不是所有系統都支持此協議。

3、Virtual Server via Direct Routing ( VS/DR )

VS/DR 直接路由模式,同樣 LVS 主機只處理客戶端到伺服器端的連接,響應信息由真實伺服器直接返回給客戶端。
DR 模式要求所有真實伺服器必須至少有一塊網卡與 LVS 主機在同一物理網段中,且真實伺服器網路設備或設備別名不作 ARP 響應。

Keepalived 起初是 LVS 設計的,專門用來監控集群系統中各個服務節點的狀態,後來又加入了 VRRP( 虛擬路由冗餘協議 )解決靜態路由出現的單點故障問題,
通過 VRRP 協議可以實現網路不間斷穩定運行。因此,Keepalived 不僅具有伺服器狀態檢測和故障隔離功能,還具有 HA Cluster 功能。

Keepalived 作為 LVS 的擴展項目,因此。Keepalived 可以與 LVS 無縫整合,輕鬆構建一套高性能的負載均衡集群系統。

環境描述:( CentOS 6.6_x86_64 minimal )

LVS VIP 192.168.214.50

LVS Master 192.168.214.20
LVS Backup 192.168.214.30

Real-Server-1 192.168.214.10
Real-Server-1 192.168.214.40

軟體包下載地址:

Ipvsadm http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
Keepalived http://www.keepalived.org/software/keepalived-1.2.10.tar.gz

一、安裝環境依賴包

shell > yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt-devel popt-static

二、下載、安裝 ipvsadm 、keepalived

shell > wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz

shell > tar zxf ipvsadm-1.26.tar.gz

shell > cd ipvsadm-1.26

shell > make ; make install

shell > ipvsadm -v
ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)

## 安裝還是很簡單的

shell > wget http://www.keepalived.org/software/keepalived-1.2.10.tar.gz

shell > tar zxf keepalived-1.2.10.tar.gz

shell > cd keepalived-1.2.10

shell > ./configure --sysconf=/etc --with-kernel-dir=/usr/src/kernels/2.6.32-504.23.4.el6.x86_64

## --sysconf 指定 keepalived.conf 的存放位置 --with-kernel-dir 指定使用內核源碼中的頭文件,即 include 目錄

shell > make ; make install

shell > ln -s /usr/local/sbin/keepalived /sbin/

shell > keepalived -v
Keepalived v1.2.10 (07/01,2015)

## 安裝也是蠻簡單的

三、配置 keepalived.conf

shell > vim /etc/keepalived/keepalived.conf

! 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 888
    }
    virtual_ipaddress {                              ## 虛擬 IP 地址,又稱漂移 IP 。可以通過 ip add 在 MASTER 上查看是否綁定
        192.168.214.50
    }
}

virtual_server 192.168.214.50 80 {                   ## 定義虛擬伺服器
    delay_loop 6                                     ## 定義健康檢查時間間隔,單位 秒
    lb_algo rr                                       ## 負載均衡調度演算法,支持 rr 、wrr 、lc 、wlc 、lblc 、sh 、dh 等
    lb_kind DR                                       ## LVS 負載均衡機制,支持 NAT 、TUN 、DR
    nat_mask 255.255.255.0                           ## 子網掩碼
    persistence_timeout 120                          ## 會話保持時間,單位 秒。提供動態頁面 session 保持功能,同一 IP 該值時間內被持續分配到同一臺節點伺服器上
    protocol TCP                                     ## 轉發協議類型,支持 TCP 、UDP

    real_server 192.168.214.10 80 {                  ## 定義節點伺服器
        weight 1                                     ## 節點權重值,數字越大權重越高,分配到的連接越多。主要用於後端節點伺服器性能不統一
        notify_down /etc/keepalived/real_down.sh     ## 該節點伺服器處於 DOWN 狀態後執行的腳本
        TCP_CHECK {                                  ## 健康檢測方式,支持 HTTP_GET 、SSL_GET 、TCP_CHECK 、SMTP_CHECK 、MISC_CHECK
           connect_port 80                           ## 檢測埠,不指定時預設為 real_server 指定的埠
           connect_timeout 3                         ## 無響應超時時間,單位 秒
           nb_get_retry 3                            ## 重試次數
           delay_before_retry 3                      ## 重試間隔,單位 秒
        }
    }
    real_server 192.168.214.40 80 {                  ## 第二台節點伺服器
         weight 1
         notify_down /etc/keepalived/real_down.sh
         TCP_CHECK {
         connect_port 80
         connect_timeout 3
         nb_get_retry 3
         delay_before_retry 3
         }
    }
}
shell > vim /etc/keepalived/real_down.sh

#!/bin/bash

Mail='[email protected]'

echo "Real Server State is DOWN" | mail -s "Keepalived Mail" $Mail

## 當 real server 處於 DOWN 狀態時執行的腳本,LVS 要啟動 Sendmail 、Postfix 或其它郵件服務

四、啟動 Keepalived 並加入開機啟動、配置防火牆規則

shell > /etc/init.d/keepalived start

shell > chkconfig --add keepalived

shell > chkconfig --level 35 keepalived on

shell > iptables -I INPUT 4 -p tcp --dport 80 -j ACCEPT

shell > service iptables save

## 現在使用 ip add 可以看到綁定了 VIP ,並且 /var/log/messages 日誌文件中也有關於 VIP 綁定、real server 的檢測結果

五、以上都是在 MASTER 主機的操作,下麵配置 BACKUP 主機

## 步驟一、二、四完全一樣,主要將步驟三的 keepalived.conf 中 router_id 、state 、priority 修改為 BACKUP 、BACKUP 、80 即可

## 同樣可以使用 ip add 查看 VIP 信息,不過它現在是 BACKUP 狀態,沒有綁定 VIP 為正常,通過 /var/log/messages 日誌文件可以看到處於 BACKUP 狀態。

六、配置 Real-server ,後端節點伺服器

Real-Server-1

shell > yum -y install httpd

shell > echo "welcome to Real-Server-1" > /var/www/html/index.html

shell > /etc/init.d/httpd start

shell > iptables -I INPUT -p tcp --dport 80 -j ACCEPT

Real-Server-2

shell > yum -y install httpd

shell > echo "welcome to Real-Server-2" > /var/www/html/index.html

shell > /etc/init.d/httpd start

shell > iptables -I INPUT -p tcp --dport 80 -j ACCEPT
shell > vim /etc/init.d/realserver.sh  ## Real-Server-1 / Real-Server-2 都要建立此腳本,並設為開機啟動

#!/bin/bash

VIP='192.168.214.50'

. /etc/init.d/functions

case "$1" in
  start)
    /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
    echo " LVS Real-Server Start Success"
      ;;
    stop)
     /sbin/ifconfig lo:0 down
     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 " LVS Real-Server Stop Success"
      ;;
       *)
     echo "Usage: $0 ( start | stop )"
     exit 1
esac

shell > chmod a+x /etc/init.d/realserver.sh

shell > /etc/init.d/realserver.sh start

shell > echo "/etc/init.d/realserver.sh start" >> /etc/rc.local  ## 加入開機啟動

## 此腳本用於節點伺服器綁定 VIP ,並抑制響應 VIP 的 ARP 請求。
## 這樣做的目的是為了不讓關於 VIP 的 ARP 廣播時,節點伺服器應答( 因為節點伺服器都綁定了 VIP ,如果不做設置它們會應答,就會亂套 )

七、測試

1、首先單獨測試節點伺服器能不能訪問

## 單獨訪問 192.168.214.10 192.168.214.40 ,如果可以看到頁面顯示 Welcome to Real-Server-1 和 Welcome to Real-Server-2 則節點伺服器正常

2、分別查看節點伺服器是否都綁定了 VIP

## 分別在節點伺服器上使用 ifconfig lo:0 ,如果可以看到 lo:0 虛擬網卡被綁定了 VIP 192.168.214.50 則節點伺服器正常

3、首先查看 MASTER 伺服器有沒有綁定 VIP ,狀態是不是 MASTER ,檢測後端節點伺服器是不是成功

## 使用 ip add 查看是否綁定 VIP ,tail /var/log/messages 查看伺服器狀態是不是 MASTER ,檢測節點伺服器有沒有連接成功信息:

Jul 2 17:38:44 localhost Keepalived_healthcheckers[1015]: TCP connection to [192.168.214.10]:80 success.
Jul 2 17:38:44 localhost Keepalived_healthcheckers[1015]: Adding service [192.168.214.10]:80 to VS [192.168.214.50]:80

Jul 2 17:44:01 localhost Keepalived_healthcheckers[1015]: TCP connection to [192.168.214.40]:80 success.
Jul 2 17:44:01 localhost Keepalived_healthcheckers[1015]: Adding service [192.168.214.40]:80 to VS [192.168.214.50]:80

## 伺服器狀態信息:

Jul 2 13:07:48 localhost Keepalived_vrrp[1016]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jul 2 13:07:49 localhost Keepalived_vrrp[1016]: VRRP_Instance(VI_1) Entering MASTER STATE
Jul 2 13:07:49 localhost Keepalived_vrrp[1016]: VRRP_Instance(VI_1) setting protocol VIPs.
Jul 2 13:07:49 localhost Keepalived_vrrp[1016]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.214.50
Jul 2 13:07:49 localhost Keepalived_healthcheckers[1015]: Netlink reflector reports IP 192.168.214.50 added

4、同樣查看 BACKUP 伺服器有沒有綁定 VIP ,狀態是不是 BACKUP ,檢測後端節點伺服器是不是成功

## 發現沒有綁定 VIP 為正常,狀態為 BACKUP 為正常,同樣能夠檢測到後端節點伺服器為正常,相關信息如下:

Jul 2 17:27:06 localhost Keepalived_vrrp[1017]: VRRP_Instance(VI_1) Entering BACKUP STATE
Jul 2 17:27:06 localhost Keepalived_vrrp[1017]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(11,12)]
Jul 2 17:27:06 localhost Keepalived_healthcheckers[1016]: Using LinkWatch kernel netlink reflector...

Jul 2 17:38:40 localhost Keepalived_healthcheckers[1016]: TCP connection to [192.168.214.10]:80 success.
Jul 2 17:38:40 localhost Keepalived_healthcheckers[1016]: Adding service [192.168.214.10]:80 to VS [192.168.214.50]:80

Jul 2 17:44:01 localhost Keepalived_healthcheckers[1016]: TCP connection to [192.168.214.40]:80 success.
Jul 2 17:44:01 localhost Keepalived_healthcheckers[1016]: Adding service [192.168.214.40]:80 to VS [192.168.214.50]:80

5、客戶端訪問 VIP 測試負載均衡

## 直接訪問 192.168.214.50 ,如果可以訪問到頁面證明成功。
## 當多次訪問後發現,頁面並沒有發生變化,也就是說並沒有負載均衡。
## 在 MASTER 上使用 ipvsadm -Ln 命令看到的信息如下:

shell > 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.214.50:80 rr persistent 120
  -> 192.168.214.10:80            Route   1      0          0
  -> 192.168.214.40:80            Route   1      0          87

## 發現有 87 次訪問都被分配到了 192.168.214.40 這台節點伺服器上,這正常嗎 ?
## 不要著急,這是正常的!還記得大明湖畔的夏雨荷嗎?哦不,還記得 persistence_timeout 120 這個參數嗎?
## 正因為設置了 session 保持時間,所以持續的訪問被分配到了某一臺節點伺服器。
## 現在把此參數註釋掉,測試一次( 記得重啟 keepalived )。

shell > 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.214.50:80 rr
  -> 192.168.214.10:80            Route   1      0          26
  -> 192.168.214.40:80            Route   1      0          26

## 可以看到請求被均衡的分配到了現台節點伺服器上( rr 輪詢調度演算法 ),並且頁面也在兩台節點伺服器上切換。

## 當節點伺服器宕機後會發生什麼 ?

shell > tail /var/log/messages

Jul 2 18:38:36 localhost Keepalived_healthcheckers[1636]: TCP connection to [192.168.214.40]:80 failed !!!
Jul 2 18:38:36 localhost Keepalived_healthcheckers[1636]: Removing service [192.168.214.40]:80 from VS [192.168.214.50]:80

## 檢測失敗,節點伺服器 192.168.214.40 被從 IPVS 中移除

shell > 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.214.50:80 rr
  -> 192.168.214.10:80            Route   1      0          17

## 宕機的節點伺服器被移除了

Jul 2 18:45:48 localhost Keepalived_healthcheckers[1705]: TCP connection to [192.168.214.40]:80 success.
Jul 2 18:45:48 localhost Keepalived_healthcheckers[1705]: Adding service [192.168.214.40]:80 to VS [192.168.214.50]:80

## 當節點伺服器修複後,會自動將節點伺服器加入集群中。

6、客戶端訪問 VIP 測試高可用

## 當 MASTER 伺服器無法提供服務時,VIP 會在 MASTER 上自動移除,BACKUP 伺服器會提升為 MASTER 狀態,綁定 VIP 、接管服務。
## 當 MASTER 修複加入網路後,會自動搶回 VIP ,成為 MASTER 身份。這再繁忙的網路環境中是不理想的。
## 可以通過 nopreempt 參數來設置不搶占功能,設置此參數時需要註意,必須將之前修複的 MASTER 機器狀態設為 BACKUP ,優先順序還保持最高。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 23 MySQL Performance Schema 23 MySQL Performance Schema.. 1 23.1 性能框架快速啟動... 3 23.2 性能框架配置... 5 23.2.1 性能框架編譯時配置... 5 23.2.2 性能框架啟動配置... 6 23.2.3 啟動時性 ...
  • 電腦重裝系統後如何恢復Mysql資料庫 一、【設置mysql的path】 比如:我的mysql在:D:\DataBase\mysql-5.7.13-winx64,可以在環境變數中重新新建一個環境變數Mysql_Home,變數值就是Mysql的安裝目錄 如圖: 然後,在Path的變數值添加;%Mysq ...
  • 版權聲明:筆記整理者亡命小卒熱愛自由,崇尚分享。但是本筆記源自www.jtthink.com(程式員在囧途)沈逸老師的《web級mysql顛覆實戰課程 》。如需轉載請尊重老師勞動,保留沈逸老師署名以及課程來源地址。 這幾節課沈老師先帶我們說道一下商品表。 固定商品:譬如我們只是賣鞋,那麼整個商品的屬 ...
  • 解決思想如下: 1.在grub rescue>提示符處輸入ls 即可看到該命令列出了硬碟上的所有分區,找到安裝了linux的分區,我的安裝在(hd0,msdos8)下,所以我以(hd0,msdos8)為例,msdos可以省略不寫,如(hd0,8); 2.在grub rescue>提示符處輸入set ...
  • 在Windows下,幾乎所有的硬體設備都需要安裝驅動後才能正常工作,我們重裝系統後第一件事就是要為各設備安裝好驅動,我們可以下載官方驅動手動安裝,也可以讓我Windows自動掃描安裝,還可以使用驅動精靈、電腦管家之類的工具幫我們安裝,為了發揮硬體設備最好的性能,我們還需要及時把驅動升級到最新的版本。... ...
  • 1、安裝redis (1)下載:https://github.com/phpredis/phpredis/tree/php7 或下載http://pan.baidu.com/s/1i5DFrjn用samba掛載導進去 (2)yum -y install m4 autoconf # 安裝依賴 (3)u ...
  • A機器:192.168.1.100(生產機器) B機器:192.168.1.123(管理機器) 需求:從管理機器無密碼登錄生產機器進行管理 1.在B機器下生成公鑰/私鑰對 root@B# ssh-keygen -t rsa -P '密匙管理密碼' 2.把生成的id_rsa.pub複製到A機下 roo ...
  • 1. 先進入對應文件夾: cd /etc/sysconfig/network-scripts/ 2.獲取root許可權: su 然後輸入root密碼 3.修改ifcfg-eth0 vi ifcfg-eth0 把no改為yes DEVICE=eth0HWADDR=78:24:AF:9C:D8:58TYP ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...