Keepalived + Nginx 實現高可用

一、簡介

浮動IP、漂移IP地址又叫做VIP,也就是虛擬IP。

Keepalived 是一種高性能的服務器高可用或熱備解決方案。
Keepalived 可以用來防止服務器單點故障的發生,通過配合 Nginx 可以實現 web 前端服務的高可用。
Keepalived 以 VRRP 協議為實現基礎,用 VRRP 協議來實現高可用性(HA)。?
keepalived 提供健康檢查,故障轉移,提高系統的可用性!

二、方案規劃

VIPIPNginx端口默認主從
192.168.111.250192.168.111.20180MASTER
192.168.111.250192.168.111.20280BACKUP

master正常的情況下

master宕機的情況下

三、安裝Nginx?

# 安裝四個依賴
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -zxvf nginx-1.13.7.tar.gz
cd nginx-1.13.7
./configure --prefix=/usr/local/nginx
make && make install

修改 nginx 首頁面內容為節點的ip地址,方便測試觀察

vi /usr/local/nginx/html/index.html
<body>
<h1>192.168.111.201</h1>
</body>
<body>
<h1>192.168.111.202</h1>
</body>

啟動nginx

cd /usr/local/nginx/sbin/
./nginx

防火墻開啟80端口

firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

瀏覽器訪問Nginx

http://192.168.111.201
http://192.168.111.202

?

?四、安裝 Keepalived

方式一:

如果能聯網可以使用yum快速安裝:

yum install -y keepalived

方式二:?

可以去keepalived官網直接下載:https://www.keepalived.org/download.html

# 安裝依賴
yum -y install gcc openssl openssl-devel libnl libnl-devel  libnfnetlink-devel
# 下載
yum -y install wget
wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
tar -zxvf keepalived-2.2.7.tar.gz
cd keepalived-2.2.7
./configure --prefix=/usr/local/keepalived
make && make installmkdir /etc/keepalived
cp -p /usr/local/keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf

編輯配置文件

vi /etc/keepalived/keepalived.conf

(1)編輯 MASTER(主)節點配置文件(192.168.111.201)

! Configuration File for keepalived# 全局配置
global_defs {# 路由ID,不能重復,通常為 hostnamerouter_id 192.168.111.201
}# keepalived會定時執行腳本并對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。
# 如果腳本執行結果為0,并且weight配置的值大于0,則優先級相應的增加。
# 如果腳本執行結果非0,并且weight配置的值小于 0,則優先級相應的減少。
# 其他情況,維持原本配置的優先級,即配置文件中priority對應的值。
vrrp_script chk_nginx {# 檢測 nginx 狀態的腳本路徑script "/etc/keepalived/nginx_check.sh"# #每2秒運行一次上面的腳本interval 2# 失敗一次,將自己的優先級-20,如果MASTER的priority=100,BACKUP的priority=70# 那么MASTER要失敗2次后變為60,低于BACKUP的70,MASTER節點會降級為BACKUP,而BACKUP節點升級為MASTERweight -20
}# 定義實例
vrrp_instance VI_1 {# 可選值為 MASTER 或者 BACKUPstate MASTER# 網卡名稱,與本機 IP 地址所在的網卡名稱相同interface ens32# 虛擬路由的ID,MASTER和BACKUP必須是一致的。virtual_router_id 51# 定義優先級,數字越大,優先級越高,MASTER的優先級必須大于BACKUP的優先級priority 100# 設定 MASTER 與 BACKUP 負載均衡之間同步檢查的時間間隔,單位為秒advert_int 1# 設置驗證類型和密碼,兩個節點必須一致authentication {# 認證方式,此處PASS表示為密碼auth_type PASS# 生產環境設置6位隨機密碼auth_pass 123456}# 設置虛擬IP地址virtual_ipaddress {192.168.111.250}# 執行腳本track_script {# 對應vrrp_script配置的腳本chk_nginx}
}

(2)編輯 BACKUP(備)節點配置文件(192.168.111.202)

! Configuration File for keepalivedglobal_defs {# 路由ID,不能重復,通常為 hostnamerouter_id 192.168.111.202
}vrrp_script chk_nginx {script "/etc/keepalived/nginx_check.sh"interval 2weight -20
}# 定義實例
vrrp_instance VI_1 {# 可選值為 MASTER 或者 BACKUPstate BACKUPinterface ens32virtual_router_id 51# 定義優先級,數字越大,優先級越高,MASTER的優先級必須大于BACKUP的優先級priority 99advert_int 1authentication {auth_type PASSauth_pass 123456}# 設置虛擬IP地址virtual_ipaddress {192.168.111.250}track_script {chk_nginx}
}

