Keepalived+Nginx實現高可用(上)

一、背景與簡介

? ? ? ? 為了服務的高可用性,避免單點故障問題,通常我們使用"冗余設計思想"進行架構設計。冗余設計思想,本質就是將同一個應用或者服務放置在多臺不同的服務器上[雞蛋不放在同一個籃子里],這樣減少整體服務宕機的可能性。我們通過概率學就能簡單知道,例如一臺服務器宕機的概率為1%,那么2臺一樣的機器同時宕機的概率就是0.01x0.01=0.01%, 依次類推,冗余的服務器越多,那么整體服務宕機的可能性就越小。? 但是高可用和成本成正比關系,一個服務的可用性越高,付出的成本越高。

? ? ? ? 通常在應用的業務部署中間件中,Nginx扮演著反向代理與流量分發的角色。 例如之前我所在的公司將服務部署在本地IDC機房,整體對外、對內的流量都是經過Nginx作為網關入口。 如果Nginx存在單點問題,所在的服務器一旦發生宕機或者整個Nginx服務不可用,那么對業務的影響是致命的。

? ? ? ? 所以我們需要保證Nginx入口網關的高可用性。? 我們學過一種編程思想:? 面向抽象編程。 在這里,我們可以將要暴露Nginx網關服務的IP給到客戶端的是VIP(Virtual IP)而非實際代理的物理IP。 我們將多個提供服務的物理IP形成一個邏輯IP組。VIP是一個虛擬IP(抽象層), VIP會時刻只對應一個物理IP, 一旦對應的物理IP發生故障,則可以漂移到這個邏輯IP組內健康的物理IP, 從而實現客戶端無感故障遷移(客戶端無效更改VIP地址,同時這個過程對于客戶端而言是無感知的、透明的),實現服務的高可用。

? ? ? ? 架構圖如下:

? ? ? ? DNS服務器直接將域名綁定A記錄指向VIP地址: 172.20.0.110, 客戶端通過域名進行訪問Nginx網關服務即可,后面Nginx網關服務無論是升級、故障轉移等等,客戶端無須修改域名或者代碼,實現Nginx網關服務高可用以及無感故障轉移。

二、開源組件Keepalived

1、基本介紹

? ? ? ? 很幸運的是要實現上述的Nginx網關服務高可用問題,開源界有一個成熟的、可靠的中間件就是keepalived。

? ? ? ? 網上資料是這么介紹keepalived:?

????????Keepalived 軟件起初是專為LVS負載均衡軟件設計的,用來管理并監控LVS集群系統中各個服務節點的狀態,后來又加入了可以實現高可用的VRRP功能。因此,Keepalived除了能夠管理LVS軟件外,還可以作為其他服務(例如:Nginx、Haproxy、MySQL等)的高可用解決方案軟件。

????????Keepalived軟件主要是通過VRRP協議實現高可用功能的。VRRP是Virtual Router RedundancyProtocol(虛擬路由器冗余協議)的縮寫,VRRP出現的目的就是為了解決靜態路由單點故障問題的,它能夠保證當個別節點宕機時,整個網絡可以不間斷地運行。

????????所以,Keepalived 一方面具有配置管理LVS的功能,同時還具有對LVS下面節點進行健康檢查的功能,另一方面也可實現系統網絡服務的高可用功能。

2、總結概括

? ? ? ? Keepalived是一個通過VRRP網絡協議、提供VIP漂移技術來實現冗余高可用設計的一個開源中間件。?

? ? ? ? 通過合理的配置Keepalived我們就可以實現服務的高可用。

三、案例實驗

1、實驗的目標以及實驗環境

? ? ? 本次實驗都是基于docker-compose實現.

? ? ? ?設計有2個容器(2臺服務器),分別是172.20.0.2作為主服務器、172.20.0.3作為備用服務器,? 服務器上都部署了Nginx服務, 我們需要要暴露這個服務給到其他客戶端提供一個VIP。? 后面測試主服務器宕機的時候,訪問VIP是否訪問到了172.20.0.3的頁面。等主服務器又恢復正常的時候,訪問VIP是否訪問到的是172.20.0.2的頁面。

? ? ? ? Dockerfile內容如下:

FROM centos:7
RUN yum update -y
USER root
RUN yum install epel-release -y
RUN yum update -y
RUN yum install nginx keepalived -y
RUN yum install vim net-tools iproute -y

