10W qps 網關接入層,LVS-Keepalived-DR 模式- 如何搭建?

說在前面

最近有小夥伴拿到了一線互聯網企業如京東、網易、微博、阿里、汽車之家、極兔、有贊、希音、百度、滴滴的架構師,遇到一些很重要的面試題:

  • 你的項目達到 10Wqps,這麼高的吞吐量,你是怎麼實現的?

此文,40 歲老架構師尼恩,結合《10Wqps Netty API 網關架構與實操》 的業務場景,給大家提供一份比較全面的參考答案。使得大家可以充分展示一下大家雄厚的 “技術肌肉”,讓你的面試官愛到 “不能自已、口水直流”

本文目錄

- 說在前面

- 背景

- 接入層的架構目標

- 什麼是 LVS:

  - LVS 工作模式 (三種)

    - NAT 基於網絡地址轉換

    - TUN ip 隧道模式

    - DR 直接路由模式

- 高併發負載均衡—LVS DR

  - LVS DR(Direct Routing)

  - DR 拓補圖

  - DR 數據包流向分析

  - 問題一:IP 地址衝突

  - 問題二:第二次再有訪問請求

  - 配置重點

- lvs 實操

  - 配置負載調度器

  - 第一臺 Web 節點服務器

  - 基礎知識:LINUX 中的 lo(迴環接口)

  - 第二臺 Web 節點服務器

  - 客戶機測試(192.168.61.55)

- 故障隔離:LVS 實現健康性檢查 Ldirectord 使用

  - ldirectord

  - Idirectord 軟件和配置文件說明:

- 失敗切換:keepalived+LVS 實現高可用性集羣

  - keepalived+LVS-DR 實現高可用

  - keepalive 故障自動切換

  - 搶佔與非搶佔

  - keepalive+LVS

  - LVS 集中節點的健康檢查

  - 部署 LVS + keeplived 高可用集羣

    - 1)部署 DR 模式的負載均衡集羣

    - 2)配置 web 服務器

    - 3)添加路由

    - 4)配置 keepalived

    - 5)編譯安裝

      - 使用 yum 的方式直接安裝 keepalived

    - 6)修改 keepalived 配置文件

      - 修改完配置文件後重啓 keeplived 使其生效

    - 7)配置 backup 備份

- 說在最後:有問題可以找老架構取經

- 參考文獻

- 尼恩技術聖經系列 PDF

背景

在互聯網的中型項目中,單服務器往往已經無法滿足業務本身的性能要求,尼恩正在爲大家梳理 10Wqps Netty API 網關架構與實操。

第一個問題是,如何支撐 10Wqps?

第二個問題是,如何高可用的支持 10Wqps?

《10Wqps Netty API 網關架構與實操》 的總體架構圖如下:

10Wqps Netty API 網關網絡拓撲架構:

方案 1 基於 ECS/IDC 機房的手動擴容網絡拓撲架構,核心如下:

方案 2 基於 ECS/IDC 機房 + K8S 雲原生自伸縮自擴容網絡拓撲架構,將在此基礎上,結合尼恩的硬核視頻進行介紹。

不論方案 1、方案 2, 在接入層,都需要進行 10Wqps 網關接入層的架構設計。

這裏尼恩特別說一下,爲啥要用 lvs,因爲一個 nginx 扛不住 10Wqps,這個尼恩的在視頻裏邊,是做過了實操演示的。

接入層的架構目標

接入層集羣架構目標,包括如下三點:高可用、可擴展、負載均衡。

一個完整的集羣架構,則需要包含如下三個功能:負載均衡、故障隔離、失敗切換

什麼是 LVS:

  1. 高伸縮性, 高可用的服務;

  2. 已被集成到 Linux 中;

  3. 整體架構和 Nginx 相似, 也是集羣;

lvs 基於四層,處理能力是 Nginx 的幾十倍,負載能力更高。lvs 可以只接受不響應,nginx 接收並相應

思考: LVS 和 Nginx 很像,爲什麼還要使用 LVS?

  1. LVS 基於四層, 工作效率高

  2. LVS 基於四層,請求接收到直接轉發

  3. Nginx 接收到請求後,還需要對請求做一定處理 (會有一定性能損耗)

  4. 假如 Nginx 能支持的併發能達到幾萬,那麼 LVS 能支持的負載可以達到 Nginx 的幾十倍

  5. 單個 Nginx 承受不了壓力, 需要集羣

  6. 當使用 Nginx 集羣的時候,Nginx 前置的調度者不能再由 Nginx 充當了,因爲這樣還是相當於 Nginx 承擔了所有的壓力,所以我們用 LVS 充當 Nginx 集羣前置調度者;

  7. 備註: LVS+Nginx 相當於 LVS 就是 Nginx,Nginx 就是上游服務器;

  8. Nginx 接收請求來回, LVS 可以只接受不響應; 所以 LVS 的負載能力肯定比 Nginx 高;

