keepalived的安裝以及nginx的高可用實(shí)現(xiàn)方案

下載

下載地址:
https://www.keepalived.org/download.html
我這里選擇下載2.0.18版本

準(zhǔn)備工作

準(zhǔn)備兩臺(tái)虛擬虛擬機(jī),ip分別為:
192.168.66.121
192.168.66.122

安裝

解壓jar包:

tar -zxvf keepalived-2.0.18.tar.gz

進(jìn)入keepalived-2.0.18,進(jìn)行配置

yum -y install gcc
./configure --prefix=/usr/local/keepalived --sysconf=/etc

安裝過(guò)程中如果報(bào)下面的錯(cuò)


image.png

執(zhí)行命令:

yum -y install openssl openssl-devel

安裝

make && make install

安裝后查看目錄

whereis keepalived

查看和keepalived相關(guān)的文件目錄,/etc/keepalived /usr/local/keepalived


image.png

配置

修改配置文件 vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   #路由id:當(dāng)前安裝keepalived節(jié)點(diǎn)主機(jī)的標(biāo)識(shí)符,全局唯一
   router_id keep_121
}
# 計(jì)算機(jī)節(jié)點(diǎn)
vrrp_instance VI_1 {
    #表示狀態(tài),當(dāng)前節(jié)點(diǎn)為主節(jié)點(diǎn),MASTER/BACKUP
    state MASTER
    #當(dāng)前實(shí)例綁定的網(wǎng)卡
    interface ens33
    #保證主備節(jié)點(diǎn)一致
    virtual_router_id 51
    #優(yōu)先級(jí)/權(quán)重 誰(shuí)優(yōu)先級(jí)高,在master掛掉以后,就能稱(chēng)為MASTER
    priority 100
    #主備之間同步檢查的時(shí)間間隔,默認(rèn)1s
    advert_int 1
    #認(rèn)證授權(quán)的密碼,防止非法節(jié)點(diǎn)的進(jìn)入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.66.120
    }
}

進(jìn)入usr/local/keepalived/sbi目錄執(zhí)行

./keepalived

執(zhí)行命令

ip addr

看到ens33下多了一個(gè)ip192.168.66.120,就是之前我們?cè)O(shè)置的虛擬ip

我在192.168.66.121和192.168.66.122虛擬機(jī)上都裝上了nginx,訪(fǎng)問(wèn)ip跳轉(zhuǎn)到nginx的歡迎頁(yè)


image.png

當(dāng)使用虛擬ip120訪(fǎng)問(wèn)時(shí)同樣可以訪(fǎng)問(wèn)成功


image.png

至此keepalived安裝成功了

注冊(cè)keepalived為系統(tǒng)服務(wù)

進(jìn)入到nginx安裝源代碼的文件目錄下就是接下tar包后的目錄,我的直接放到了/root下


image.png

找到etc目錄,我的是 /root/keepalived-2.0.18/keepalived/etc


image.png

將init.d以及systemconfig拷貝到操作系統(tǒng)對(duì)應(yīng)的/etc目錄下即可
執(zhí)行命令:
cp init.d/keepalived /etc/init.d/
cp sysconfig/keepalived /etc/sysconfig/

刷新服務(wù),執(zhí)行命令

systemctl daemon-reload

至此,我們就可以通過(guò)systemctl來(lái)啟動(dòng)或停止keepalived了

systemctl start keepalived
systemctl stop keepalived

nginx--主備高可用實(shí)現(xiàn)

為了實(shí)現(xiàn)nginx高可用,我們需要將121作為備用機(jī),平時(shí)由122對(duì)外提供請(qǐng)求,當(dāng)122宕機(jī)之后,由121來(lái)接管請(qǐng)求
同樣在121上來(lái)安裝keepalived,同上
修改keepalive.conf配置文件

! Configuration File for keepalived

