高可用之KeepAlived(2):keepalived+lvs

来源:https://www.cnblogs.com/f-ck-need-u/archive/2018/03/02/8492298.html
-Advertisement-
Play Games

KeepAlived系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 本文目錄:1. keepalived+lvs:健康狀況檢查示例2. keepalived+lvs:高可用+健康檢查示例3. keepalived+lvs:多實例+高可用( ...


KeepAlived系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html


本文目錄:
1. keepalived+lvs:健康狀況檢查示例
2. keepalived+lvs:高可用+健康檢查示例
3. keepalived+lvs:多實例+高可用(雙主)
4. 提供sorry server和local RS

 

本文只給出幾個keepalived+lvs(VS/DR模式)的配置示例,關於keepalived的配置文件說明見:高可用之KeepAlived(一):基本概念和配置文件分析

在實驗開始前,需要說明幾點:

  1. 使用keepalived配置lvs的VS/DR模式時,vip建議綁定在別名介面上。如果VIP使用單獨的網卡,在lvs的高可用問題上就會出現問題:使用獨立網卡配置VIP的vrrp實例將總是master角色,除非它完全死機。
  2. 既然VIP要綁定在某個介面別名上,那麼VIP必須和這個介面在同一網段,否則無法正確配置VIP相關的路由。因此對於keepalived+lvs來說,VIP和rip應該設置在同一網段。除非已經考慮清楚不使用vrrp的高可用功能,這樣VIP不用綁定在網卡別名上,也就可以和rip在不同網段。
  3. 既然VIP和RIP在同一網段,那麼內網路由器上就無需設置rp_filter。

1.keepalived+lvs:健康狀況檢查示例

實驗環境如下:

RS上操作:

yum -y install httpd
echo "rs1:192.168.100.49" > /var/www/html/index.html  # RS1上操作
echo "rs1:192.168.100.50" > /var/www/html/index.html  # RS2上操作
service httpd start

echo 1 >/proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 >/proc/sys/net/ipv4/conf/all/arp_announce

ifconfig lo:0 192.168.100.10/32 up
route add -host 192.168.100.10 dev lo

route add default gw 192.168.100.51

Router上操作:

echo 1 >/proc/sys/net/ipv4/ip_forward

Director上操作:

[root@xuexi ~]# route del default
[root@xuexi ~]# route add default gw 192.168.100.51
[root@xuexi ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@xuexi ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
    }
    virtual_ipaddress {
        192.168.100.10/32 dev eth0 label eth0:0
    }
}

virtual_server 192.168.100.10 80 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        protocol TCP

        real_server 192.168.100.49 80 {
                weight 2
                TCP_CHECK {
                        connect_port 80
                        connect_timeout 1
                        nb_get_retry 2
                        delay_before_retry 1
                }
        }

        real_server 192.168.100.50 80 {
                weight 1
                TCP_CHECK {
                        connect_port 80
                        connect_timeout 1
                        nb_get_retry 2
                        delay_before_retry 1
                }
        }
}

測試是否能實現連接的負載均衡。

2.keepalived+lvs:高可用+健康檢查示例

KeepAlived通過vrrp的冗餘路由切換協議實現高可用功能,主要用於lvs Director的高可用。

在配置KeepAlived高可用功能時,需要註意以下幾點:

  1. 兩台(或多台)Director上的vrrp實例名稱要一致,vrid(virtual_router_id)要一致,認證機制以及認證密碼要一致,global定義的伺服器標識router_id不能一致。
  2. 不同機器上的優先順序priority的值不能一致。priority直接決定誰是master,誰是backup,而無論vrrp實例的state值是MASTER還是BACKUP。
  3. VIP不能使用獨立的網卡,而應該綁定在別名介面上。如果使用獨立的網卡地址作為VIP,則這個vrrp實例將總是master角色,直至它死機或者該網卡down掉。
  4. keepalived的vrrp組件不依賴於lvs,它可以獨立提供高可用服務。

實驗環境如下:

RS1、RS2、Router、director_lvs(master)和前文實驗的配置一致,不需修改。因此,只需提供director_lvs(backup)的配置文件即可。

以下是master上的操作。

[root@xuexi ~]# route del default
[root@xuexi ~]# route add default gw 192.168.100.51
[root@xuexi ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@xuexi ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_2           # 和master不同
}

vrrp_instance VI_1 {         # 和master相同
    state BACKUP             # 和master不同
    interface eth0
    virtual_router_id 51     # 和master相同
    priority 50              # 和maste不同
    advert_int 1
    authentication {
        auth_type PASS       # 和master相同
        auth_pass 12345678   # 和master相同
    }
    virtual_ipaddress {
        192.168.100.10/32 dev eth0 label eth0:0
    }
}

virtual_server 192.168.100.10 80 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        protocol TCP

        real_server 192.168.100.49 80 {
                weight 2
                TCP_CHECK {
                        connect_port 80
                        connect_timeout 1
                        nb_get_retry 2
                        delay_before_retry 1
                }
        }

        real_server 192.168.100.50 80 {
                weight 1
                TCP_CHECK {
                        connect_port 80
                        connect_timeout 1
                        nb_get_retry 2
                        delay_before_retry 1
                }
        }
}

