Nginx高可用Keepalived的具體使用
1.Keepalived講解
高可用是指2臺(tái)機(jī)器啟動(dòng)著完全相同的業(yè)務(wù)系統(tǒng),一臺(tái)機(jī)器宕機(jī)后,另一臺(tái)可以快速啟用,用戶是無感知的。高可用硬件通常使用F5,軟件通常使用keepalived。keepalived軟件是基于VRRP協(xié)議實(shí)現(xiàn)的,VRRP虛擬路由冗余協(xié)議,主要用于解決單點(diǎn)故障。
2.VRRP實(shí)現(xiàn)原理
一般我們會(huì)選擇增加一臺(tái)路由器,但是我們主路由器故障后,用戶需要手動(dòng)指向備用路由器,如果用戶多的話修改起來會(huì)非常麻煩,另外我們的主路由器修好后,主路由器用不用;主路由器故障后我們把備用路由器的網(wǎng)關(guān)配置改成主路由器是否可以,等等,涉及問題很多。
實(shí)際上,我們?nèi)绻麊渭兩闲薷木W(wǎng)關(guān)配置,是行不通的,我們的PC第一次通過ARP廣播尋找到主路由器的MAC地址和IP地址,會(huì)將信息寫到ARP的緩存表,那么PC在之后的連接中都是根據(jù)緩存表信息去連接,在進(jìn)行數(shù)據(jù)包轉(zhuǎn)發(fā),即使我們修改了IP,但是Mac地址是唯一的,PC的數(shù)據(jù)包依舊會(huì)發(fā)給主路由器(除非PC的ARP緩存表過期,再次發(fā)起ARP廣播的時(shí)候才能獲取新的備用路由器的MAC的地址和IP地址)
那么我們就需要VRRP了,通過軟件或硬件的形式在主路由器和副路由器外面增加一個(gè)虛擬的MAC地址(VMAC)和虛擬IP地址(VIP),那么在這種情況下,PC請(qǐng)求VIP的時(shí)候,不管是主路由器處理還是備用路由器處理,PC只是在ARP緩存表中記錄VMAC和VIP的信息。
3.Keepalived核心概念
要掌握Keepalived之前,我們需要先知道它的核心概念。
1、如何確定誰是主節(jié)點(diǎn)誰是備用節(jié)點(diǎn)(誰的效率高,速度快就用誰,類似選舉投票;手動(dòng)干預(yù)是通過優(yōu)先級(jí)的方式)
2、如果主節(jié)點(diǎn)故障,備用節(jié)點(diǎn)自動(dòng)接管,如果主節(jié)點(diǎn)恢復(fù)了,那么搶占式的方式主節(jié)點(diǎn)會(huì)自動(dòng)接管,類似于奪權(quán),而非搶占式的方式,主節(jié)點(diǎn)恢復(fù)了,并不會(huì)自動(dòng)接管。
3、主節(jié)點(diǎn)和備用節(jié)點(diǎn)在1個(gè)小組,主節(jié)點(diǎn)正常時(shí),1秒鐘向小組內(nèi)發(fā)送一次心跳(時(shí)間可以自定義),表示它還正常,如果沒有發(fā)送心跳,則備用節(jié)點(diǎn)自動(dòng)接管,如果主節(jié)點(diǎn)和備用節(jié)點(diǎn)都沒發(fā)送心跳,則兩臺(tái)服務(wù)器都會(huì)認(rèn)為自己是主節(jié)點(diǎn),從而形成腦裂。
4.Keepalived安裝配置
(1)我們準(zhǔn)備一臺(tái)web01(10.0.0.5)和一臺(tái)web02(10.0.0.6)兩臺(tái)虛擬主機(jī)
(2)兩臺(tái)主機(jī)都安裝Keepalived
[root@web01 ~]# yum -y install keepalived [root@web02 ~]# yum -y install keepalived
(3)配置web01
[root@web01 ~]# rpm -qc keepalived #查詢keepalived的配置文件 /etc/keepalived/keepalived.conf /etc/sysconfig/keepalived [root@web01 ~]# cat /etc/keepalived/keepalived.conf global_defs { #全局配置 router_id web01 #標(biāo)識(shí)身份->名稱 } vrrp_instance VI_1 { state MASTER #標(biāo)識(shí)角色狀態(tài) interface eth0 #網(wǎng)卡綁定接口 virtual_router_id 50 #虛擬路由id priority 150 #優(yōu)先級(jí) advert_int 1 #監(jiān)測(cè)間隔時(shí)間 authentication { #認(rèn)證 auth_type PASS #認(rèn)證方式 auth_pass 1111 #認(rèn)證密碼 } virtual_ipaddress { 10.0.0.3 #虛擬的VIP地址 } }
(4)配置web02
[root@web02 ~]# cat /etc/keepalived/keepalived.conf global_defs { router_id web02 #與主結(jié)點(diǎn)區(qū)別1:唯一標(biāo)識(shí) } vrrp_instance VI_1 { state BACKUP #與主節(jié)點(diǎn)區(qū)別2:角色狀態(tài) interface eth0 virtual_router_id 50 priority 100 #與主節(jié)點(diǎn)區(qū)別3:競(jìng)選優(yōu)先級(jí) advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } }
(5)啟動(dòng)兩個(gè)節(jié)點(diǎn)的Keepalived
[root@web01 ~]# systemctl start keepalived [root@web01 ~]# systemctl enable keepalived [root@web02 ~]# systemctl start keepalived [root@web02 ~]# systemctl enable keepalived
5.Keepalived測(cè)試搶占式和非搶占式
(1)LB01的優(yōu)先級(jí)高于LB02,所以VIP在LB01上面
[root@web01 ~]# ip add | grep 10.0.0.3 inet 10.0.0.3/32 scope global eth0
(2)關(guān)閉web01的Keepalived,發(fā)現(xiàn)web01自動(dòng)接管
[root@web01 ~]# systemctl stop keepalived [root@web01 ~]# ip add | grep 10.0.0.3 [root@web02 ~]# ip add | grep 10.0.0.3 inet 10.0.0.3/32 scope global eth0
(3)重啟web01的keepalived,發(fā)現(xiàn)VIP被強(qiáng)行搶占
[root@web01 ~]# systemctl start keepalived [root@web01 ~]# ip add | grep 10.0.0.3 inet 10.0.0.3/32 scope global eth0 [root@web02 ~]# ip add | grep 10.0.0.3
(4)配置非搶占式
兩個(gè)節(jié)點(diǎn)的state都必須配置為BACKUP,都必須加上配置nopreempt,其中一個(gè)節(jié)點(diǎn)的優(yōu)先級(jí)必須高于另外一個(gè)節(jié)點(diǎn)的優(yōu)先級(jí)。
[root@web01 ~]# cat /etc/keepalived/keepalived.conf global_defs { #全局配置 router_id web01 #標(biāo)識(shí)身份->名稱 } vrrp_instance VI_1 { state BACKUP #標(biāo)識(shí)角色狀態(tài) nopreempt interface eth0 #網(wǎng)卡綁定接口 virtual_router_id 50 #虛擬路由id priority 150 #優(yōu)先級(jí) advert_int 1 #監(jiān)測(cè)間隔時(shí)間 authentication { #認(rèn)證 auth_type PASS #認(rèn)證方式 auth_pass 1111 #認(rèn)證密碼 } virtual_ipaddress { 10.0.0.3 #虛擬的VIP地址 } } [root@web01 ~]# systemctl restart keepalived [root@web02 ~]# cat /etc/keepalived/keepalived.conf global_defs { router_id web02 } vrrp_instance VI_1 { state BACKUP nopreempt interface eth0 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } } [root@web02 ~]# systemctl restart keepalived
(5)通過windows的arp去驗(yàn)證,是否會(huì)切換MAC地址
[root@web01 ~]# ip add | grep 10.0.0.3 inet 10.0.0.3/32 scope global eth0
Windows本地hosts到10.0.0.3,瀏覽器訪問blog.koten.com(LB01分配到Web01里面的域名)
WIN+R調(diào)用運(yùn)行窗口,輸入cmd打開命令提示符arp -a,查看arp緩存區(qū),此時(shí)物理地址與LB01上10.0.0.3MAC地址一致
節(jié)點(diǎn)1的Keepalived停掉
[root@web01 ~]# systemctl stop keepalived
節(jié)點(diǎn)2接管VIP
[root@web02 ~]# ip add | grep 10.0.0.3 inet 10.0.0.3/32 scope global eth0
再次查看mac地址,此時(shí)物理地址與LB02上10.0.0.3MAC地址一致
6.Keepalived故障腦裂
由于某些原因,導(dǎo)致兩臺(tái)keepalived服務(wù)器在指定的時(shí)間內(nèi),無法檢測(cè)到對(duì)方的心跳,但是兩臺(tái)服務(wù)器都可以正常使用。
(1)常見故障原因
服務(wù)器網(wǎng)線松動(dòng)等網(wǎng)絡(luò)故障
服務(wù)器硬件故障發(fā)生損壞現(xiàn)象而崩潰
主備都開啟了firewalld防火墻
(2)腦裂故障測(cè)試
將主備主機(jī)的防火墻都打開
[root@web01 ~]# systemctl start firewalld [root@web02 ~]# systemctl start firewalld
將剛剛的配置文件改回去
[root@web01 ~]# vim /etc/keepalived/keepalived.conf global_defs { router_id web01 } vrrp_instance VI_1 { state MASTER #nopreempt interface eth0 virtual_router_id 50 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } } [root@web01 ~]# systemctl restart keepalived [root@web02 ~]# cat /etc/keepalived/keepalived.conf global_defs { router_id web02 } vrrp_instance VI_1 { state BACKUP #nopreempt interface eth0 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } } [root@web02 ~]# systemctl restart keepalived
查看web01和web02中的IP,發(fā)現(xiàn)都有10.0.0.3
[root@web01 ~]# ip add | grep 10.0.0.3 inet 10.0.0.3/32 scope global eth0 [root@web02 ~]# ip add | grep 10.0.0.3 inet 10.0.0.3/32 scope global eth0
7.腦裂故障解決方案
解決思路:發(fā)生了腦裂,我們隨便kill掉一臺(tái)即可,可以通過編寫腳本的方式,我們認(rèn)為兩邊的ip add都有10.0.0.3,則發(fā)生了腦裂。我們?cè)趙eb01上寫腳本。
(1)做免密鑰方便獲取web02的ip信息:
[root@web01 ~]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:+NyOCiY7aBX8nEPwGeNQHjTLY2EXPKU1o33LTBrm1zk root@LB01 The key's randomart image is: +---[RSA 2048]----+ | oB.oo= | | o+o*o= o | | . =*+o.+ o | | o.=..o B o . | | = o So = E | | . = o .. . | | .o o . o . | |...+ . o | |. .. ... . | +----[SHA256]-----+ [root@web01 ~]# [root@web01 ~]# ssh-copy-id -i .ssh/id_rsa 10.0.0.6 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@10.0.0.6's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh '10.0.0.6'" and check to make sure that only the key(s) you wanted were added. [root@web01 ~]# ssh '10.0.0.6' ip add | grep 10.0.0.3 | wc -l #免密鑰測(cè)試 1
(2)腳本編寫并執(zhí)行
[root@web01 ~]# cat check_split_brain.sh web01_VIP_Number=`ip add | grep 10.0.0.3 | wc -l` web02_VIP_Number=`ssh '10.0.0.6' ip add | grep 10.0.0.3 | wc -l` if [ $web01_VIP_Number -eq 1 -a $web02_VIP_Number -eq 1 ] then systemctl stop keepalived fi [root@web01 ~]# sh check_split_brain.sh
[root@web01 ~]# ip add | grep 10.0.0.3 [root@web02 ~]# ip add | grep 10.0.0.3 inet 10.0.0.3/32 scope global eth0
8.Keepalived與Nginx
Nginx默認(rèn)監(jiān)聽在所有的IP地址上,VIP飄到一臺(tái)節(jié)點(diǎn)上,相當(dāng)于Nginx多了VIP這個(gè)網(wǎng)卡,所以可以訪問到Nginx所在的機(jī)器,但是如果Nginx宕機(jī),會(huì)導(dǎo)致用戶請(qǐng)求失敗,但是keepalived沒有掛掉不會(huì)進(jìn)行切換,就需要編寫腳本檢測(cè)Nginx存活狀態(tài),如果不存活則kill掉keepalived,讓VIP自動(dòng)飄到備用服務(wù)器。
(1)腳本編寫并增加權(quán)限
[root@web01 ~]# cat check_nginx.sh nginxpid=`ps -C nginx --no-header|wc -l` if [ $nginxpid -eq 0 ] then systemctl restart nginx &>/etc/null if [ $? -ne 0 ] then systemctl stop keepalived fi fi [root@web01 ~]# chmod +x check_nginx.sh [root@web01 ~]# ll check_nginx.sh -rwxr-xr-x 1 root root 150 Apr 12 17:37 check_nginx.sh
(2)腳本測(cè)試
[root@web02 ~]# ip add|grep 10.0.0.3 #當(dāng)前VIP不在web02 [root@web01 ~]# ip add|grep 10.0.0.3 #當(dāng)前VIP在web01上 inet 10.0.0.3/32 scope global eth0 [root@LB01 ~]# systemctl stop nginx #關(guān)閉Nginx [root@web01 ~]# ip add|grep 10.0.0.3 #VIP依舊在web01上,因?yàn)镹ginx對(duì)keepalived沒有影響 inet 10.0.0.3/32 scope global eth0 [root@web01 ~]# vim /etc/nginx/nginx.conf #修改Nginx配置文件,讓其無法重啟,查看是否會(huì)飄到web02上 ser nginx; [root@web01 ~]# sh check_nginx.sh #執(zhí)行腳本 [root@web01 ~]# ip add|grep 10.0.0.3 #發(fā)現(xiàn)VIP已經(jīng)不在web02了 [root@web02 ~]# ip add | grep 10.0.0.3 #VIP飄移到web02上了 inet 10.0.0.3/32 scope global eth0
(3)在配置文件內(nèi)中調(diào)用此腳本
[root@web01 ~]# cat /etc/keepalived/keepalived.conf global_defs { router_id web01 } #每5秒執(zhí)行一次腳本,腳本執(zhí)行內(nèi)容不能超過5秒,否則會(huì)中斷再次重新執(zhí)行腳本 vrrp_script check_nginx { script "/root/check_nginx.sh" interval 5 } vrrp_instance VI_1 { state MASTER #nopreempt interface eth0 virtual_router_id 50 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.0.0.3 } #調(diào)用并運(yùn)行腳本 track_script { check_nginx } }
注意:在Master的keepalived中調(diào)用腳本,搶占式,僅需在Master配置即可。如果配置為非搶占式,那么需要兩臺(tái)服務(wù)器都使用該腳本。
到此這篇關(guān)于Nginx高可用Keepalived的具體使用的文章就介紹到這了,更多相關(guān)Nginx高可用Keepalived內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- keepalived+nginx高可用實(shí)現(xiàn)方法示例
- Keepalived+Nginx+Tomcat 實(shí)現(xiàn)高可用Web集群的示例代碼
- nginx結(jié)合keepalived實(shí)現(xiàn)高可用的完整步驟
- Keepalived實(shí)現(xiàn)Nginx負(fù)載均衡高可用的示例代碼
- keepalived對(duì)nginx進(jìn)行高可用搭建及原理詳解
- Keepalived如何實(shí)現(xiàn)Nginx高可用
- keepalived?+?nginx?實(shí)現(xiàn)高可用方案
- 使用Nginx?+?Keepalived?實(shí)現(xiàn)高可用?Web?負(fù)載均衡筆記(虛擬機(jī))
- Nginx+keepalived實(shí)現(xiàn)七層的負(fù)載均衡的高可用(最新解決方案)
- Nginx使用Keepalived部署web集群(高可用高性能負(fù)載均衡)實(shí)戰(zhàn)案例
- Keepalived搭建nginx高可用的實(shí)現(xiàn)
相關(guān)文章
詳解nginx請(qǐng)求頭數(shù)據(jù)讀取流程
這篇文章主要介紹了詳解nginx請(qǐng)求頭數(shù)據(jù)讀取流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Nginx服務(wù)器對(duì)數(shù)據(jù)傳輸速度限制的基本配置方法講解
這篇文章主要介紹了Nginx服務(wù)器對(duì)數(shù)據(jù)傳輸速度限制的基本配置方法講解,包括第三方開發(fā)的限速模塊Nginx-limit-traffic-rate-module的使用介紹,需要的朋友可以參考下2016-01-01基于Nginx實(shí)現(xiàn)一個(gè)灰度上線系統(tǒng)的示例代碼
本文主要介紹了基于Nginx實(shí)現(xiàn)一個(gè)灰度上線系統(tǒng)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07