global_defs {
   #路由id:當(dāng)前安裝keepalived節(jié)點(diǎn)主機(jī)的標(biāo)識(shí)符,全局唯一
   router_id keep_122
}
# 計(jì)算機(jī)節(jié)點(diǎn)
vrrp_instance VI_1 {
    #表示狀態(tài),當(dāng)前節(jié)點(diǎn)為主節(jié)點(diǎn),MASTER/BACKUP
    state BACKUP
    #當(dāng)前實(shí)例綁定的網(wǎng)卡
    interface ens33
    #保證主備節(jié)點(diǎn)一致
    virtual_router_id 51
    #優(yōu)先級(jí)/權(quán)重 誰(shuí)優(yōu)先級(jí)高,在master掛掉以后,就能稱(chēng)為MASTER
    priority 80
    #主備之間同步檢查的時(shí)間間隔,默認(rèn)1s
    advert_int 1
    #認(rèn)證授權(quán)的密碼,防止非法節(jié)點(diǎn)的進(jìn)入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.66.120
    }
}

進(jìn)入/usr/local/keepalived/sbin目錄啟動(dòng)keepalived,

./keepalived

驗(yàn)證

打開(kāi)瀏覽器F12,勾選disable cache


image.png

訪(fǎng)問(wèn)120,發(fā)現(xiàn)可以正常訪(fǎng)問(wèn)到122服務(wù)的nginx


image.png

下面我們關(guān)掉122的服務(wù)器
image.png

我們?cè)賮?lái)訪(fǎng)問(wèn)虛擬ip120,發(fā)現(xiàn)我們的請(qǐng)求到了121服務(wù)器


image.png

同時(shí)我們?cè)?21服務(wù)上執(zhí)行命令
ip addr

發(fā)現(xiàn)121服務(wù)器多了192.168.66.120這個(gè)ip,說(shuō)明在122關(guān)機(jī)后,虛擬ip轉(zhuǎn)移到了121服務(wù)器上,從而可以正常請(qǐng)求
我們?cè)僦匦聠?dòng)122服務(wù)器,當(dāng)然還需要重啟nginx以及keepalive,我們?cè)僦匦略L(fǎng)問(wèn)虛擬ip 192.168.66.120,發(fā)現(xiàn)我們的請(qǐng)求又重新請(qǐng)求到了122服務(wù)器
至此nginx的主備高可用方案完成

keepalived配置nginx自動(dòng)重啟

上述我們是將服務(wù)器停掉后,隨之keepalived也就停掉了,此時(shí)可以切換到備用機(jī),正常運(yùn)行,但如果我們122服務(wù)器上nginx掛掉了,但是keepalived沒(méi)有掛掉,還能不能正常運(yùn)行呢?
我們只停掉122的nginx進(jìn)行,進(jìn)入nginx目錄執(zhí)行命令

./nginx -s stop

執(zhí)行ps -ef | grep nginx查看是否nginx進(jìn)程還存在


image.png

發(fā)現(xiàn)我們已經(jīng)停掉了,然后訪(fǎng)問(wèn)虛擬ip120,此時(shí)發(fā)下服務(wù)除了問(wèn)題


image.png

原因是122服務(wù)器的keepalived還存在,因此120的ip還綁定在122這臺(tái)服務(wù)器上,但是由于nginx掛了,所以就訪(fǎng)問(wèn)不通了
因此,我們需要有個(gè)腳本檢測(cè)nginx進(jìn)程是否存在,要是不存在的話(huà)直接重啟nginx

在/etc/keepalived/目錄下創(chuàng)建腳本check_nginx_alive_or_not.sh
內(nèi)容為:

#!/bin/bash

A=`ps -C nginx --no-header | wc -l`
#判斷nginx是否宕機(jī),如果宕機(jī),重試重啟
if [ $A -eq 0 ]; then
    /usr/local/nginx/sbin/nginx
    #等待一小會(huì),如果沒(méi)有啟動(dòng)成功,則停止keepalived,使其啟動(dòng)備用機(jī)
    sleep 3
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
       killall keepalived
    fi
fi

添加可執(zhí)行權(quán)限:

chmod +x check_nginx_alive_or_not.sh

修改keepalive的配置文件,修改配置,完整的配置文件為:

! Configuration File for keepalived