補充一下名稱:

LVS 是 Linux Virtual Linux 的縮寫,即 Linux 虛擬服務器,是一個常用的服務器集羣系統,該功能已經廣泛集成在 Linux 內核中。

Keepalived 則是一個服務器檢測狀態軟件,能夠爲集羣提供故障隔離和失敗切換功能

ipvsadm 則是 LVS 的管理工具,能夠添加,修改,刪除,查看當前集羣的配置和轉發狀態等。在使用 Keepalived 的方案中,只要系統安裝有 ipvsadm 命令,只需要通過 Keepalived 的配置文件即可實現集羣的所有配置。

LVS 工作模式 (三種)

NAT 基於網絡地址轉換

(這種模式是和 Nginx 模式類似,不適用超大併發場景)

TUN  ip 隧道模式

條件限制: 所有的計算機節點都必須要有網卡, RealServer 向客戶端響應不用經過 LVS, 而是通過網卡之間建立一種 " 隧道 ",通信就通過這種隧道的方式;

優點: 請求上行 (客戶端 - 服務器) 沒啥變化,下行(realserver - 客戶端) 大大優化;大大提高吞吐量和併發能力;

缺點: 需要每一個計算機節點都配置一個網卡, RealServerl 暴露在公網 (不好)

DR  直接路由模式

(解決  Real Server 暴露在公網問題)

高併發負載均衡—LVS DR

LVS-DR(Linux Virtual Server Director Server)工作模式 ,是生產環境中最常用的一 種工作模式。

爲了響應對整個羣集的訪問,Director Server 與 Real Server 都需要配置 VIP 地址。

客戶機發起請求,經過調度服務器(lvs),經過算法調度,去訪問真實服務器(RS)

由於不原路返回,客戶機不知道,真實主機的 ip 地址,

所以只能通過調度服務器的外網 ip(vip)去反回報文信息。

LVS DR(Direct Routing)

D0iipf

DR 拓補圖

DR 拓撲圖

DR 數據包流向分析

(1) 客戶端 發送請求到 Director Server, 請求的數據報文(源 IP 是 CIP, 目標 IP 是 VIP) 到達內核空間。

(2) Director Server 和 Real Server 在同一個網絡中,數據通過二層數據鏈路層來傳輸。

(3) 內核空間判斷數據包的目標 IP 是本機 VIP,此時 IPVS 比對數據包請求的服務是否是集羣服務,是集羣服務就重新封裝數據包。修改源 MAC 地址爲 Director Server 的 MAC 地址,修改目標 MAC 地址爲 Real Server 的 MAC 地址,源 IP 地址與目標 IP 地址沒有改變 (源 IP 是 CIP, 目標 IP 是 VIP),然後將數據包發送給 Real Server。

(4) 到達 Real Server 的請求報文的 MAC 地址是自身的 MAC 地址,就接收此報文。

(5) 響應的時候,數據包重新封裝報文 (源 IP 地址爲 VIP,目標 IP 爲 CIP),將響應報文通過 lo 接口傳送給物理 網卡然後向外發出。Real Server 直接將響應報文傳送到客戶端。

問題一:IP 地址衝突

在 LVS-DR 負載均衡集羣中,負載均衡器 DS 與節點服務器 RS 都要配置相同的 VIP 地址,在局域網中具有相同的 IP 地址。勢必會造成各服務器 ARP 通信的紊亂

解決思路:

路由器發送 ARP 請求(廣播)

ARP----> 廣播去找 ip 地址解析成 mac 地址, 默認使用 DR 調度服務器上的外網地址(vip 地址)響應,

需要在真實服務器上修改內核參數,使真實服務器只對自己服務器上的真實 IP 地址響應 ARP 解析。

解決方法:

對 RS 節點服務器進行處理,使其不響應針對 VIP 的 ARP 請求。

策略是要配置環回接口、修改內核參數。

用虛接口 lo:0 承載 VIP 地址。設置內核參數 arp_ ignore=1: 系統只響應目的 IP 爲本地 IP 的 ARP 請求

內核參數 arp_ignore 的作用:定義接收到 ARP 請求時的相應級別

