前言
我們使用keepalived來管理兩臺設備的Nginx,並虛擬出一個IP,外界請求直接訪問虛擬IP而不是真正的Nginx,讓虛擬IP去訪問提供服務的Nginx然後再由Nginx去訪問tomcat。當我們其中一臺nginx掛掉之後另一臺nginx就會頂上來,這就是我們說的nginx的高可用
準備工作
提前準備好如下工作
1.需要兩臺服務器
2.在兩臺服務器安裝好nginx
安裝keepalived
在兩臺服務器上都安裝keepalived
安裝yum命令
yum install keepalived
keepalived常用命令
systemctl start keepalived.service
systemctl stop keepalived.service
systemctl restart keepalived.service
keepalived查看日誌
tail -f /var/log/messages
安裝之後,在 etc 裏面生成目錄 keepalived,有文件 keepalived.conf,我們下面的就是配置這個文件
配置高可用
修改keepalived配置文件
首先我們配置keepalived
找到第一臺機器的/etc/keepalived目錄的keepalived.conf配置文件,打開;
我們主要是配置這兩個節點,下方其他的是配置的lvs,我們不需要修改
將這兩塊內容修改如下
global_defs {
notification_email { # keepalived服務宕機異常出現的時候,發送通知郵件 可以是多個
acassen@firewall.loc # 收件人郵箱1
failover@firewall.loc # 收件人郵箱2
sysadmin@firewall.loc # 收件人郵箱3
}
notification_email_from Alexandre.Cassen@firewall.loc #郵件發件人
smtp_server 192.168.200.1 # 郵件服務器地址
smtp_connect_timeout 30 # 超時時間
router_id LVS_DEVEL # 機器標識 局域網內唯一即可
vrrp_skip_check_adv_addr # 默認是不跳過檢查。檢查收到的VRRP通告中的所有地址可能會比較耗時,設置此命令的意思是,如果通告與接收的上一個通告來自相同的master路由器,則不執行檢查(跳過檢查)。
#vrrp_strict # 嚴格遵守VRRP協議。下列情況將會阻止啓動Keepalived:1. 沒有VIP地址。2. 單播鄰居。3. 在VRRP版本2中有IPv6地址。
vrrp_garp_interval 0 # 小數類型,單位秒,在一個網卡上每組gratuitous arp消息之間的延遲時間,默認爲0,一個發送的消息=n組 arp報文
vrrp_gna_interval 0 # 小數類型,單位秒, 在一個網卡上每組na消息之間的延遲時間,默認爲0
}
# vrrp實例 我們集羣設置 多機配置,除了state和priority不一樣,其他都一樣
vrrp_instance VI_1 {
state MASTER # 服務器狀態 MASTER是主服務器 BACKUP是備份服務器 主服務器的priority要比備份服務器大
interface ens33 # 通信端口 通過ip addr可以看到 根據自己的機器配置
virtual_router_id 51 # vrrp實例id keepalived集羣,實例id必須一致
priority 100 # 權重比 主服務器的priority要比備份服務器大
advert_int 1 # 心跳間隔 單位秒 keepalived多機器集羣 通過心跳檢測,如果發送心跳沒反應 就立刻接管;
authentication { # 服務器之間通信密碼
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { # 自定義虛擬IP
192.168.91.199
}
}
把這個配置複製到從服務器上,state改爲BACKUP,從服務器的priority改小
到這裏我們高可用就初步完成了,可以開啓nginx和keepalived測試了
這裏注意別踩到小白坑(我踩到了/(ㄒoㄒ)/~~)↓
ps:自定義的虛擬ip得根據真實ip設置,否則會出現真實ip可以訪問到,虛擬ip訪問不到
例:比如我的真實ip是192.168.91.138,那我的虛擬ip可以設置爲192.168.91.139~255,前面三個數得一致,後面一個數可以是139到255
添加檢測腳本
上面的配置已經可以初步測試nginx的高可用,比如我們關掉主服務器的keepalived,從服務器的nginx就會替代主nginx。
但如果是我們的主nginx掛掉而主keepalived沒掛,我們從nginx就不能替代主nginx,實際情況中nginx比keepalived更容易掛掉,那這情況怎麼解決你呢?
我們可以在keepalived添加腳本,當檢測到我們的nginx掛掉之後而keepalived沒掛掉,我們可以讓腳本主動嘗試重啓nginx服務,如果實在重啓不了nginx,我們讓腳本主動關閉keepalived好讓從nginx替代上來
修改keepalived.conf
在這個位置添加配置
vrrp_script chk_http_port {
script "/home/nginx_check.sh" #腳本地址
interval 2 #檢測腳本執行的間隔
weight 2 #比重
}
然後相對應的地址創建nginx_check.sh
touch /home/nginx_check.sh
腳本內容
#!/bin/bash
echo 'xxxxxx'
count_nginx=`ps -ef|grep -w nginx|grep -v grep|wc -l`
echo $count_nginx
if [ $count_nginx -eq 0 ];then
systemctl start nginx.service
sleep 2
if [ `ps -ef|grep -w nginx|grep -v grep|wc -l` -eq 0 ];then
systemctl stop keepalived.service
fi
fi
啓動nginx和keepalived
systemctl start nginx.service
systemctl start keepalived.service
測試
修改兩臺服務nginx的index頁面用來區分是哪臺服務器的nginx
vim /usr/share/nginx/html/index.html
輸入虛擬ip訪問
關閉主服務器的keepalived從服務的nginx會自動頂替上來
也可以關閉只nginx測試我們配置的腳本
如果出現無法關閉keepalived問題,嘗試下面的步驟
systemctl start keepalived.service
systemctl stop keepalived.service
systemctl restart keepalived.service
關閉keepalived
systemctl stop keepalived.service
查看keepalived進程是否真的關閉
ps -ef|grep keep
圖中情況說明沒有關閉,說明關閉命令無法關閉keepalived
這種情況是因爲systemd啓動服務腳本的問題
修改systemd啓動服務腳本
vim /usr/lib/systemd/system/keepalived.service
註釋掉一行KillMode=process
KillMode=process的大致意思是當停止keepalived的時候只會停掉主進程,而主進程產生的子進程是不會被幹掉的。而killmode的默認值是control-group,意思時所有進程都會被幹掉,我這裏選擇把這項註釋掉。
重載配置
systemctl daemon-reload
再試試關閉keepalived,還不行重啓服務器試試!!!