? ? ? ? ?運行的目錄結構如下:

? ? ? ? docker-compose.yaml內容如下:

version: "3"
services:nginx-master:  # 172.20.0.2build:context: ./docker/working_dir: "/root/"privileged: truehostname: "nginx-master"expose:- 80entrypoint: ["tail", "-f", "/dev/null"]nginx-backup:  # 172.20.0.3build:context: ./docker/working_dir: "/root/"privileged: truehostname: "nginx-backup"expose:- 80entrypoint: [ "tail", "-f", "/dev/null" ]

? ? ? ? 運行著2個容器, 執行docker-compose up -d --build

2、測試兩個容器顯示的頁面內容

? ? ? ? 在宿主機上執行curl命令,分別curl 2個IP查看返回Nginx提供的頁面內容:

3、配置nginx-master容器(172.20.0.2)的keepalived.conf

? 文件位于/etc/keepalived/keepalived.conf

global_defs {#keepalived節點唯一ID標識名稱router_id keep_02       
}vrrp_instance VI_1 {#節點角色: MASTER、BACKUPstate MASTER            #綁定VIP的網卡名稱interface eth0          #虛擬路由ID組, 備用節點和主節點必須屬于同一個組virtual_router_id  172  #節點優先級, 取值范圍 0-255, 主節點的優先級要大于備用節點priority  100           #主備同步檢查時間間隔advert_int  1           #認證信息,主備一致authentication {        auth_type PASSauth_pass 1234}#VIP地址virtual_ipaddress {172.20.0.110     }
}

?啟動keepalived:??

keepalived -n -l  # -n 前臺運行  -l 顯示運行日志

?此時查看ip addr:? ?可以看到VIP? 172.20.0.110 已經綁定在eth0網卡上了

? 宿主機此時curl 172.20.0.110得到結果是綁定在了master主節點的內容:

?

4、配置nginx-backup容器(172.20.0.3)的keepalived.conf

global_defs {#keepalived節點唯一ID標識名稱router_id keep_03       
}vrrp_instance VI_1 {#節點角色: MASTER、BACKUPstate BACKUP           #綁定VIP的網卡名稱interface eth0          #虛擬路由ID組, 備用節點和主節點必須屬于同一個組virtual_router_id  172  #節點優先級, 取值范圍 0-255, 主節點的優先級要大于備用節點priority  90          #主備同步檢查時間間隔advert_int  1           #認證信息,主備一致authentication {        auth_type PASSauth_pass 1234}#VIP地址virtual_ipaddress {172.20.0.110     }
}

? 啟動keepalived:

keepalived -n -l  # -n 前臺運行  -l 顯示運行日志

? ?

此時查看: ip addr? ? ?主節點keepalived還正常運行,自然備用節點拿不到VIP

5、模擬主節點故障,手動關閉keepalived

此時在宿主機訪問VIP? curl? 172.20.0.110:

????????此時我們看到,同樣是訪問VIP地址, 第4步驟訪問的時候返回的是master: 172.20.0.2, 但是我們手動關閉主節點的keepalived進程模擬故障的時候, 再次curl VIP地址, 訪問得到的內容就是backup: 172.20.0.3 。?

? ? ? ? 此時已經發生故障轉移了,但是客戶端訪問的VIP沒發生變化,我們在宿主機上執行的curl命令一模一樣,但是返回的內容不一樣了(實際情況來說,沒出故障前以及出故障之后,得到的AIP的內容應該是一致的。 只是在這里做演示,讓大家看情況故障轉移過程,所以故意讓返回的頁面內容存在差異,容易對比)

6、模擬恢復主節點故障,啟動keepalived進程

? ? ? ? 此時我們再次訪問curl VIP :? curl 172.20.0.110, 得到的內容又是master: 172.20.0.110, VIP已經實現了故障轉移(IP漂移)

四、?總結

? ? ? ? 整個測試流程還算簡單、清晰的。? 我們使用keepalived要注意幾點:

? ? ? ? ????????1、主節點、備用節點要屬于同一個廣播域,也就是同一個交換機下

? ? ? ????????? 2、啟動keepalived默認是后臺運行,啟動后進入后臺。但是為了更好調試錯誤加入了-n參數進行前臺運行, 為了顯示日志便于排錯又增加了-l參數。? 所以整體參數是

keepalived -n -l