兩個級別:

  1. 只要本地有相應地址就給予響應

  2. 僅在請求的目標 (MAC) 地址配置請求到達接口才給予響應

問題二:第二次再有訪問請求

RealServer 返回報文(源 IP 是 VIP)經路由器轉發,重新封裝報文時,需要先獲取路由器的 MAC 地址,發送 ARP 請求時,Linux 默認使用 IP 包的源 IP 地址(即 VIP)作爲 ARP 請求包中的源 IP 地址,而不使用發送接口的 IP 地址,路由器收到 ARP 請求後,將更新 ARP 表項,原有的 VIP 對應 Director 的 MAC 地址會被更新爲 VIP 對應 RealServer 的 MAC 地址。路由器根據 ARP 表項,會將新來的請求報文轉發給 RealServer,導致 Director 的 VIP 失效

解決方法:

對 RS 節點服務器進行處理,設置內核參數 arp_announce=2:系統不使用 IP 包的源地址來設置 ARP 請求的源地址,而選擇 DR 發送接口的 IP 地址

路由器上綁定了 真實服務器 1 的 mac 信息,

#請求到達真實服務器

在真實服務器上修改內核參數

只對所有服務器真實網卡上的地址進行反饋,解析

內核參數 arp_announce:定義將自己的地址向外通告的級別

  1. 將本地任何接口上的地址向外通告

  2. 試圖僅向目標網絡通告與其網絡匹配的地址

  3. 僅向與本地接口上地址匹配的網絡進行通告

配置重點

將 server 的 VIP 配置爲對外隱藏,對內可見。

  1. arp_ignore=1

防止網關路由發送 ARP 廣播時調度調節器和節點服務器都進行響應,導致 ARP 緩存表紊亂,不對非本地物理網卡的 ARP 請求進行響應,因爲 vip 時,承載 lo:0

  1. arp_announce=2

系統不使用響應數據的源 IP 地址(VIP)來作爲本機進行 ARP 請求報文的源 IP 地址,而使用發送報文的物理網卡 IP 地址作爲 ARP 請求報文的源 IP 地址,這樣可以防止網關路由器接收到的源 IP 地址爲 VIP 的 ARP 請求報文後又更新 ARP 緩存表,導致外網再發送請求時,數據包到達不了調度器

lvs 實操

pqk0Ww

配置負載調度器

192.168.61.44 虛擬 vip:192.168.61.45

   1. #關閉防火牆
      systemctl stop firewalld.service
      setenforce 0
   2. #安裝ipvsadm工具
      yum install ipvsadm.x86_64 -y
   3. #配置虛擬IP地址(VIP:192.168.61.44)
      cd /etc/sysconfig/network-scripts/
      cp ifcfg-ens33 ifcfg-ens33:0
      vim ifcfg-ens33:0
      #刪除UUID,dns與網關,注意子網
      NAME=ens33:0
      DEVICE=ens33:0
      IPADDR=192.168.61.45
      NETMASK=255.255.255.255
   4. #重啓網絡服務、啓動網卡
      systemctl restart network
      ifup ifcfg-ens33:0
   5. #調整/proc響應參數   
      #對於 DR 羣集模式來說,由於 LVS 負載調度器和各節點需要共用 VIP 地址,應該關閉 Linux 內核的重定向參數響應服務器不是一臺路由器,那麼它不會發送重定向,所以可以關閉該功能
      vi /etc/sysctl.conf
      net.ipv4.ip_forward = 0
      net.ipv4.conf.all.send_redirects = 0
      net.ipv4.conf.default.send_redirects = 0
      net.ipv4.conf.ens33.send_redirects = 0
   6. #刷新配置
      sysctl -p
   7. #加載模塊
      modprobe ip_vs
      cat /proc/net/ip_vs
   8. #配置負載分配策略,並啓動服務
      ipvsadm-save >/etc/sysconfig/ipvsadm
      systemctl start ipvsadm.service
   9. #清空ipvsadm,並做策略
      ##添加真實服務器-a  指定VIP地址及TCP端口-t   指定RIP地址及TCP端口 -r 指定DR模式-g
      ipvsadm -C
      ipvsadm -A -t 192.168.61.45:80 -s rr
      ipvsadm -a -t 192.168.61.45:80 -r 192.168.61.22:80 -g
      ipvsadm -a -t 192.168.61.45:80 -r 192.168.61.33:80 -g
   10. #保存設置
       ipvsadm
       ipvsadm -ln
       ipvsadm-save >/etc/sysconfig/ipvsadm

關閉防火牆

安裝 ipvsadm 工具

配置虛擬 IP 地址(VIP:192.168.61.45)

