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 # 结合 keepalived.conf 配置文件,这里返回 1 表示当前机器权重 -20

else

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 这里是因为我的项目需要,所以要开启这样一个服务

else

# 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 从而完成主备切换。写这篇文章的主要原因是自己在做的过程中,有很多疑惑,网上没直接给出答案,其实正常操作的话不会有我这些疑惑,我是因为脚本写错了,在我坚定脚本没问题的时候,去怀疑一些问题,比如权重改变后就永久生效了,通知脚本是根据你的状态一直在执行的!

​---有点儿` 菜!

最后欢迎大家指出其中的问题,或者做一些补充!! 谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HDU - 2444】The Accomodation of Students(二分图判断 + 匈牙利算法求最大匹配)

题干: There are a group of students. Some of them may know each other, while others dont. For example, A and B know each other, B and C know each other. But this may not imply that A and C know each other. Now you are given all pairs of studen…

最长上升子序列 java_最长上升子序列 O(nlogn)解法 (java)

最长递增子序列问题&#xff1a;在一列数中寻找一些数&#xff0c;这些数满足&#xff1a;任意两个数a[i]和a[j]&#xff0c;若i 设dp[i]表示以i为结尾的最长递增子序列的长度&#xff0c;则状态转移方程为&#xff1a; dp[i] max{dp[j]1}, 1<j 这样简单的复杂度为O(n^2)&a…

C++关于引用的注意事项 总结知识点

对函数的引用&#xff1a; #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #def…

中介者模式java_图解Java设计模式之中介者模式

智能家庭项目1)智能家庭包括各种设备&#xff0c;闹钟、咖啡机、电视机、窗帘等2)主人要看电视时&#xff0c;各个设备可以协同工作&#xff0c;自动完成看电视的准备工作&#xff0c;比如流程为 &#xff1a;闹铃响起 - 》咖啡机开始做咖啡 -》窗帘自动落下 -》电视机开始播放…

python 自动驾驶线性识别路段

python视觉库 OpenCV:OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。它可以用于图像处理、对象识别、特征提取、图像分割等。 Matplotlib:Matplotlib是一个绘图库,可用于创建高质量的二维图表和绘图。它提供了类似于MATLAB的绘图接口,使用户可以…

【CodeForces - 202A】LLPS (思维,字符串)

题干&#xff1a; This problems actual name, "Lexicographically Largest Palindromic Subsequence" is too long to fit into the page headline. You are given string s consisting of lowercase English letters only. Find its lexicographically largest p…

elementui表格宽度适应内容_elementui表格中的列怎么实现自适应列宽

elementui表格中的列怎么实现自适应列宽发布时间&#xff1a;2020-12-28 14:58:04来源&#xff1a;亿速云阅读&#xff1a;53作者&#xff1a;Leah这期内容当中小编将会给大家带来有关elementui表格中的列怎么实现自适应列宽&#xff0c;文章内容丰富且以专业的角度为大家分析和…

【POJ - 2398】Toy Storage (计算几何,二分找位置,叉积,点和直线的位置关系)

题干&#xff1a; Mom and dad have a problem: their child, Reza, never puts his toys away when he is finished playing with them. They gave Reza a rectangular box to put his toys in. Unfortunately, Reza is rebellious and obeys his parents by simply throwing …

【POJ - 1269 】Intersecting Lines (计算几何,直线间的位置关系)

题干&#xff1a; We all know that a pair of distinct points on a plane defines a line and that a pair of lines on a plane will intersect in one of three ways: 1) no intersection because they are parallel, 2) intersect in a line because they are on top of …

java servlet 转发和重定向_JavaWeb(一)Servlet中乱码解决与转发和重定向的区别

前言前面其实已经把Servlet中所有的内容都介绍完了&#xff0c;这篇讲补充一点乱码和重定向与转发之间的区别&#xff01;一、request请求参数出现乱码问题1.1、get请求1)乱码示例get请求的参数是在url后面提交过来的&#xff0c;也就是在请求行中。结果&#xff1a;Servlet_de…

【POJ - 3304 】Segments(计算几何,思想转化,直线和线段相交)

题干&#xff1a; Given n segments in the two dimensional space, write a program, which determines if there exists a line such that after projecting these segments on it, all projected segments have at least one point in common. Input Input begins with a…

java调用lingo_使用Lingo增强JMS

虽然activemqjencks的jms轻量级解决方案已经很好地在psa中work了&#xff0c;尤其spring的JmsTemplate使得代码更简单&#xff0c;但是还是存在问题。问题来自暑期做psa的时候&#xff0c;linke突然提出要求&#xff0c;需要MDP返回些处理信息&#xff0c;比如处理结果、异常&a…

jsk Star War (线段树维护区间最小最大值 + 二分)

Description 公元20XX年&#xff0c;人类与外星人之间的大战终于爆发。 现有一个人类军团&#xff0c;由n名士兵组成&#xff0c;第i个士兵的战斗力值对应一个非负整数ai (1 \leq i \leq n1≤i≤n)。 有一天&#xff0c;某个战力爆表的外星人NaN单独向地球人宣战&#xff0c…

java jsp导出pdf文件_JSP页面导出PDF格式文件

JSP页面导出PDF格式文件基本在前端页面可以全部完成添加下载链接的点击事件var downPdf document.getElementById("downLoad");downPdf.onclick function() {downPdf.parentNode.removeChild(downPdf);html2canvas(document.body, {onrendered:function(canvas) {v…

【51Nod - 1094】和为k的连续区间 (前缀和,二分查找)

题干&#xff1a; 一整数数列a1, a2, ... , an&#xff08;有正有负&#xff09;&#xff0c;以及另一个整数k&#xff0c;求一个区间i,ji,j&#xff0c;(1 < i < j < n)&#xff0c;使得aii ... ajj k。 Input 第1行&#xff1a;2个数N,K。N为数列的长度。K为需…

简述java的线程_Java多线程的简述

线程与进程进程&#xff1a;​ 是指一个内存中运行的应用程序&#xff0c;每个进程都有一个独立的内存空间&#xff0c;一个应用程序可以同时运行多个进程&#xff1b;进程也是程序的一次执行过程&#xff0c;是系统运行程序的基本单位&#xff1b;系统运行一个程序即是一个进程…

【POJ - 3253】Fence Repair(贪心,时光倒流)

题干&#xff1a; Description Farmer John wants to repair a small length of the fence around the pasture. He measures the fence and finds that he needs N (1 ≤ N ≤ 20,000) planks of wood, each having some integer length Li (1 ≤ Li ≤ 50,000) units. He t…

java unsafe park_Java中Unsafe类详解

http://www.cnblogs.com/mickole/articles/3757278.htmlJava不能直接访问操作系统底层&#xff0c;而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作&#xff0c;主要提供了以下功能&#xff1a;1、通过Unsafe类可以分配内存&#xff0c;可以释放内存&#xff1b;类中…

【CodeForces - 124D】Squares (旋转坐标系,计算几何,思维)

题干&#xff1a; You are given an infinite checkered field. You should get from a square (x1; y1) to a square (x2; y2). Using the shortest path is not necessary. You can move on the field squares in four directions. That is, when you are positioned in any…

java图形设计_java图形界面设计含答案

十一章 图形用户界面程序设计入门一&#xff0e;选择题&#xff1a;1. 容器Panel和applet缺省使用的布局编辑策略是 BA、BorderLayout B、FlowLayoutC、GridLayout D、CarLayout2. .applet类的直接父类是&#xff1a; BA、Component类 B、Container类C、Frame类 D、Panel类3. .…