global_defs {
   #路由id:當(dāng)前安裝keepalived節(jié)點(diǎn)主機(jī)的標(biāo)識(shí)符,全局唯一
   router_id keep_121
}
vrrp_script check_nginx_alive{
   script "/etc/keepalived/check_nginx_alive_or_not.sh"
   interval 2 #每隔兩秒運(yùn)行一次腳本
   weight 10 # 如果腳本運(yùn)行成功,則權(quán)重+10
}
# 計(jì)算機(jī)節(jié)點(diǎn)
vrrp_instance VI_1 {
    #表示狀態(tài),當(dāng)前節(jié)點(diǎn)為主節(jié)點(diǎn),MASTER/BACKUP
    state MASTER
    #當(dāng)前實(shí)例綁定的網(wǎng)卡
    interface ens33
    #保證主備節(jié)點(diǎn)一致
    virtual_router_id 51
    #優(yōu)先級(jí)/權(quán)重 誰(shuí)優(yōu)先級(jí)高,在master掛掉以后,就能稱(chēng)為MASTER
    priority 100
    #主備之間同步檢查的時(shí)間間隔,默認(rèn)1s
    advert_int 1
    #認(rèn)證授權(quán)的密碼,防止非法節(jié)點(diǎn)的進(jìn)入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.66.120
    }
    track_script {
       check_nginx_alive #追蹤nginx腳本
    }
}

重啟啟動(dòng)keepalived

systemctl restart keepalived

驗(yàn)證

我們進(jìn)入到nginx的啟動(dòng)目錄/usr/local/nginx/sbin,執(zhí)行命令停止掉nginx

./nginx -s stop

然后我們?cè)俨榭磏ginx的進(jìn)程仍然存在


image.png

至此,nginx的自動(dòng)重啟方案完成

高可用架構(gòu)keepalived雙主熱備搭建

前面我們實(shí)現(xiàn)了keepalived的主備架構(gòu)搭建,此時(shí)會(huì)有一點(diǎn)遺憾,就是一臺(tái)服務(wù)器始終處于等待狀態(tài),只有當(dāng)主節(jié)點(diǎn)掛掉后,備用服務(wù)器才會(huì)工作,這樣就白白浪費(fèi)了一臺(tái)服務(wù)器的資源,我們可不可以實(shí)現(xiàn)一種方案,讓兩臺(tái)服務(wù)器都進(jìn)行工作來(lái)均衡負(fù)載,當(dāng)一臺(tái)服務(wù)器掛掉后,由另外一臺(tái)服務(wù)器承擔(dān)全部負(fù)載呢?答案是有的,就是讓兩臺(tái)服務(wù)器互為主備,下面我們來(lái)實(shí)現(xiàn)一下這個(gè)方案
方案是使用兩個(gè)虛擬ip,這里使用兩個(gè)IP:
192.168.66.120
192.168.66.119
兩臺(tái)物理主機(jī)的ip為:
192.168.66.121
192.168.66.122
120的虛擬IP使用122作為MASTER,121作為BACKUP,119虛擬IP使用121作為MASTER,122作為BACKUP,這樣121與122就互為主備關(guān)系,119的請(qǐng)求會(huì)訪(fǎng)問(wèn)到121這臺(tái)節(jié)點(diǎn),120的請(qǐng)求會(huì)訪(fǎng)問(wèn)到122這臺(tái)節(jié)點(diǎn),這樣如果其中一臺(tái)服務(wù)器掛掉后,兩個(gè)服虛擬IP都會(huì)綁定到另外一臺(tái)主機(jī)上,在客戶(hù)端中使用域名來(lái)綁定兩個(gè)IP,這樣系統(tǒng)依然能工作正常。
修改配置文件:
編輯121節(jié)點(diǎn)上的keepalived.conf文件內(nèi)容為

! Configuration File for keepalived