重啓網絡服務、啓動網卡

調整 / proc 響應參數

刷新配置

加載模塊

配置負載分配策略,並啓動服務

清空 ipvsadm,並做策略

保存設置

第一臺 Web 節點服務器

192.168.61.22

1. #關閉防火牆
systemctl stop firewalld.service
setenforce 0
 
2. #安裝httpd、開啓服務
yum install httpd -y
systemctl start httpd
 
3. #創建一個站點文件
vim /var/www/html/index.html
this is 192.168.61.22
 
3. #添加回環網卡,修改迴環網卡名,IP地址,子網掩碼
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.61.45
NETMASK=255.255.255.255
NETWORK=127.0.0.0
 
systemctl restart network
 
 
4. #設置路由
route add -host 192.168.61.45 dev lo:0
route -n
 
5. #開機執行命令
vim /etc/rc.d/rc.local 
/usr/sbin/route add -host 192.168.61.45 dev lo:0
 
chmod +x /etc/rc.d/rc.local
 
6. #調整 proc 響應參數
#添加系統只響應目的IP爲本地IP的ARP請求
#系統不使用原地址來設置ARP請求的源地址,而是物理mac地址上的IP
vim /etc/sysctl.conf
 
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
 
sysctl -p

關閉防火牆

安裝 httpd、開啓服務

創建一個站點文件

添加回環網卡, 修改迴環網卡名,IP 地址,子網掩碼

設置路由

開機執行命令

調整 proc 響應參數

基礎知識:LINUX 中的 lo(迴環接口)

上面的配置,添加回環網卡, 修改迴環網卡名,IP 地址,子網掩碼

cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.61.45
NETMASK=255.255.255.255
NETWORK=127.0.0.0

什麼是 LO 接口?

在 LINUX 系統中,除了網絡接口 eth0,還可以有別的接口,比如 lo(本地環路接口)。

LO 接口的作用是什麼?假如包是由一個本地進程爲另一個本地進程產生的, 它們將通過外出鏈的’lo’接口, 然後返回進入鏈的’lo’接口.

網絡接口的命名

這裏並不存在一定的命名規範,但網絡接口名字的定義一般都是要有意義的。例如:

網絡接口如何工作

網絡接口是用來發送和接受數據包的基本設備。

系統中的所有網絡接口組成一個鏈狀結構,應用層程序使用時按名稱調用。

每個網絡接口在 linux 系統中對應於一個 struct net_device 結構體,包含 name,mac,mask,mtu… 信息。

每個硬件網卡 (一個 MAC) 對應一個網絡接口,其工作完全由相應的驅動程序控制。

虛擬網絡接口

虛擬網絡接口的應用範圍非常廣泛。最着名的當屬 “lo” 了,基本上每個 linux 系統都有這個接口。

虛擬網絡接口並不真實地從外界接收和發送數據包,而是在系統內部接收和發送數據包,因此虛擬網絡接口不需要驅動程序。

虛擬網絡接口和真實存在的網絡接口在使用上是一致的。

網絡接口的創建

硬件網卡的網絡接口由驅動程序創建。而虛擬的網絡接口由系統創建或通過應用層程序創建。

驅動中創建網絡接口的函數是:

這兩個函數的區別是:register_netdev(…) 會自動生成以”eth” 作爲打頭名稱的接口,而 register_netdevice(…) 需要提前指定接口名稱.

事實上,register_netdev(…) 也是通過調用 register_netdevice(…) 實現的。

第二臺 Web 節點服務器

192.168.61.33

1. #關閉防火牆
systemctl stop firewalld.service
setenforce 0
 
2. #安裝httpd、開啓服務
yum install httpd -y
systemctl start httpd
 
3. #創建一個站點文件
vim /var/www/html/index.html
this is 192.168.61.33
 
3. #添加回環網卡,修改迴環網卡名,IP地址,子網掩碼
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.61.45
NETMASK=255.255.255.255
NETWORK=127.0.0.0
 
systemctl restart network
 
 
4. #設置路由
route add -host 192.168.59.188 dev lo:0
route -n
 
5. #開機執行命令
vim /etc/rc.d/rc.local 
/usr/sbin/route add -host 192.168.59.188 dev lo:0
 
chmod +x /etc/rc.d/rc.local
 
6. #調整 proc 響應參數
#添加系統只響應目的IP爲本地IP的ARP請求
#系統不使用原地址來設置ARP請求的源地址,而是物理mac地址上的IP
vim /etc/sysctl.conf
 
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
 
sysctl -p

關閉防火牆