(3) 編寫 Nginx 狀態檢測腳本

vi /etc/keepalived/nginx_check.sh

方式一:

如果 nginx 停止運行,嘗試啟動,如果無法啟動則殺死本機的 keepalived 進程, keepalied將虛擬 ip 綁定到 BACKUP 機器上。

#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then# 這里需要替換成自己的nginx安裝路徑# 嘗試重新啟動nginx/usr/local/nginx/sbin/nginx# 睡眠2秒sleep 2if [ $A -eq 0 ];then#啟動失敗,將keepalived服務殺死。killall keepalivedfi
fi

?killall命令默認未安裝,會報錯?killall: 未找到命令。安裝方式如下:

yum install -y psmisc

?方式二:?

如下,返回0或者1。我比較喜歡這種方式。
這里換成其他組件,比如mysql 修改為`pidof mysql`?即可。

#!/bin/bash
# keepalived會定時執行腳本并對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。
# 如果腳本執行結果為0,并且weight配置的值大于0,則優先級相應的增加。
# 如果腳本執行結果非0,并且weight配置的值小于 0,則優先級相應的減少。
# 其他情況,維持原本配置的優先級,即配置文件中priority對應的值。
result=`pidof nginx`
if [ ! -z "${result}" ];
thenexit 0
elseexit 1
fi

給腳本添加執行權限

chmod +x /etc/keepalived/nginx_check.sh

?(4) 開啟組播防火墻

centos7放行組播地址224.0.0.18,協議vrrp

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens32 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
# 查看規則是否生效
firewall-cmd --permanent --direct --get-all-rules

--direct:指定將要使用直接規則
--permanent:表示永久生效 ,沒有此參數重啟后失效
--add-rule ipv4 filter:表示添加一個新的策略
設置一條IPV4規則,表為防火墻表 :filter, 處理輸入數據包 INPUT ,0 代表在頭部添加。后面就是常用的iptables語法
--in-interface ens32:設置網卡名,這里我的網卡名是ens32
--destination 224.0.0.18:設置目標ip地址,也就是設置放行組播地址224.0.0.18
--protocol vrrp:設置攔截的協議
-j ACCEPT:表示放行,-j DROP表示丟棄(不放行)

(5) 啟動 Keepalived

# 啟動
systemctl start keepalived.service
# 重啟
systemctl restart keepalived.service
# 停止
systemctl stop keepalived.service
# 查看運行狀態
systemctl status keepalived
# 查看運行進程
ps -ef|grep keepalived

MASTER(主)節點(192.168.111.201)成功標志

可以看到,192.168.111.201拿到了VIP 192.168.111.250。?

BACKUP(備)節點(192.168.111.202)成功標志

BACKUP上只有192.168.111.202這個ip,正常。
注意:MASTER節點正常的情況下,BACKUP節點一定不會有浮動IP,也就是VIP只能同時在一個節點上。

(6) 驗證VIP漂移

我們先關閉Master,驗證VIP是否會漂移到BACKUP上。

關閉 ?MASTER(主)節點(192.168.111.201) 的 keepalived:

systemctl stop keepalived.service

?VIP已經成功飄到BACKUP節點上了

五、Keepalived + Nginx 的高可用測試

訪問浮動VIP

http://192.168.111.250

?正常情況下,浮動ip飄到 MASTER(主)節點(192.168.111.201)上,所以訪問后顯示的主節點的nginx首頁

如果殺掉 MASTER(主)節點(192.168.111.201)的 nginx?
如果nginx進程不存在腳本返回1,nginx進程存在腳本返回0

腳本返回0,表示nginx進程存在,由于上面配置的weight為負數,priority 不會改變。

腳本返回1,表示nginx進程不存在,由于上面配置的weight為負數,priority 會減少,減少后的值?priority =?priority+weight
失敗一次,將自己的優先級-20,我這里MASTER的priority=100,BACKUP的priority=99
那么MASTER要失敗1次后變為80,低于BACKUP的99,MASTER節點會降級為BACKUP,而BACKUP節點升級為MASTER

#!/bin/bash
# keepalived會定時執行腳本并對腳本執行的結果進行分析,動態調整vrrp_instance的優先級。
# 如果腳本執行結果為0,并且weight配置的值大于0,則優先級相應的增加。
# 如果腳本執行結果非0,并且weight配置的值小于 0,則優先級相應的減少。
# 其他情況,維持原本配置的優先級,即配置文件中priority對應的值。
result=`pidof nginx`
if [ ! -z "${result}" ];
thenexit 0
elseexit 1
fi

