java 主备切换_keepalived 实现 Java 服务的高可用(主备切换)
前言
本文要說的是基于 keepalived 實現(xiàn)兩臺服務(wù)器之間的主備切換,從而實現(xiàn) Java 服務(wù)的高可用。keepalived 的原理不多做介紹,自行搜索了解,keepalived 的安裝部署請參考 keepalived 的安裝及使用 。
個人建議
不要沉迷于 死扣 和 理解 原理,網(wǎng)上關(guān)于原理的文章大同小異,關(guān)鍵詞就是 虛擬ip,了解個大概,動手實踐下,結(jié)合 keepalived 的配置文件會更好。
項目描述
我所做的項目是不是一個 web 程序,主要功能是定時從文件服務(wù)器下載文件,然后做一些處理,放到本地。
需求
當(dāng)一臺服務(wù)器部署的系統(tǒng)出現(xiàn)故障時,能夠有備用機器繼續(xù)提供服務(wù),盡量避免人工介入去恢復(fù)系統(tǒng)。注意跟負載均衡的區(qū)別!初步方案只提供一臺備用機。
方案
1. 實現(xiàn)原理
keepalived 的配置文件中有 權(quán)重 和 STATE 兩個配置項,兩臺機器上的 keepalived 通過 虛擬IP 綁定之后,它們之間就可以通過上述的配置項來進行 ”選舉“ ,區(qū)分 MASTER 和 BACKUP 。
然后配合 keepalived 中另外的兩個功能,檢測腳本 和 通知腳本 實現(xiàn)我們的主備切換的需求。
到底如何決定 MASTER 和 BACKUP ?
STATE 的值可以是 MASTER 和 BACKUP,當(dāng) 兩臺機器配置的 STATE 的值相同,并且權(quán)重相同時,誰先啟動誰是 MASTER,當(dāng)兩臺機器的配置的 權(quán)重 相同時,state 為 MASTER 的那臺機器最終會成為 MASTER(哪怕這臺機器啟動的時間比另一臺晚)
檢測腳本的作用
對我們的使用場景來說,檢測腳本的作用有兩個,一是檢測我們的 java 進程是否存在,二是對 keepalived 的權(quán)重進行加減。比如: 檢測到我們的 java 進程關(guān)閉了,我們就可以降低這臺機器的權(quán)重。
權(quán)重改變是永久生效的嗎?
否, 權(quán)重的增加或者降低只對當(dāng)前一輪的檢測有效!下次檢測開始還會恢復(fù)到配置的默認值。
通知腳本的作用
通知腳本有兩種,分別根據(jù) keepalived 的狀態(tài)去觸發(fā)。對我們的使用場景來說,這兩種分別是: **一個是當(dāng)這臺機器是 MASTER 時需要觸發(fā)的腳本,二是當(dāng)這臺機器是 BACKUP 的時候需要觸發(fā)的腳本。**比如: 當(dāng)我們的機器變成 MASTER 時,去啟動我們的 java 進程。
2. 具體配置
keepalived 的配置文件
! Configuration File for keepalived
# 全局配置
global_defs {
router_id LVS_MS
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
# 配置檢測腳本,腳本名稱隨意
vrrp_script chk {
script "/etc/keepalived/chk.sh" # 檢測腳本的位置
interval 3 # 每隔 3 秒執(zhí)行一次
weight -20 # 權(quán)重 -20 ,根據(jù)檢測腳本的返回值去判斷是否要減掉
}
# vrrp 實例
vrrp_instance VI_1 {
state BACKUP # 主備配置一樣,并且權(quán)重也一樣,這樣誰先啟動誰就是 MASTER
interface eth0
virtual_router_id 90
priority 100 # 默認權(quán)重
advert_int 1
authentication {
auth_type PASS
auth_pass keepalived_ms
}
virtual_ipaddress {
172.16.10.90 # 虛擬 ip
}
# 引用檢測腳本,因為可以配置多個 vrrp 實例,每個實例都可以使用同一個檢測腳本
track_script {
chk
}
# 配置通知腳本的路徑,腳本名稱隨意
# 1. 當(dāng) keepalived 的狀態(tài)為 MASTER 時,會觸發(fā)這個通知腳本
notify_master "/etc/keepalived/notify.sh master"
# 2. 與 1 相反
notify_backup "/etc/keepalived/notify.sh backup"
}
檢測腳本
#!/bin/bash
# 查找java服務(wù)進程個數(shù)
count=`ps aux | grep -v grep | grep 進程名稱 | wc -l`
# master.flag 就是一個標(biāo)記文件,如果文件存在,表示為 master
# 如果 MASTER 上的服務(wù)down 掉,降低權(quán)重
# 如果 MASTER 上的服務(wù)沒有問題,權(quán)重不變
# 如果是BACKUP ,權(quán)重保持不變
if [ -f master.flag ] && [ $count -eq 0 ]; then
exit 1 # 結(jié)合 keepalived.conf 配置文件,這里返回 1 表示當(dāng)前機器權(quán)重 -20
else
exit 0 # 返回 0 ,什么也不做
fi
檢測腳本什么時候執(zhí)行?
檢測腳本時定時執(zhí)行的,時間可以配置,而且主備兩臺機器都會同時執(zhí)行。
通知腳本
#!/bin/bash
# 接收參數(shù), master 或者 backup 或者 ""
function=$1
# 如果觸發(fā)的是 master 的通知腳本
if [ "x"$function = "xmaster" ] ; then
# 1. 新建標(biāo)記文件,標(biāo)志本機為 MASTER
touch master.flag
# 2. 啟動 java 進程
# TODO
# 3. 啟動文件同步服務(wù)
# TODO 這里是因為我的項目需要,所以要開啟這樣一個服務(wù)
else
# 1. 刪除 MASTER 標(biāo)記,標(biāo)記為 BACKUP
rm -f master.flag
# 2. 關(guān)閉 java 進程
# TODO 為了保險一點,再關(guān)閉一次
# 3. 關(guān)閉文件同步服務(wù)
# TODO
fi
通知腳本什么時候執(zhí)行?
只有當(dāng)狀態(tài)發(fā)生切換時(包括 keepalived 啟動時),才會觸發(fā)對應(yīng)的通知腳本。
執(zhí)行流程
首先是準備兩臺機器比如 Server A 和 Server B,分別部署我們的 java 應(yīng)用 和 keepalived,甚至其他可能用到的服務(wù),比如我們項目中用的文件同步。
分別啟動兩臺機器的 keepalived 進程,順序無所謂,配置文件都一樣,誰先啟動誰就是 master。
比如 Server A 是 MASTER,keepalived 就會去觸發(fā)我們的通知腳本(notify_master),通知腳本就會創(chuàng)建一個文件標(biāo)記這臺機器是 master,同時啟動我們的 java 進程。Server B 的 keepalived 啟動后,觸發(fā) notify_slave, 結(jié)合腳本所做的事情,我們發(fā)現(xiàn),第一次觸發(fā)并不會造成什么影響,甚至后續(xù)我們可以優(yōu)化一下,減少這些無用功。
當(dāng)我們關(guān)閉 Server A 的 java進程,檢測腳本檢測到 java 進程關(guān)閉了,并且當(dāng)前主機是 MASTER (因為檢測到 master.flag 文件存在),檢測腳本就會返回 1,致使 Server A 的權(quán)重降低 20,也就是比 Server B 低20,此時會在此進行 “選舉”,Server A 就變成了 backup,同時去觸發(fā)notify_slave腳本,Server B 就變成了 master, 同時觸發(fā) notify_master腳本。
根據(jù)兩個腳本做的事情,我們最終發(fā)現(xiàn),兩臺機器不僅發(fā)生了身份切換,并且做的事情也對換了一下。
幾個問題
keepalived 的日志存放位置 : /var/log/messages
如果發(fā)現(xiàn)兩邊都能檢測到虛擬ip,請檢查下 防火墻是否沒有關(guān)閉!
檢測腳本和通知腳本的執(zhí)行順序: 同時執(zhí)行! 這也是我為什么加了 master.flag 的原因。 請仔細體會!
總結(jié)
上述僅僅是一個 demo 方案,并未經(jīng)過生產(chǎn)環(huán)境的考驗,需要打磨的地方很多。另外就是網(wǎng)上做此類方案的案例很少,可能是應(yīng)用不到吧,其他大多方案都是,kill 掉 keepalived 從而完成主備切換。寫這篇文章的主要原因是自己在做的過程中,有很多疑惑,網(wǎng)上沒直接給出答案,其實正常操作的話不會有我這些疑惑,我是因為腳本寫錯了,在我堅定腳本沒問題的時候,去懷疑一些問題,比如權(quán)重改變后就永久生效了,通知腳本是根據(jù)你的狀態(tài)一直在執(zhí)行的!
?---有點兒` 菜!
最后歡迎大家指出其中的問題,或者做一些補充!! 謝謝
總結(jié)
以上是生活随笔為你收集整理的java 主备切换_keepalived 实现 Java 服务的高可用(主备切换)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 复古单机武侠定档!《梦江湖》7月13日正
- 下一篇: 直屏旗舰新标杆!努比亚Z系列七月登场