当前位置: 首页 > news >正文

【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.联系作者

商务合作、各种交流:

相关文章:

  • 【网络奇缘】- 计算机网络|分层结构|深入学习ISO模型
  • 怎么检测电脑电源?电脑电源检测系统软件如何助力?
  • 云轴科技ZStack助力龙芯打造IT产业新生态
  • DAPP开发【11】IPFS星际文件管理系统
  • 分享一个Python网络爬虫数据采集利器
  • InST论文复现
  • python进行文件批量命名
  • Istio可观测性
  • leetcode 1658. 将 x 减到 0 的最小操作数(优质解法)
  • Mac卸载、安装Python
  • 【带头学C++】----- 九、类和对象 ---- 9.1 类和对象的基本概念----(9.1.4---9.1.6)
  • Nginx实现(动静分离)
  • python实现一个计算器
  • Linux--程序地址空间
  • 数据库系统原理【练习题】——第一章:概述
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • $translatePartialLoader加载失败及解决方式
  • angular组件开发
  • AWS实战 - 利用IAM对S3做访问控制
  • const let
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • idea + plantuml 画流程图
  • Map集合、散列表、红黑树介绍
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Redis在Web项目中的应用与实践
  • Spark学习笔记之相关记录
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • spring学习第二天
  • Swoft 源码剖析 - 代码自动更新机制
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 力扣(LeetCode)22
  • 世界上最简单的无等待算法(getAndIncrement)
  • 优化 Vue 项目编译文件大小
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • ​虚拟化系列介绍(十)
  • #14vue3生成表单并跳转到外部地址的方式
  • (4.10~4.16)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)u-boot-nand.bin的下载
  • (原創) 未来三学期想要修的课 (日記)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .“空心村”成因分析及解决对策122344
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)