java主备切换_keepalived实现Java服务的高可用(主备切换)

更新时间:2023-07-01 19:53:11 阅读: 评论:0

java主备切换_keepalived实现Java服务的⾼可⽤(主备切
换)
前⾔
本⽂要说的是基于 keepalived 实现两台服务器之间的主备切换,从⽽实现 Java 服务的⾼可⽤。keepalived 的原理不多做介绍,⾃⾏搜索了解,keepalived 的安装部署请参考 keepalived 的安装及使⽤ 。
个⼈建议
不要沉迷于 死扣 和 理解 原理,⽹上关于原理的⽂章⼤同⼩异,关键词就是 虚拟ip,了解个⼤概,动⼿实践下,结合 keepalived 的配置⽂件会更好。
项⽬描述
我所做的项⽬是不是⼀个 web 程序,主要功能是定时从⽂件服务器下载⽂件,然后做⼀些处理,放到本地。
需求
当⼀台服务器部署的系统出现故障时,能够有备⽤机器继续提供服务,尽量避免⼈⼯介⼊去恢复系统。注意跟负载均衡的区别!初步⽅案只提供⼀台备⽤机。
⽅案
1. 实现原理
keepalived 的配置⽂件中有 权重 和 STATE 两个配置项,两台机器上的 keepalived 通过 虚拟IP 绑定之后,它们之间就可以通过上述的配置项来进⾏ ”选举“ ,区分 MASTER 和 BACKUP 。
然后配合 keepalived 中另外的两个功能,检测脚本 和 通知脚本 实现我们的主备切换的需求。
到底如何决定 MASTER 和 BACKUP ?
STATE 的值可以是 MASTER 和 BACKUP,当 两台机器配置的 STATE 的值相同,并且权重相同时,谁先启动谁是 MASTER,当两台机器的配置的 权重 相同时,state 为 MASTER 的那台机器最终会成为 MASTER(哪怕这台机器启动的时间⽐另⼀台晚)
检测脚本的作⽤
对我们的使⽤场景来说,检测脚本的作⽤有两个,⼀是检测我们的 java 进程是否存在,⼆是对 keepalived 的权重进⾏加减。⽐如: 检测到我们的 java 进程关闭了,我们就可以降低这台机器的权重。
权重改变是永久⽣效的吗?
否, 权重的增加或者降低只对当前⼀轮的检测有效!下次检测开始还会恢复到配置的默认值。
通知脚本的作⽤
通知脚本有两种,分别根据 keepalived 的状态去触发。对我们的使⽤场景来说,这两种分别是: **⼀个是当这台机器是 MASTER 时需要触发的脚本,⼆是当这台机器是 BACKUP 的时候需要触发的脚本。**⽐如: 当我们的机器变成 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 秒执⾏⼀次
weight -20 # 权重 -20 ,根据检测脚本的返回值去判断是否要减掉
}
# vrrp 实例
vrrp_instance VI_1 {
state BACKUP # 主备配置⼀样,并且权重也⼀样,这样谁先启动谁就是 MASTER interface eth0
virtual_router_id 90
priority 100 # 默认权重
advert_int 1
authentication {
氙气灯泡auth_type PASS
auth_pass keepalived_ms
}高铁抢票
virtual_ipaddress {
172.16.10.90 # 虚拟 ip
}
# 引⽤检测脚本,因为可以配置多个 vrrp 实例,每个实例都可以使⽤同⼀个检测脚本track_script {
chk
}
# 配置通知脚本的路径,脚本名称随意
# 1. 当 keepalived 的状态为 MASTER 时,会触发这个通知脚本
notify_master "/etc/keepalived/notify.sh master"
# 2. 与 1 相反
notify_backup "/etc/keepalived/notify.sh backup"
}
检测脚本
#!/bin/bash
# 查找java服务进程个数
count=`ps aux | grep -v grep | grep 进程名称 | wc -l`
# master.flag 就是⼀个标记⽂件,如果⽂件存在,表⽰为 master
# 如果 MASTER 上的服务down 掉,降低权重
# 如果 MASTER 上的服务没有问题,权重不变
# 如果是BACKUP ,权重保持不变
if [ -f master.flag ] && [ $count -eq 0 ]; then
exit 1 # 结合 f 配置⽂件,这⾥返回 1 表⽰当前机器权重 -20 el
exit 0 # 返回 0 ,什么也不做
fi
检测脚本什么时候执⾏?
检测脚本时定时执⾏的,时间可以配置,⽽且主备两台机器都会同时执⾏。
通知脚本
#!/bin/bash
# 接收参数, master 或者 backup 或者 ""
function=$1
# 如果触发的是 master 的通知脚本
if [ "x"$function = "xmaster" ] ; then
# 1. 新建标记⽂件,标志本机为 MASTER
touch master.flag
# 2. 启动 java 进程
# TODO
# 3. 启动⽂件同步服务
# TODO 这⾥是因为我的项⽬需要,所以要开启这样⼀个服务
el
# 1. 删除 MASTER 标记,标记为 BACKUP
rm -f master.flag
# 2. 关闭 java 进程
# TODO 为了保险⼀点,再关闭⼀次
# 3. 关闭⽂件同步服务
# TODO
fi
通知脚本什么时候执⾏?
只有当状态发⽣切换时(包括 keepalived 启动时),才会触发对应的通知脚本。
执⾏流程
⾸先是准备两台机器⽐如 Server A 和 Server B,分别部署我们的 java 应⽤ 和 keepalived,甚⾄其他可能⽤到的服务,⽐如我们项⽬中⽤的⽂件同步。
分别启动两台机器的 keepalived 进程,顺序⽆所谓,配置⽂件都⼀样,谁先启动谁就是 master。
⽐如 Server A 是 MASTER,keepalived 就会去触发我们的通知脚本(notify_master),通知脚本就会创建⼀个⽂件标记这台机器是master,同时启动我们的 java 进程。Server B 的 keepalived 启动后,触发 notify_slave, 结合脚本所做的事情,我们发现,第⼀次触发并不会造成什么影响,甚⾄后续我们可以优化⼀下,减少这些⽆⽤功。
当我们关闭 Server A 的 java进程,检测脚本检测到 java 进程关闭了,并且当前主机是 MASTER (因为检测到 master.flag ⽂件存在),检测脚本就会返回 1,致使 Server A 的权重降低 20,也就是⽐ Server B 低20,此时会在此进⾏ “选举”,Server A 就变成了backup,同时去触发notify_slave脚本,Server B 就变成了 master, 同时触发 notify_master脚本。花草风景图片
根据两个脚本做的事情,我们最终发现,两台机器不仅发⽣了⾝份切换,并且做的事情也对换了⼀下。
雷蒙阿隆⼏个问题
keepalived 的⽇志存放位置 : /var/log/messages
如果发现两边都能检测到虚拟ip,请检查下 防⽕墙是否没有关闭!
检测脚本和通知脚本的执⾏顺序: 同时执⾏! 这也是我为什么加了 master.flag 的原因。 请仔细体会!
总结
上述仅仅是⼀个 demo ⽅案,并未经过⽣产环境的考验,需要打磨的地⽅很多。另外就是⽹上做此类
⽅案的案例很少,可能是应⽤不到吧,其他⼤多⽅案都是,kill 掉 keepalived 从⽽完成主备切换。写这篇⽂章的主要原因是⾃⼰在做的过程中,有很多疑惑,⽹上没直接给出答案,其实正常操作的话不会有我这些疑惑,我是因为脚本写错了,在我坚定脚本没问题的时候,去怀疑⼀些问题,⽐如权重改变后就永久⽣效了,通知脚本是根据你的状态⼀直在执⾏的!
---有点⼉` 菜!
最后欢迎⼤家指出其中的问题,或者做⼀些补充!! 谢谢
>酸菜包子

本文发布于:2023-07-01 19:53:11,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1072750.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:脚本   检测   权重   机器
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图