【keepalived】高可用神器,实现应用的自动主备切换

目录

1.概述

2.配置

3.效果

4.keepalived主备切换原理

5.联系作者


1.概述

什么是keepalived:

keepalived是一个基于VRRP协议来实现的服务高可用方案。VRRP协议,即虚拟路由冗余协议,其一开始提出来是为了解决局域网中配置静态网关出现单点失效的现象的路由协议。

说人话就是,VRRP协议允许一台机器可以拥有一个或者多个虚拟IP。这个虚拟IP首先会与一个实际IP绑定,对这个虚拟IP的访问会打到这个实际IP上,如果这个实际IP挂了,虚拟IP会重新绑定到另一个可用的IP上(俗称IP漂移)。

用来干什么:

对于请求来说,我只需要访问固定的IP地址(虚拟IP),至于后面到底是谁提供的服务是不关心的,只要能持续的提供服务即可。这样自然而然就实现了高可用。

本文要做什么:

本文会用keepalived来实现两个nginx节点之间的高可用。实现当其中一个nginx挂掉之后,虚拟IP漂移到另一个还活着的nginx上的效果。至于其它类型的应用的主备自动切换,使用上是类似的。

本次示例的IP地址规划如下:

192.168.31.20  

master
192.168.31.30backup

nginx的安装这里就不赘述了,可以去看博主另一篇文章:

linx安装nginx__BugMan的博客-CSDN博客

或者另一位作者的文章:

Linux中安装Nginx,很详细_linux安装nginx详细步骤-CSDN博客

2.配置

安装keepalived的方式多种多样,这里我们用yum installed的方式来安装。

yum install -y keepalived

首先我们要在/etc/keepalived/下编写一个check_nginx.sh脚本用来检查nginx是否活着,要是挂了,直接停止当前节点上的keepalived。

#!/bin/bash
counter=$(ps -C nginx --no-headinglwc -1)
  if["${counter]"= "0"]; 
    then systemctl start nginx
    sleep 2
    counter=$(ps -C nginx --no-heading | wc -l)
    if["${counter}"="0"]; 
    then systemctl stop keepalived
  fi
fi

接下来我们配置keepalived.conf:

要注意这里有个天坑:这里的配置文件哪些的括号该换行,哪些的括号该有空格,必须严格和下面的格式对其,就是一个括号没有换行,格式的都会报错!

主节点的keepalived的配置:

#全局配置,路由ID不变
global_defs
{
  router_id LVS_DEVEL
}

vrrp_script chk_nginx
{
  script "/etc/keepalived/check_nginx.sh"
  #时间间隔,单位默认为秒
  interval 2
  #权重,当脚本执行成功或失败,对当前节点的优先级是增加还是减少
  weight -5
}

vrrp_instance VI_1 {
 #主节点
 state MASTER
 #绑定的网卡
 interface enp0s3
 #虚拟路由id,保证主从之间一致
 virtual_router_id 51
 #优先级,高优先级的为主
 priority 101
 #指定发送VRRP通告的间隔,单位秒
 advert_int 2
 #安全认证密码
 authentication {
  auth_type PASS
  auth_pass 1111
 }

 #对外暴露的VIP地址
 virtual_ipaddress
 {
  192.168.31.240
 }

 #指定nginx执行状态脚本
 track_script {
  chk_nginx
 }
}

配置好后我们用systemctl start来启动keepalived,并切查看一下keepalived的启动日志,正常启动的日志会如下:

配置备节点的keepalived:

和主节点只有略微不同,就是state切换为BACKUP,priority优先级比主节点低一些即可。

#全局配置,路由ID不变
global_defs 
{
  router_id LVS_DEVEL
}

vrrp_script chk_nginx 
{
  script "/etc/keepalived/check_nginx.sh"
  #时间间隔,单位默认为秒
  interval 2
  #权重,当脚本执行成功或失败,对当前节点的优先级是增加还是减少
  weight -5
}

vrrp_instance VI_1 {
 #备份节点
 state BACKUP
 #绑定的网卡
 interface enp0s3
 #虚拟路由id,保证主从之间一致
 virtual_router_id 51
 #优先级,高优先级的为主
 priority 100
 #指定发送VRRP通告的间隔,单位秒
 advert_int 2
 #安全认证密码
 authentication {
  auth_type PASS
  auth_pass 1111
 }

 #对外暴露的VIP地址
 virtual_ipaddress 
 {
  192.168.31.240
 }

 #指定nginx执行状态脚本
 track_script {
  chk_nginx
 }
}