安裝 httpd、開啓服務

創建一個站點文件

添加回環網卡, 修改迴環網卡名,IP 地址,子網掩碼

設置路由

開機執行命令

調整 proc 響應參數

客戶機測試(192.168.61.55)

故障隔離:LVS 實現健康性檢查 Ldirectord 使用

獨立的 lvs 並不具備對後端服務器執行健康檢查的機制,這時通常需要配合第三方的工具來一起使用。

而 ldirectord 的作用就是用來監測 Real Server,當 Real Server 失效時,把它從虛擬服務器列表中刪除,恢復時重新添加到列表。

  1. LVS 不可用,整個系統將不可用;SPoF Single Point of Failure

解決方案:高可用

keepalived heartbeat/corosync

  1. RS 不可用時,Director 依然會調度請求至此 RS

解決方案:由 Director 對各 RS 健康狀態進行檢查,失敗時禁用,成功時啓用

keepalived  heartbeat/corosync   ldirectord

檢測方式

(a) 網絡層檢測,icmp

(b) 傳輸層檢測,端口探測

(c) 應用層檢測,請求某關鍵資源

RS 全不用時:backup server, sorry server

ldirectord

ldirectord 是一個守護進程,用於監視和管理負載平衡虛擬服務器的 LVS 集羣中的真實服務器。

ldirectord 通常用作 Linux HA 的資源,但也可以從命令行運行。

使用 ldirectord 程序,這個程序在啓動時自動建立 IPVS 表,然後監視集羣節點的健康情況,在發現失效節點時將其自動從 IPVS 表中移除

ldirectord 守護進程通過向每臺真實服務器真實 IP(RIP)上的集羣資源發送訪問請求來實現對真實服務器的監控,這對所有類型的 LVS 集羣都是成立的:LVS-DR,LVS-NAT 和 LVS-TUN。

正常情況下,爲每個 Director 上的 VIP 地址運行一個 ldirectord 守護進程,當真實服務器不響應運行在 Director 上的 ldirectord 守護進程時,ldirectord 守護進程運行適當的 ipvsadm 命令將 VIP 地址從 IPVS 表中移除。(以後,當真實服務器回到在線狀態時,ldirectord 使用適當的 ipvsadm 命令將真實服務器重新添加到 IPVS 表中)

另外,Ldirectord 也可以通過定期請求已知的 URL,並檢查響應是否包含預期的響應,來監視實際服務器的運行狀況。如果一個真正的服務器出現故障,那麼該服務器將被刪除,並在重新聯機後重新激活。

如果所有真正的服務器都關閉了,那麼會在池中插入一個回退服務器,這將使一個靜態的真正的 Web 服務器重新聯機。通常,回退服務器是本地主機。如果正在提供 HTTP 虛擬服務,那麼運行一個 ApacheHTTP 服務器是很有用的,該服務器返回一個頁面,指示該服務暫時不可訪問。

Idirectord 軟件和配置文件說明:

包名:ldirectord-3.9.6-0rc1.1.1.x86_64.rpm
下載:http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/x86_64/
安裝:yum install ldirectord-3.9.6-0rc1.1.2.x86_64.rpm -y  (需要epel源中的Perl)
 
文件:
    /etc/ha.d/ldirectord.cf 主配置文件
    /usr/share/doc/ldirectord-3.9.6/ldirectord.cf 配置模版
    /usr/lib/systemd/system/ldirectord.service 服務
    /usr/sbin/ldirectord 主程序,Perl實現
    /var/log/ldirectord.log 日誌
    /var/run/ldirectord.ldirectord.pid pid文件
 
 
Ldirectord配置文件說明
checktimeout=20           #判定real server出錯的時間間隔。
checkinterval=10          #指定ldirectord在兩次檢查之間的間隔時間。
fallback=127.0.0.1:80     #當所有的real server節點不能工作時,web服務重定向的地址。
autoreload=yes            #是否自動重載配置文件,選yes時,配置文件發生變化,自動載入配置信息。
logfile="/var/log/ldirectord.log"   #設定ldirectord日誌輸出文件路徑。
logfile="local0"            #rsyslog方式定義日誌輸出。
 
