下載
下載地址:
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ò)

執(zhí)行命令:
yum -y install openssl openssl-devel
安裝
make && make install
安裝后查看目錄
whereis keepalived
查看和keepalived相關(guān)的文件目錄,/etc/keepalived /usr/local/keepalived

配置
修改配置文件 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è)

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

至此keepalived安裝成功了
注冊(cè)keepalived為系統(tǒng)服務(wù)
進(jìn)入到nginx安裝源代碼的文件目錄下就是接下tar包后的目錄,我的直接放到了/root下

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

將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

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

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

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

同時(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)程還存在

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

原因是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)程仍然存在

至此,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)

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

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