启动备节点并查看日志:

3.效果

访问虚拟IP,可以看到请求被打到了主节点上去了:

关掉主节点的keepalived,可以看到从节点立马切换为了主节点:

再访问,请求直接打到了备用节点上面去了:

4.keepalived主备切换原理

到这里我相信不少同学有这样一个疑惑:

备份节点是如何感知到master节点挂掉的?

这里大概聊一聊这个问题。在 Keepalived 主备切换的过程中,备份节点(Backup)是通过一种叫做 VRRP(Virtual Router Redundancy Protocol)协议来感知主节点(Master)的状态的。

VRRP 是一种用于提供冗余路由的协议,其基本原理是将多个路由器组成一个虚拟路由器,这个虚拟路由器有一个虚拟 IP 地址和一个虚拟 MAC 地址。在这个虚拟路由器中,有一个节点被选举为 Master,其他节点成为 Backup。

主备节点之间通过 VRRP 协议交互,主要包括以下步骤:

  1. VRRP 路由器选举: 在一个 VRRP 组中,多个节点参与竞选成为 Master 节点。通过选举算法,其中一个节点成为 Master,负责处理虚拟 IP 地址的数据包。

  2. VRRP 路由器间的心跳: Master 和 Backup 之间定期发送 VRRP 心跳消息,以确保彼此的存活状态。

  3. 检测 Master 节点失效: 如果 Backup 节点在一定时间内没有收到来自 Master 的心跳消息,它将认为 Master 节点失效。

  4. 备份节点接管: 一旦 Backup 节点检测到 Master 节点失效,它会迅速接管虚拟 IP 地址,成为新的 Master。

在 Keepalived 中,VRRP 协议被用于实现高可用性的主备切换。备份节点通过 VRRP 协议感知主节点的状态,当检测到主节点不可用时,备份节点会迅速接管服务,确保服务的可用性。这样,即使主节点出现故障,整个系统仍然能够保持正常运行。

5.联系作者

商务合作、各种交流:

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

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

相关文章

CSS中区分行高,行间距

行高(line height) —文字占有的实际高度 —使用line-height来设置行高 行高类似于我们上学单线本,单线本是一行一行,线与线之间的距离就是行高,控制文字行与行之间的距离, 网页中的文字实际上也是写在一个…

Flink State 状态原理解析 | 京东物流技术团队

一、Flink State 概念 State 用于记录 Flink 应用在运行过程中,算子的中间计算结果或者元数据信息。运行中的 Flink 应用如果需要上次计算结果进行处理的,则需要使用状态存储中间计算结果。如 Join、窗口聚合场景。 Flink 应用运行中会保存状态信息到 …

IDEA加载阿里Java规范插件

IDEA加载阿里巴巴Java开发手册插件,在写代码的时候会自动扫描代码规范。 1、打开Settings 2、打开Plugins 3、搜索Alibaba Java Code Guidelines(XenoAmess TPM)插件,点击Install进行安装,然后重启IDE生效。 4、鼠标右…

测试新手百科:Postman简介、安装、入门使用方法详细攻略!

一、Postman背景介绍 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具。今天给大家介绍的这款网页调试工具不仅可以调试简单的css、html、脚本等简单的网…

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 12 章:多选提示

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 12 章:多选提示 这种技术会向模型提出一个问题或任务,并将一组预定义的选项作为可能的答案。 该技术可用于生成仅限于特定选项集的文本,并可用于问题解答、文本补全和其…

记录一个困难(python)

在从一个网页跳转另一个网页(该网页是登录页面) 采用python的selenium库对网页进行自动化登录 import time from selenium import webdriver path chromedriver.exe driver webdriver.Chrome(path) driver.get("url") time.sleep(2) driver.f…

显存优化 Trick(gradient_accumulation、gradient_checkpointing、xformers)

目录 Out of MemoryGradient AccumulationGradient CheckpointingXformersDiffusers的显存优化 Out of Memory 先来说下OOM问题,其实也是日常会遇到的情况。模型申请的显存超过了设备实际显存大小,则会报错Out of Memory。一般情况下,batch …

java--匿名内部类

1.匿名内部类 ①就是一种特殊的局部内部类;所谓匿名:指的是程序员不需要为这个类声明名字。 ②特点:匿名内部类本质就是一个子类,并会立即创建出一个子类对象。 ③作用:用于更方便的创建一个子类对象。 2.匿名内部类…