quiescent=no                        #當RS服務down時狀態時, yes權重設爲0,no爲刪除RS服務器。
當選擇no時,如果一個節點在checktimeout設置的時間週期內沒有響應,ldirectord將會從LVS的路由表中直接移除real server,此時,將中斷現有的客戶端連接,並使LVS丟掉所有的連接跟蹤記錄和持續連接模板,
如果選擇爲yes,當某個real server失效時,ldirectord將失效節點的權值設置爲0,新的連接將不能到達,但是並不從LVS路由表中清除此節點,同時,連接跟蹤記錄和程 序連接模板仍然保留在Director上。
virtual=5               #指定虛擬的IP地址和端口號,FWM(標籤)或 IP:PORT
virtual=192.168.60.200:80           #指定虛擬的IP地址和端口號
   real=192.168.60.132:80 gate      #指定Real Server服務器地址和端口,同時設定LVS工作模式,用gate表示DR模式,ipip表示TUNL模式,masq表示NAT模式。
   real=192.168.60.144:80 gate
   fallback=127.0.0.1:80 gate       #sorry server
   service=http                     #指定服務的類型,這裏是對http服務做負載均衡。
   request="index.html"             #ldirectord將根據指定的RealServer地址,結合該選項給出的請求路徑,發送訪問請求,檢查RealServer上的服務是否正常運行,確保這裏給出的頁面地址是可訪問的,不然ldirectord會誤認爲此節點已經失效,發生錯誤監控現象。
   receive="Test Page"              #指定請求和應答字串。
   scheduler=rr                     #指定調度算法,這裏是rr(輪叫)算法。
   protocol=tcp                     #指定協議的類型,LVS支持TCP和UDP協議。
   checktype=negotiate              #指定Ldirectord的檢測類型,默認爲negotiate。
   checkport=80                     #指定監控的端口號。
   persistence=360                  #持久連接
   virtualhost=www.gaojf.com        #虛擬服務器的名稱,隨便指定

案例圖:

LVS_DR lvs 與 rs 不同網段

前期規則設置(參考: 實踐LVS的DR模式,lvs與rs不同網段)
CIP:192.168.10.50      gateway:192.168.10.60
Route: eth0(192.168.10.60)    eth0(192.168.80.60 、10.0.0.200/8 ) 啓用IP_forward的功能
LVS:DIP:192.168.80.100  gateway:192.168.80.60   VIP: 10.0.0.100/32    gateway和VIP兩個IP綁定在同一個網卡上
RS1: RIP:192.168.80.110  gateway:192.168.80.60   VIP: 10.0.0.100/32  VIP綁定在lo
RS2: RIP:192.168.80.120  gateway:192.168.80.60   VIP: 10.0.0.100/32  VIP綁定在lo
 
 
Route設置
ip a a  10.0.0.200/8 dev eth0   與80.60同一網卡上。
         
 
LVS服務器設置:
設置VIP地址  
    ip addr add  10.0.0.100/8 dev eth0
 
RS的服務器設置:
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
兩臺RS設置VIP地址
    ip addr add 10.0.0.100/8 dev lo:1
 
安裝sorry Sever服務器,和 ldirectord服務
    yum install ldirectord-3.9.6-0rc1.1.2.x86_64.rpm -y
    yum install httpd -y
    echo Sorry Server > /var/www/html/index.html
    systemctl start httpd
清空規則,複製配置文件模版
    ipvsadm -C  
    cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/
設置配置文件
Ldirectord配置文件說明
    checktimeout=3                  #檢查RS次數
    checkinterval=1                 #檢查RS時間
    autoreload=yes
    logfile=“/var/log/ldirectord.log“ #日誌文件
    #logfile="local0"                 #日誌級別
    quiescent=no                      #當RS服務down時狀態時, yes權重設爲0,no爲刪除RS服務器。
virtual=10.0.0.100:80
    real=192.168.80.110:80 gate 2       #gate指DR模型,權重爲 2
    real=192.168.80.120:80 gate 1
    fallback=127.0.0.1:80 gate          #sorry server, 當兩個RS服務器出現問題,LVS的提示。
    service=http
    scheduler=wrr
    protocol=tcp
    checktype=negotiate
    checkport=80
    request="index.html"
 
 
# systemctl restart ldirectord.service
 
 
 while true ; do curl http://10.0.0.100 ;sleep 1; done    systemectl stop httpd 測試
192.168.80.120
192.168.80.110
192.168.80.120
192.168.80.110
192.168.80.120
192.168.80.120
sorry services
sorry services

失敗切換:keepalived+LVS 實現高可用性集羣

失敗切換主 (Master) 要就是去除負載均衡器 (Director) 的單點問題,一旦負載均衡器 (Director) 發生故障,備機 (Slave) 能夠替代主 (Master) 負載均衡器 (Director) 接受用戶請求,而當主負載均衡器 (Director) 恢復正常時,能夠重新接管用戶請求(根據配置而定)