global_defs {
   #路由id:當(dāng)前安裝keepalived節(jié)點(diǎn)主機(jī)的標(biāo)識(shí)符,全局唯一
   router_id keep_122
}
vrrp_script check_nginx_alive{
   script "/etc/keepalived/check_nginx_alive_or_not.sh"
   interval 2 #每隔兩秒運(yùn)行一次腳本
   weight 10 # 如果腳本運(yùn)行成功,則權(quán)重+10
}
# 計(jì)算機(jī)節(jié)點(diǎn)
vrrp_instance VI_1 {
    #表示狀態(tài),當(dāng)前節(jié)點(diǎn)為主節(jié)點(diǎn),MASTER/BACKUP
    state BACKUP
    #當(dāng)前實(shí)例綁定的網(wǎng)卡
    interface ens33
    #保證主備節(jié)點(diǎn)一致
    virtual_router_id 51
    #優(yōu)先級(jí)/權(quán)重 誰(shuí)優(yōu)先級(jí)高,在master掛掉以后,就能稱(chēng)為MASTER
    priority 80
    #主備之間同步檢查的時(shí)間間隔,默認(rèn)1s
    advert_int 1
    #認(rèn)證授權(quán)的密碼,防止非法節(jié)點(diǎn)的進(jìn)入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.66.120
    }

    track_script {
       check_nginx_alive #追蹤nginx腳本
    }
}
vrrp_instance VI_2 {
    #表示狀態(tài),當(dāng)前節(jié)點(diǎn)為主節(jié)點(diǎn),MASTER/BACKUP
    state MASTER
    #當(dāng)前實(shí)例綁定的網(wǎng)卡
    interface ens33
    #保證主備節(jié)點(diǎn)一致
    virtual_router_id 52
    #優(yōu)先級(jí)/權(quán)重 誰(shuí)優(yōu)先級(jí)高,在master掛掉以后,就能稱(chēng)為MASTER
    priority 100
    #主備之間同步檢查的時(shí)間間隔,默認(rèn)1s
    advert_int 1
    #認(rèn)證授權(quán)的密碼,防止非法節(jié)點(diǎn)的進(jìn)入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.66.119
    }

    track_script {
       check_nginx_alive #追蹤nginx腳本
    }
}

編輯122節(jié)點(diǎn)keepalived文件,內(nèi)容為

! Configuration File for keepalived

global_defs {
   #路由id:當(dāng)前安裝keepalived節(jié)點(diǎn)主機(jī)的標(biāo)識(shí)符,全局唯一
   router_id keep_121
}
vrrp_script check_nginx_alive{
   script "/etc/keepalived/check_nginx_alive_or_not.sh"
   interval 2 #每隔兩秒運(yùn)行一次腳本
   weight 10 # 如果腳本運(yùn)行成功,則權(quán)重+10
}
# 計(jì)算機(jī)節(jié)點(diǎn)
vrrp_instance VI_1 {
    #表示狀態(tài),當(dāng)前節(jié)點(diǎn)為主節(jié)點(diǎn),MASTER/BACKUP
    state MASTER
    #當(dāng)前實(shí)例綁定的網(wǎng)卡
    interface ens33
    #保證主備節(jié)點(diǎn)一致
    virtual_router_id 51
    #優(yōu)先級(jí)/權(quán)重 誰(shuí)優(yōu)先級(jí)高,在master掛掉以后,就能稱(chēng)為MASTER
    priority 100
    #主備之間同步檢查的時(shí)間間隔,默認(rèn)1s
    advert_int 1
    #認(rèn)證授權(quán)的密碼,防止非法節(jié)點(diǎn)的進(jìn)入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.66.120
    }
    track_script {
       check_nginx_alive #追蹤nginx腳本
    }
}

# 計(jì)算機(jī)節(jié)點(diǎn)
vrrp_instance VI_2 {
    #表示狀態(tài),當(dāng)前節(jié)點(diǎn)為主節(jié)點(diǎn),MASTER/BACKUP
    state BACKUP
    #當(dāng)前實(shí)例綁定的網(wǎng)卡
    interface ens33
    #保證主備節(jié)點(diǎn)一致
    virtual_router_id 52
    #優(yōu)先級(jí)/權(quán)重 誰(shuí)優(yōu)先級(jí)高,在master掛掉以后,就能稱(chēng)為MASTER
    priority 80
    #主備之間同步檢查的時(shí)間間隔,默認(rèn)1s
    advert_int 1
    #認(rèn)證授權(quán)的密碼,防止非法節(jié)點(diǎn)的進(jìn)入
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.66.119
    }
    track_script {
       check_nginx_alive #追蹤nginx腳本
    }
}

然后執(zhí)行命令重啟keepalived

systemctl restart keepalived

測(cè)試訪(fǎng)問(wèn)虛擬IP119,發(fā)現(xiàn)訪(fǎng)問(wèn)到了121節(jié)點(diǎn)


image.png

測(cè)試訪(fǎng)問(wèn)虛擬IP120,發(fā)現(xiàn)訪(fǎng)問(wèn)到了122節(jié)點(diǎn)


image.png

這樣,兩個(gè)虛擬IP均能訪(fǎng)問(wèn)到我們的服務(wù)了,可以將域名在DNS服務(wù)器上解析到這兩個(gè)IP上,利用DNS來(lái)進(jìn)行均衡訪(fǎng)問(wèn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容