? ? ? ????????? 3、通過ip addr查看VIP代替ifconfig, ifconfig有時候是看不到VIP的存在,只看到了物理IP的存在

? ? ? ? 那使用Keepalived上述過程,就能確保服務高正無憂、毫無缺點了么?? 其實不盡然。

? ? ? ? 1、大家會發現VIP時刻只會漂移到一個物理IP上,那么BACKUP備用節點都處于閑置狀態,是不是太浪費資源了呢?

? ? ? ? 2、IP漂移或者不漂移是通過Keepalived進程是否存活來決定的。 那么如果存在一種情況就是Keepalived進程存活,此時拿到了VIP,但是Nginx掛了, 那本質上就是VIP拿到了占著茅坑不拉屎,整個服務都掛了。這種情況又該如何處理IP及時漂移到可用Nginx節點來達到高可用的目的呢???

? ? ? ? 預知后事如何,請聽下回分解~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/214988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214988.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214988.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ACWing week 3(C語言) 725.完全數

一個整數,除了本身以外的其他所有約數的和如果等于該數,那么我們就稱這個整數為完全數。 例如,66 就是一個完全數,因為它的除了本身以外的其他約數的和為 1236 現在,給定你 N 個整數,請你依次判斷這些數是…

ESP32網絡開發實例-搭建ESP32固件遠程升級服務器

搭建ESP32固件遠程升級服務器 文章目錄 搭建ESP32固件遠程升級服務器1、ESP32設備自動升級流程2、軟件準備3、硬件準備4、代碼實現4.1 固件升級服務器代碼實現4.2 基礎固件代碼4.3 新固件代碼實現我們在前面的文章中,已經實現了OTA方式升級固件的兩種方式:在Arduino IDE 中升…

數據結構與算法-動態規劃-機器人達到指定位置方法數

機器人達到指定位置方法數 來自左程云老師書中的一道題 【題目】 假設有排成一行的 N 個位置,記為 1~N,N 一定大于或等于 2。開始時機器人在其中的 M 位置上(M 一定是 1~N 中的一個),機器人可以往左走或…

基于大語言模型的復雜任務認知推理算法CogTree

近日,阿里云人工智能平臺PAI與華東師范大學張偉教授團隊合作在自然語言處理頂級會議EMNLP2023上發表了基于認知理論所衍生的CogTree認知樹生成式語言模型。通過兩個系統:直覺系統和反思系統來模仿人類產生認知的過程。直覺系統負責產生原始問題的多個分解…

10 # 類:繼承和成員修飾符

類的基本實現 類的成員屬性都是實例屬性,而不是原型屬性,類的成員方法都是原型方法。 class Dog {constructor(name: string) {this.name name;}name: string;run() {} }console.log(Dog.prototype); let dog new Dog("wangwang"); consol…

知識筆記(五十四)———mysql比較varchar值大小_Mysql varchar大小長度問題

1、限制規則 字段的限制在字段定義的時候有以下規則: a) 存儲限制 varchar 字段是將實際內容單獨存儲在聚簇索引之外,內容開頭用1到2個字節表示實際長度(長度超過255時需要2個字節),因此最大長度不能超過65535。 b) 編碼長度限制 字符類…

低功耗模式的通用 MCU ACM32F0X0 系列,具有高整合度、高抗干擾、 高可靠性的特點

ACM32F0X0 系列是一款支持多種低功耗模式的通用 MCU。集成 12 位 1.6 Msps 高精度 ADC 以及比 較器、運放、觸控按鍵控制器、段式 LCD 控制器,內置高性能定時器、多路 UART、LPUART、SPI、I2C 等豐富的通訊外設,內建 AES、TRNG 等信息安全模塊&#xff0…

kubeadm搭建單master多node的k8s集群--小白文,圖文教程

參考文獻 K8S基礎知識與集群搭建 kubeadm搭建單master多node的k8s集群—主要參考這個博客,但是有坑,故貼出我自己的過程,坑會少很多 注意: 集群配置是:一臺master:zabbixagent-k8smaster,兩臺…

C++類和對象——(10)綜合示例

一、示例對象數組&#xff1a; #include<iostream> using namespace std;class Point{private:int x,y;public:Point(int px0,int py0){xpx;ypy;}void init(int px0,int py0){xpx;ypy;}void print(){cout<<"("<<x<<","<<y…

FFmpeg的AVInputFormat