keepalived+LVS-DR 實現高可用

當 LVS 負載均衡的主服務器出現故障時,keepalived 會及時切換到備份服務器;

keepalived+LVS 實現高可用性集羣_LVS

keepalive 故障自動切換

① 兩臺 DS 同時安裝好 keepalived 並且啓動服務

當啓動的時候 master 主機獲得所有資源並且對用戶提供服務(請求)當角色 Backup 的主機作爲 master 熱備,當 master 出現故障,Backup 主機自動接管 master 主機所有工作

② 當 master 主機故障修復後,就會自動接管回它原來的所有工作,同時 Backup 主機則釋放原 master 主機的所有工作,此時兩臺主機恢復到初始角色以及工作狀態

搶佔與非搶佔

搶佔:master 恢復後,將 VIP 從 Backup 節點中搶佔過來,回覆自己 master 工作

非搶佔:master 恢復後,不搶佔 Backup 目前的狀態,Backup 升級爲 master 繼續工作

keepalive+LVS

keepalive 可以通過讀取自身的配置文件,實現通過更底層的接口直接管理,LVS 配置以及服務的啓動、停止功能,這會使 LVS 應用更加簡便

LVS 集中節點的健康檢查

Keeplived.conf 文件配置 LVS 的節點 IP 和相關參數來實現對 LVS 直接管理,如果幾個節點服務器同時發生故障無法提供服務,Keeplived 服務會自動把那個失效節點服務器從 LVS 正常轉發列中清除出去,並且將請求調度到別的正常節點服務器上,從而保證最終用戶的訪問不受影響,當故障的節點服務器修復以後,Keepalived 服務又會自動把他們加入到轉發列中,對外面客戶提供服務

部署 LVS + keeplived 高可用集羣

1)部署 DR 模式的負載均衡集羣

禁用網卡發送重定向

#0 表示禁用發送重定向,禁用發送重定向可以防止ARP欺騙和IP欺騙
vim /etc/sysctl.conf

net.ipv4.conf.all.send_redirects = 0  #所有網卡的
net.ipv4.conf.default.send_redirects = 0 #默認網卡的
net.ipv4.conf.ens33.send_redirects = 0    #ens33網卡的(根據需要修改爲真實網卡即可)
#添加完畢後,刷新內核參數使其生效
sysctl -p   #刷新內核參數

2)配置 web 服務器

修改內核文件,控制 arp 行爲

#配置內核文件,控制arp行爲

arp-ignore
# 0 只要本機配置有相應IP地址就響應;
# 1 僅在請求的目標地址配置在請求到達網絡接口上時,纔給予響應;
arp-announce
# 0 將本機任何網絡接口上的任何地址都向外通告;
# 1 儘可能避免向目標網絡通告與其網絡不匹配的地址信息表;
# 2 僅向目標網絡通告與其網絡相匹配的地址信息。
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

3)添加路由

route add -host 10.10.10.100 dev lo:0   #DR模式下,後端的真實服務器必須添加此路由,否則無法與客戶端通信

4)配置 keepalived

下載 keepalived 源碼包

https://www.keepalived.org/software/keepalived-2.0.18.tar.gz

解壓文件:

tar -zxvf [下載的包名]
#安裝相關依賴
yum install -y kernel-devel openssl-devel popt-devel gcc*

5)編譯安裝

編譯安裝後,在 / etc / 查看是否存在 keepalived 目錄,如果不存在則在解壓的源碼目錄 / root/keepalived-2.0.18/keepalived/etc/keepalived 中將 keepalived.conf 配置文件複製一份過來否則無法啓動

#在解壓後的目錄中執行編譯安裝
 ./configure --prefix=/
 make && make install  
檢查/etc/init.d/目錄下是否存在 keepalived 文件,如果不存在則在源碼的init.d文件夾中拷貝一份啓動腳本到/etc/init.d/目錄下
cp /root/keepalived-2.0.18/keepalived/etc/init.d  /etc/init.d/
#拷貝完成後設置爲開機自啓
chkconfig --add keepalived  #添加爲系統服務
chkconfig keepalived on     #設置爲開機自啓
使用 yum 的方式直接安裝 keepalived
#安裝依賴
yum install -y kernel-devel openssl-devel popt-devel gcc*
#安裝keepalived
yum install keepalived -y

6)修改 keepalived 配置文件

vim /etc/keepalived/keepalived.conf

global_defs {
   router_id LVS_MASTER   #設置自定義名稱
}