啟動兩Director,查看是否只有master上設置了VIP。註意:ipvs規則在master和backup上都設置了,但由於backup沒有VIP,因此backup設置的ipvs規則暫時是沒有意義的。當backup切換為master狀態時,只會設置VIP。

然後查看master是否已經生效。生效後,將master斷開。觀察原來的backup切換為master的日誌:

Mar  1 20:52:19 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) Transition to MASTER STATE
Mar  1 20:52:20 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) Entering MASTER STATE
Mar  1 20:52:20 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) setting protocol VIPs.
Mar  1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar  1 20:52:20 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 192.168.100.10
Mar  1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar  1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar  1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar  1 20:52:20 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar  1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar  1 20:52:25 xuexi Keepalived_vrrp[4709]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on eth0 for 192.168.100.10
Mar  1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar  1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar  1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10
Mar  1 20:52:25 xuexi Keepalived_vrrp[4709]: Sending gratuitous ARP on eth0 for 192.168.100.10

可以看到,切換速度極快(1秒以內)。

再測試將原來的master(高優先順序)啟動,發現它再次成為master,切換速度也是極快。

將RS1上的httpd停止。再查看主、備director上的ipvs規則。

[root@xuexi ~]# 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.100.10:80 wrr
  -> 192.168.100.50:80            Route   1      0          0

發現master和backup兩邊都把不健康的RealServer1節點給踢出去了。由此可以知道,健康檢查是master和backup都會迴圈進行的,並不是只有master進行檢查。

再將RS1上的httpd啟動。然後查看ipvs規則。發現沒過幾秒鐘就把規則添加回來了。

3.keepalived+lvs:多實例+高可用(雙主)

keepalive的vrrp多實例可以管理多個director和vip,進而可以實現"雙主模型"的高可用。

實驗環境如下圖:

其中Director1的vrrp實例1上是R1的master,vrrp實例2是R2的backup,Director2的vrrp實例1是R1的backup,vrrp實例2是R2的master。

這裡略過4個RS的配置步驟(如有問題,參照前文配置RS1、RS2的過程)。

以下是Director1和Director2的keepalived.conf不同部分和相同部分的內容:

# 以下是兩台Director上相同部分的內容
! Configuration File for keepalived                |! Configuration File for keepalived
                                                   |
global_defs {                                      |global_defs {
   router_id LVS_1                                 |   router_id LVS_2           
}                                                  |}
                                                   |
vrrp_instance VI_1 {                               |vrrp_instance VI_1 {         
    state MASTER                                   |    state BACKUP             
    interface eth0                                 |    interface eth0
    virtual_router_id 51                           |    virtual_router_id 51     
    priority 100                                   |    priority 50              
    advert_int 1                                   |    advert_int 1
    authentication {                               |    authentication {
        auth_type PASS                             |        auth_type PASS       
        auth_pass 12345678                         |        auth_pass 12345678   
    }                                              |    }
    virtual_ipaddress {                            |    virtual_ipaddress {
        192.168.100.10/32 dev eth0 label eth0:0    |        192.168.100.10/32 dev eth0 label eth0:0
    }                                              |    }
}                                                  |}
# 不同vrrp實例綁定在同一介面上,vrid必須不能相同        |# 不同vrrp實例綁定在同一介面上,vrid必須不能相同
vrrp_instance VI_2 {                               |vrrp_instance VI_2 {         
    state BACKUP                                   |    state MASTER             
    interface eth0                                 |    interface eth0
    virtual_router_id 55                           |    virtual_router_id 55     
    priority 50                                    |    priority 100              
    advert_int 1                                   |    advert_int 1
    authentication {                               |    authentication {
        auth_type PASS                             |        auth_type PASS       
        auth_pass 12345678                         |        auth_pass 12345678   
    }                                              |    }
    virtual_ipaddress {                            |    virtual_ipaddress {
        192.168.100.11/32 dev eth0 label eth0:1    |        192.168.100.11/32 dev eth0 label eth0:1
    }                                              |    }
}                                                  |}
#########################################################################################
# 以下是兩台Director上相同部分的內容
virtual_server 192.168.100.10 80 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        protocol TCP

        real_server 192.168.100.49 80 {
                weight 2
                TCP_CHECK {
                        connect_port 80
                        connect_timeout 1
                        nb_get_retry 2
                        delay_before_retry 1
                }
        }

        real_server 192.168.100.50 80 {
                weight 1
                TCP_CHECK {
                        connect_port 80
                        connect_timeout 1
                        nb_get_retry 2
                        delay_before_retry 1
                }
        }
}

virtual_server 192.168.100.11 80 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        protocol TCP

        real_server 192.168.100.57 80 {
                weight 2
                TCP_CHECK {
                        connect_port 80
                        connect_timeout 1
                        nb_get_retry 2
                        delay_before_retry 1
                }
        }

        real_server 192.168.100.58 80 {
                weight 1
                TCP_CHECK {
                        connect_port 80
                        connect_timeout 1
                        nb_get_retry 2
                        delay_before_retry 1
                }
        }
}