殺掉?MASTER(主)節點(192.168.111.201)的 nginx 后,再次訪問浮動VIP

http://192.168.111.250

六、常見錯誤

1、keepalived 配置了虛擬ip,發現無法ping 通這個虛擬ip。
解決方法,把配置文件中的 vrrp_strict 給注釋掉,重啟 keepalived 服務后再次ping就可以了。

2、啟動失敗、卡住
使用命令 journalctl -xe 查看日志,有這樣一行:
Failed to parse PID from file /usr/local/keepalived/var/run/keepalived.pid: Invalid argument
這里因為源碼安裝的方式,pid文件找不到,使用命令?systemctl status keepalived 查看 load文件路徑:loaded (/usr/lib/systemd/system/keepalived.service)
修改/usr/lib/systemd/system/keepalived.service該文件內容:PIDFile=/var/run/keepalived.pid

參考:

keepalived應用:漂移IP的實現_keepalived做ip漂移_Joy_B的博客-CSDN博客

keepalive實戰_sending/queueing gratuitous arps_程序員柒叔的博客-CSDN博客

linux防火墻下允許keepalived組播_keepalived 防火墻_老帽爬新坡的博客-CSDN博客

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

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

相關文章

使用 spaCy 增強 NLP 管道

介紹 spaCy 是一個用于自然語言處理 (NLP) 的 Python 庫。SpaCy 的 NLP 管道是免費且開源的。開發人員使用它來創建信息提取和自然語言理解系統,例如 Cython。使用該工具進行生產,擁有簡潔且用戶友好的 API。 如果您處理大量文本,您會想了解更多相關信息。例如,它是關于什…

HOT99-下一個排列

leetcode原題鏈接&#xff1a;下一個排列 題目描述 整數數組的一個 排列 就是將其所有成員以序列或線性順序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下這些都可以視作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。整數數組的 下一個排列 是指其…

【C++】模板template

&#x1f525;&#x1f525; 歡迎來到小林的博客&#xff01;&#xff01; ??????&#x1f6f0;?博客主頁&#xff1a;??林 子 ??????&#x1f6f0;?博客專欄&#xff1a;?? C ??????&#x1f6f0;?社區 :?? 進步學堂 ??????&#x1f6f0;?歡…

Django之定時任務--apscheduler

Django--定時任務apscheduler的使用 apscheduler定時任務的使用1、安裝包2、配置settings.py3、在manage.py的文件同級目錄下創建文件scheduler.py4、在項目的urls.py中調用這個定時計劃5、然后啟動項目 python manage.py runserver,在admin中查看就能看到你的定時任務及執行的…

機器學習算法之-邏輯回歸(1)

什么是回歸 回歸樹&#xff0c;隨機森林的回歸&#xff0c;無一例外他們都是區別于分類算法們&#xff0c;用來處理和預測連續型標簽的算法。然而邏輯回歸&#xff0c;是一種名為“回歸”的線性分類器&#xff0c;其本質是由線性回歸變化而來的&#xff0c;一種廣泛使用于分類問…

Vue 引入 Element-UI 組件庫

Element-UI 官網地址&#xff1a;https://element.eleme.cn/#/zh-CN 完整引入&#xff1a;會將全部組件打包到項目中&#xff0c;導致項目過大&#xff0c;首次加載時間過長。 下載 Element-UI 一、打開項目&#xff0c;安裝 Element-UI 組件庫。 使用命令&#xff1a; npm …

ArcGIS Maps SDK for JavaScript系列之二:認識Map和MapView

目錄 Map創建一個 Map 對象的示例代碼&#xff1a;Map的常用屬性Map的常用方法 MapViewMapView的常用屬性MapView的常用方法 在 ArcGIS Maps SDK for JavaScript 中&#xff0c;Map 和 MapView 是兩個重要的概念&#xff0c;用于創建和展示地圖應用程序。 Map Map 表示一個地圖…

【Rust】Rust學習 第十三章Rust 中的函數式語言功能:迭代器與閉包

Rust 的設計靈感來源于很多現存的語言和技術。其中一個顯著的影響就是 函數式編程&#xff08;functional programming&#xff09;。函數式編程風格通常包含將函數作為參數值或其他函數的返回值、將函數賦值給變量以供之后執行等等。 更具體的&#xff0c;我們將要涉及&#…

bert,transformer架構圖及面試題