vrrp_instance VI_1 {
    state MASTER      #設置狀態主或備,根據實際情況修改
    interface eth0    #指定網卡做心跳檢測
    virtual_router_id 51    #配置虛擬組,主備lvs服務器必須在同一個組裏否則不生效
    priority 100            #優先級配置。主與從之間差距最好在50,最大設置爲150
    advert_int 1            #心跳檢測間隔爲1s
    authentication {        #配置主備之間的認證
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.10.100
        #此處填寫集羣IP地址
    }
}

#配置集羣的IP端口,算法與部署模式
virtual_server 10.10.10.100 80 {
    delay_loop 6    #檢測循環的次數以及時間
    lb_algo rr       #設置當前集羣使用的算法
    lb_kind DR      #設置當前集羣的模式  
    persistence_timeout 50    # 同一IP的連接50秒內被分配到同一臺realserver
    protocol TCP      #設置檢測使用的協議爲TCP

    #配置真實服務器的相關IP和端口信息,有幾個真實服務器就填寫幾個real_server
    real_server 10.10.10.12 80 {          
        weight 1                              #權重,最大越高,lvs就越優先訪問
        TCP_CHECK {                           #keepalived默認的健康檢查方式爲HTTP_GET,其他健康檢測方式分別是:SSL_GET | TCP_CHECK | SMTP_CHECK | MISC
            connect_timeout 3                #健康監測超時時間
            retry 3                           #重連次數3次
            delay_before_retry 3              #重連間隔時間
            connect_port 80                   #健康檢查realserver的端口
        }                                     
    }
修改完配置文件後重啓 keeplived 使其生效
service keeplived start

7)配置 backup 備份

網卡配置部分略,跟主服務器同網段 IP 即可,虛擬 IP 主備必須保持一致。在同一局域網配置相同 ip 後啓動網卡時會報錯。這是因爲網卡啓動時會通過發送 ARP 請求檢測目標 IP 地址是否與其他主機發生了衝突,所以這裏需要手動關閉 backup 服務器網卡的 arp 檢測功能。

vim /etc/sysconfig/network-scripts/ifup-eth    
 #由於不通系統版本文件存放位置不一致,此路徑爲centos7下的配置文件存放位置。其他系統需重新找到ifup-eth文件的正確位置

#在配置文件中註釋掉arp命令檢測的相關判斷,在配置文件的275行左右註釋後即可重啓網卡成功
if [ $? = 1 ]; then
   ARPINGMAC=$(echo $ARPING |  sed -ne 's/.*\[\(.*\)\].*/\1/p')
   net_log $"Error, some other host ($ARPINGMAC) already uses address ${ipaddr[$idx]}."
   exit 1
 fi

安裝 keepalived 步驟不在贅述,與 master 安裝步驟一致。

修改配置文件,將狀態設置爲 backup

! Configuration File for keepalived

global_defs {
   router_id LVS2   #修改備份服務器的名稱,不能與主服務器名稱重複
}

vrrp_instance VI_1 {     
    state BACKUP    #狀態設置爲backup或者SLAVE
    interface ens33    
    virtual_router_id 51
    priority 50    #修改優先級
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.10.10.100
    }
}
virtual_server 10.10.10.100 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    #persistence_timeout 50
    protocol TCP

    real_server 10.10.10.12 80 {
        weight 1
        TCP_CHECK{
            connect_port 80
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }

    real_server 10.10.10.13 80 {
        weight 1
        TCP_CHECK{
            connect_timeout 3
            connect_port 80
            retry 3
            delay_before_retry 3
        }
    }
}

說在最後:有問題可以找老架構取經

架構之路,充滿了坎坷

如何順利的跨過架構師的坎,化繭爲蝶,完成架構師的順利蛻變,是很多開發同學的夢寐以求的事情。

好事總是多磨。

架構和高級開發不一樣 , 架構問題是 open / 開放式的,架構問題是沒有標準答案的。

爲了完成蛻變,很多小夥伴,耗費很多精力,耗費很多金錢。

但是,遺憾的是,蛻變之路非常曲折,甚至很多同學折騰一生都沒有完成架構升級。

所以,在架構升級 / 轉型過程中,如果確實找不到有效的方案,可以來找 40 歲老架構尼恩求助、幫扶。

參考文獻

https://www.cnblogs.com/Yuanbangchen/p/16544951.html

https://blog.csdn.net/lyfqyr/article/details/125446564 

https://blog.51cto.com/zero01/1982076

https://cloud.tencent.com/developer/article/1981119

https://blog.csdn.net/Liu_Fang_Hong/article/details/131577146

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/v0WS2lr1otvMsuP0DJxjTQ