分別測試訪問兩個VIP:http://192.168.100.10http://192.168.100.11。其中前者目前只能調度R1:RS1和R1:RS2,後者只能調度R2:RS1和R2:RS2。將任一Director斷開,測試4個RS是否仍能繼續提供服務。

4.提供sorry server和local RS

如果所有RS都宕了,對於外界來說就真的無法再訪問網站了,這顯然不適合。這時可以通過keepalived來配置一個服務頁面。例如告訴外界客戶端網站正在維護狀態,或者只提供一個網站的一個主頁面。

一般來說,因為是在所有RS都宕機的情況下sorry server提供的臨時服務才生效,因此通常將sorry server配置在virtual_server中而非real_server中。

配置時,只需在keepalived配置文件的virtual_server段落中添加sorry_server指令即可。並且,如果啟用了vrrp的高可用,應該在master和backup節點上都加上sorry server。

virtual_server 192.168.100.10 80 {
        delay_loop 6
        lb_algo wrr
        lb_kind DR
        protocol TCP

        sorry_server 127.0.0.1 80

重啟keepalived後,再在每個vrrp機器上配置好httpd。

yum -y install httpd
echo "web Maintenancing" >/var/www/html/index.html
service httpd start

然後將所有的RS節點的httpd服務停掉。再看keepalived上的ipvs規則,發現已經將VIP作為規則添加進來了,於是下次訪問VIP時將調度這台sorry server。當某一臺RS恢復的時候,ipvs規則又會變更為RS的節點。

對於集群系統不大的情況下,LVS Director一般會比較空閑,這樣就比較浪費資源。這時通常會將LVS Director自身也作為一個RS,一邊提供web服務,一邊提供調度功能,不過應該將它的調度權重設置低一點,以免影響負載均衡的性能。這稱為local RS,local RS的RIP可以寫Director上的任意地址(127.0.0.1都可以)。例如:

real_server 127.0.0.1 80 {
        weight 1
        TCP_CHECK {
                connect_port 80
                connect_timeout 1
                nb_get_retry 2
                delay_before_retry 1
        }
}

local RS和sorry server不應該同時設置,因為如果local RS壞了,sorry server肯定無法被調度到。

 

回到Linux系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
回到網站架構系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
回到資料庫系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7586194.html
轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/8492298.html

註:若您覺得這篇文章還不錯請點擊右下角推薦,您的支持能激發作者更大的寫作熱情,非常感謝!


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

-Advertisement-
Play Games
更多相關文章
  • 註意:需要找到“POP3/SMTP服務”並開啟,然後生成授權碼,生成的授權碼就是下麵登入的密碼。 ...
  • 之前一直想搞個後臺任務管理系統,零零散散的搞到現在,也算完成了。 這裡發佈出來,請園裡的dalao批評指導! 廢話不多說,進入正題。 github地址:https://github.com/YANGKANG01/QuartzNetJob 一、項目結構 項目結構如下: ORM使用的是SqlSugar版 ...
  • CentOS上,除了os類的yum源,還需要配置幾個常用的源:epel、ius。 有很多國內很多鏡像站點都提供了各類倉庫的鏡像站點,個人感覺比較全的是阿裡雲http://mirrors.aliyun.com和清華大學開源鏡像站點https://mirrors.tuna.tsinghua.edu.cn ...
  • 1.安裝 JDK linux 和 win7 都是多用戶的操作系統,所以配置環境變數的位置就說明瞭這個環境變數起作用的範圍。如上 win7 我配置到了 bai 用戶下,那麼只有當 bai 用戶登錄的時候才能夠使用java 環境。別的用戶就用不到,當然如果你的配置是在系統變數上,那麼這台電腦上所有的用 ...
  • 1:開放防火牆埠 1. sudo yum install curl openssh-server openssh-clients postfix cronie -y 2. 添加GitLab倉庫,並安裝到伺服器上 3. 啟動GitLab 時間可能較長,耐心等待 sudo gitlab-ctl rec ...
  • 正好要裝一次雙系統,就記錄了一下自己的步驟,加深印象,也希望能幫助有需要的人! ...
  • ASOC的出現是為了讓codec獨立於CPU,減少和CPU之間的耦合,這樣同一個codec驅動就無需修改就可以匹配任何一款平臺。 在Machine中已經知道,snd_soc_dai_link結構就指明瞭該Machine所使用的Platform和Codec。在Codec這邊通過codec_dai和Pl ...
  • 既然Windows API編程是與Windows操作系統進行交互,所以就必須對Windows操作系統如何運行應用程式的原理搞清楚。 1、保護模式 操作系統是依附於cpu硬體的,所以操作系統所具備的功能也是cpu所給予的。Intel的32位CPU有兩種主要的模式:實模式和保護模式。Dos操作系統就是運 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...