Stm32 CubeIDE对RTC的日期、时间读写,后备存储的读写的部分做个补充说明

上一篇文章讲了Stm32 CubeIDE对RTC的日期、时间读写,后备存储的读写,发现几个问题,再次说明一下情况: 1.如果对RTC做初始化: hrtc.Instance RTC;hrtc.Init.HourFormat RTC_HOURFORMAT_24;hrtc.Init.AsynchPrediv 12…

用队列实现栈的功能(c++实现)

使用一个队列实现栈的基本功能&#xff1a;push、pop、判断栈是否为空等&#xff0c;实现的代码如下&#xff1a; #include<iostream> #include<queue> #include<ctime>//计算代码所需要的时间 using namespace std;class MyStack { public:queue<int>…

Dagger2使用

在android引入Dagger2库 //引入Dagger2implementation("com.google.dagger:dagger:2.48.1")annotationProcessor ("com.google.dagger:dagger-compiler:2.48.1") 构造器注入 创建一个类 public class Car {//在构造器上面添加dagger的Inject即可Injectp…

Java利用UDP实现简单群聊

一、创建新项目 首先新建一个新的项目&#xff0c;并按如下操作 二、实现代码 界面ChatFrame类 package 群聊; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.net.InetAddress; public abstract class ChatFrame extends JFrame { p…

C语言之多维数组

所谓多维数组就是以多个数组为单位组成的数组&#xff0c;即元素本身是数组的数组。下面我们来学习多维数组的基本知识&#xff1a; 多维数组 上一节学习的数组都是int型或double型等单一类型&#xff0c;实际上数组本身也可以作为组成数组的元素。 以数组作为元素的数组时二…

JavaBean是什么

详情请参考JavaBean规范&#xff1a;https://www.oracle.com/java/technologies/javase/javabeans-spec.html JavaBean是可重用的软件组件&#xff0c;是一个java类&#xff0c;方法名称符合一定的规范&#xff0c;这样使用方使用起来方便&#xff0c;例如框架和工具可以根据规…

Java架构师系统架构设计原则应用

目录 1 导语2 如何设计高并发系统:局部并发原则3 如何设计高并发系统:服务化与拆分4 高可用系统有哪些设计原则?5 如何保持简单轻量的架构-DRY、KISS,YAGNI原则6 如何设计组件间的交互和行为-HCLC,CQS,SOC7 框架层面的发展趋势-约定大于配置想学习架构师构建流程请跳转:…

[leetcode 差分数组] 拼车 M

车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整数 capacity 和一个数组 trips , trip[i] [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客&#xff0c;接他们和放他们…

C++11:智能指针

文章目录 前言正文(1) 三种智能指针(2) 智能指针的设计思路(3) unique_ptrunique_ptr的几种初始化方法获取unique_ptr的地址unique_ptr的使用 (4) shared_ptr 前言 一般来说&#xff0c;我们想要在堆上开辟内存空间需要使用关键字new&#xff0c;但由于使用new之后我们还是需要…

【数据结构】动态规划(Dynamic Programming)

一.动态规划&#xff08;DP&#xff09;的定义&#xff1a; 求解决策过程&#xff08;decision process&#xff09;最优化的数学方法。 将多阶段决策过程转化为一系列单阶段问题&#xff0c;利用各阶段之间的关系&#xff0c;逐个求解。 二.动态规划的基本思想&#xff1a; …

cpper绝不当炮灰选手-剑指大厂-c++后端面试大成攻略副本

针对于c后端&#xff0c;本文会直接从面试角度出发&#xff0c;盘点整理在c后端面试中出现的面试题型与经典题目。 包含&#xff1a; c/c&#xff08;36道&#xff09; 设计模式&#xff08;14道&#xff09; 数据结构与算法&#xff08;35道&#xff09; 操作系统&#xf…

【vue】点击导航菜单切换局部页面,打开展示默认栏目,页面刷新等问题

非专业前端&#xff0c;局限性较高&#xff0c;有些问题看起来很小&#xff0c;但是初次接触很棘手&#xff0c;需要查找很多博客&#xff0c;内容也很杂。以下只是过程中总结下来的&#xff0c;要解决的就是标题中的三个问题。 这是我需要达成的效果。 1.第一个是进入导航菜单…