Transformer詳解 - mathor atten之后經過一個全連接層殘差層歸一化 class BertSelfOutput(nn.Module):def __init__(self, config):super().__init__()self.dense nn.Linear(config.hidden_size, config.hidden_size)self.LayerNorm nn.LayerNorm(config.hidden_size, epscon…

redis 發布和訂閱

目錄 一、簡介 二、常用命令 三、示例 一、簡介 Redis 發布訂閱 (pub/sub) 是一種消息通信模式&#xff1a;發送者 (pub) 發送消息&#xff0c;訂閱者 (sub) 接收消息。Redis 客戶端可以訂閱任意數量的頻道。下圖展示了頻道 channel1 &#xff0c;以及訂閱這個頻道的三個客戶…

前端對文件轉換處理的一些常用方法

文章目錄 0&#xff0c;前言1&#xff0c;將圖片的url網絡鏈接(http://) 轉為base64格式2&#xff0c;將base64的圖片數據轉換為file文件3&#xff0c;將以base64的圖片數據轉換為Blob4&#xff0c;將file文件轉化為base645&#xff0c;將file文件轉換為Blob6&#xff0c;獲取文…

CentOS系統環境搭建(八)——CentOS7開機自動執行腳本(以MySQL為例)

CentOS7開機自動執行腳本 文章目錄 CentOS7開機自動執行腳本第一步&#xff1a;新建一個腳本run.sh第二步&#xff1a;腳本添加可執行權限第三步&#xff1a;執行如下命令將/etc/rc.d/rc.local文標記為可執行文件第四步&#xff1a;打開/etc/rc.d/rc.local文件&#xff0c;在最…

利用Opencv實現人像遷移

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天來學習一下如何使用Opencv實現人像遷移&#xff0c;歡迎大家一起參與探討交流~ 本文目錄&#xff1a; 一、實驗要求二、實驗環境三、實驗原理及操作1.照片準備2.圖像增強3.實現美顏功能4.背景虛化5.圖像二值化處理6.人…

item_password-獲得淘口令真實url

一、接口參數說明&#xff1a; item_password-獲得淘口令真實url &#xff0c;點擊更多API調試&#xff0c;請移步注冊API賬號點擊獲取測試key和secret 公共參數 請求地址: https://api-gw.onebound.cn/taobao/item_password 名稱類型必須描述keyString是調用key&#xff08…

tomcat源碼修改與編譯

1、獲取源碼 從github下載其源碼&#xff1a;https://github.com/apache/tomcat 2、選擇版本 切換到對應版本&#xff08;直接用相對應的Git tag即可&#xff09;&#xff1a; git checkout 9.0.793、修改源代碼&#xff0c;并且生成補丁 這里我們以修改去掉新版本的ws的檢…

129.【Spring 注解 IOC】

Spring 注解 (一)、組件注冊1. Configuration 與 Bean 容器注冊組件(1).無注解注入方式(2).注解注入方式 2. ComponentScan 自動掃描組件和自動掃描規則(1).無注解掃描方式(2).注解掃描注入方式(3).指定掃描或不掃描的包 (過濾) 3. 自定義TypeFilter指定過濾規則 Filter(1).自定…

openCV項目開發實戰--詳細介紹如何改善夜間圖像的照明(附python和C++源碼)

文末附完整的代碼實現下載鏈接 介紹 對于非攝影師來說,在光線不佳的條件下拍出好照片似乎很神奇。完成低光攝影需要技巧、經驗和正確的設備的結合。在弱光下拍攝的圖像缺乏色彩和獨特的邊緣。它們還遭受能見度差和深度未知的困擾。這些缺點使得此類圖像不適合個人使用或圖像處…

QT多屏顯示程序

多屏顯示的原理其實很好理解&#xff0c;就拿橫向擴展來說&#xff1a; 計算機把桌面的 寬度擴展成了 w1&#xff08;屏幕1的寬度&#xff09; w2(屏幕2的寬度) 。 當一個窗口的起始橫坐標 > w1&#xff0c;則 他就被顯示在第二個屏幕上了。 drm設備可以多用戶同時打開&am…

Spring MVC 簡介

目錄 1. 什么是MVC2. 什么是SpringMVC 1. 什么是MVC MVC是一種常用的軟件架構模式。可以看作是一種設計模式&#xff0c;也可以看作是一種軟件框架。經典MVC模式中&#xff0c;M是指模型&#xff0c;V是視圖&#xff0c;C則是控制器&#xff0c;使用MVC的目的是將M和V的實現代…

golang中使用chan控制協程并發簡單事例

func main() {processNum : 5ch : make(chan struct{}, processNum)for true {ch <- struct{}{}go func() {defer func() {<-ch}()fmt.Println("我是協程", time.Now().UnixNano())time.Sleep(time.Second * 5)}()} } 可以看到&#xff0c;這里每5s會執行一次帶…