文章目錄 結構體定義操作函數支持的AVOutputFormat 通過上面的分析&#xff0c;基本可以看到ffmpeg的套路了&#xff0c;首先一個context上下文&#xff0c;上下文里面一個priv_data 指針&#xff0c;然后再插件結構體中有一個priv_data_size&#xff0c;然后回調函數。 結構體…

JVM-GC調優-字節碼篇-01

筆記來源&#xff1a;JVM 注意&#xff1a;實在想學習可以看一下&#xff0c;讓自己更加了解JVM&#xff0c;看起來可能會枯燥。 JVM-概述 1、你的問題 1.1你被JVM傷害過嗎&#xff1f; 你是否也遇到過這些問題&#xff1f; 運行著的線上系統突然卡死&#xff0c;系統無法訪…

Flink SQL: 高效解析 Kafka 數據并存儲為 Parquet 至 HDFS

目錄 總體流程介紹 1. 從 Kafka 讀取數據 2. 使用 UDF 進行數據解析 3. 將

HTML中如何設置音頻和視頻?

文章目錄 &#x1f50a;嵌入音頻&#x1f39e;?嵌入視頻 &#x1f50a;嵌入音頻 HTML 元素用于在文檔中嵌入音頻內容。 元素可以包含一個或多個音頻資源&#xff0c; 這些音頻資源可以使用 src 屬性或者 元素來進行描述&#xff1a;瀏覽器將會選擇最合適的一個來使用。也可以使…

Centos7云服務器上安裝cobalt_strike_4.7。附cobalt_strike_4.7安裝包

環境這里是阿里的一臺Centos7系統。 開始安裝之前首先要確保自己安裝了java11及以上環境。 安裝java11步驟&#xff1a; sudo yum update sudo yum install java-11-openjdk-devel把服務器端&#xff08;CS工具分服務器端和客戶端&#xff09;的CS安裝到服務器上后給目錄下的…

Mongoose 對象文檔模型庫

一、介紹 Mongoose是一個對象文檔模型庫&#xff0c;官網&#xff1a;http://www.mongoosejs.net/ 二、作用 方便使用代碼操作Mongodb數據庫 三、使用流程 //1. 安裝 mongoose //2. 導入 mongoose const mongoose require(mongoose); //3. 連接數據庫 mongoose.connect(m…

某省資源交易中心 (js逆向)

該文章只是用于逆向學習&#xff0c;不得以商用或者是破壞他人利益的目的進行使用。如有侵權請聯系作者。 網站鏈接&#xff1a; bse64 aHR0cHM6Ly9nZ3p5ZncuZnVqaWFuLmdvdi5jbi9idXNpbmVzcy9saXN0Lw 分析環節 進入網站 進行翻頁請求時我們會發現改請求時ajax請求。 這里&…

hive-窗口函數

1 窗口函數語法 分析函數/專用窗口函數 over(partition by 列名 order by 列名 rows between 開始位置 and 結束位置) 常用的分析函數 常用的分析函數&#xff1a;sum()、max()、min()、avg()、count() 常用的專用窗口函數 專用窗口函數&#xff1a;row_number()、rank()、dens…

【簡易版】Linux下Protobuf 實現網絡版通訊錄--C++

一、介紹 該項目的主要目的是用于熟悉protobuf的使用&#xff0c;體驗數據在網絡中序列化反序列化的形式&#xff0c;并非一個完整的項目。 該通訊錄只實現了增加聯系人的功能。服務器端接收到請求后會將聯系人的信息打印。 二、環境搭建 使用Httplib庫&#xff0c;可以快速…

jsp文件引用的css修改后刷新不生效問題

問題 在對 JavaWeb 項目修改的過程中&#xff0c;發現修改了 jsp 文件引入的 css 文件的代碼后頁面的樣式沒有更新的問題。 原因 導致這個問題的原因可能是因為瀏覽器緩存的問題。 解決方法 下面介紹兩種解決方法&#xff0c;供大家參考&#xff1a; 1、給 link 標簽的 c…

TrustZone之安全虛擬化

在Armv7-A首次引入虛擬化時,它僅在非安全狀態中添加。在Armv8.3之前,Armv8也是如此,如下圖所示: 如前所述在切換安全狀態時,EL3用于托管固件和安全監視器。安全EL0/1托管受信任的執行環境(TEE),由受信任的服務和內核組成。 在安全狀態下,沒有對多個虛擬機的需…