Keepalived LVS群集

一、Keepalived案例分析

企业应用中,单台服务器承担应用存在单点故障的危险

单点故障一旦发生,企业服务将发生中断,造成极大的危害

二、Keepalived工具介绍

  • 专为LVS和HA设计的一款健康检查工具

  • 支持故障自动切换(Failover)
  • 支持节点健康状态检查(Health Checking)

        判断LVS负载调度器、节点服务器的可用性,当master主机出现故障及时切换到backup节点保证业务正常,当master故障主机恢复后将其从新加入群集并且业务重新切换回master节点

  • 官方网站:http://www.keepalived.org/
  • 补充1:一个合格的群集应该具备的特点

        负载均衡        用于提高群集的性能        LVS Nginx HAProxy SLB F5

        健康检查(探针)        针对于调度器和节点服务器        Keepalived Heartbeat

        故障转移        通过VIP漂移实现主备切换        VRRP 脚本

  • 补充2:健康检查(探针)常用的工作方式

        发送心跳消息        vrrp报文        ping/pong

        TCP端口检查        向目标主机的 IP:PORT 发起TCP连接请求,如果TCP连接三次握手成功则认为健康检查正常,否则认为健康检查异常

        HTTP URL检查        向目标主机的URL路径(比如http://IP:PORT/URI路径)发起 HTTP GET请求方法,如果响应消息的状态码为 2XX 或 3XX,则认为健康检查正常;如果响应消息的状态码为 4XX 或 5XX,则认为健康检查异常

三、Keepalived实现原理剖析

在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP(VIP),主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性

  • Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能
  • VRRP(虚拟路由冗余协议)是针对路由器的一种备份解决方法

        由多台路由器组成一个热备组,通过共用的虚拟IP对外提供服务

        每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态

        若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务

四、Keepalived体系主要模块及其作用

  • core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
  • vrrp模块:是来实现VRRP协议的。(调度器之间的健康检查和主备切换)
  • check模块:负责健康检查,常见的方式有端口检查及URL检查。(节点服务器的健康检查)

五、Keepalived案例讲解

  • Keepalived可实现多机热备,每个热备组可有多台服务器
  • 双机热备的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器
  • 实现基于Web服务的双机热备

        漂移地址:192.168.10.72

        主、备服务器:192.168.10.73、192.168.10.74

        提供的应用服务:Web

六、Keepalived安装与启动

  • 在LVS群集环境中应用时,也需用到ipvsadm管理工具
  • YUM安装Keepalived
  • 启用Keepalived服务
  • 源码编译安装

        下载程序包

tar -zxf keepalived-2.2.8.tar.gz            #解压缩yum -y install openssl-devel
yum install libnl-devel            #安装模块./configure -prefix=/opt/keepalived        #编译
make && make install            #安装

七、部署Keepalived

实验前准备2台服务器

systemctl disable --now firewalld
setenforce 0vim /etc/selinux/configSELINUX=disable

yum install -y keepalived

vim /etc/keepalived/keepalived.conf

  • 主服务器
cd /etc/keepalived
ls
cp keepalived.conf keepalived.bak            #配置文件进行备份
ls

修改配置文件

  • 备服务器

操作相同,配置文件修改稍作更改如下


systemctl start keepalived.service
systemctl enable keepalived.service

主服务器

备服务器


  • 小问题:Keepalived通过什么判断哪台主机为主服务器,通过什么方式配置浮动IP

        Keepalived首先做初始化先检查state状态,master为主服务器,backup为备服务器。
        然后再对比所有服务器的priority,谁的优先级高谁是最终的主服务器。
        优先级高的服务器会通过ip命令为自己的电脑配置一个提前定义好的浮动IP地址。


八、keepalived的抢占与非抢占模式

        抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP
        非抢占式俩节点state必须为bakcup,且必须配置nopreempt。

  • 注意:

        这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了。

九、LVS+Keepalived高可用负载均衡

准备5台服务器

nfs服务器与节点服务器配置见案例:LVS DR模式-CSDN博客

  • 负载调度器(均已安装keepalived服务,见上述部署操作)
yum install -y ipvsadm

modprobe ip_vs            #加载模块
lsmod | grep ip_vs

touch /etc/sysconfig/ipvsadm
systemctl start ipvsadm
systemctl enable ipvsadm
systemctl status ipvsadm

vim /etc/keepalived/keepalived.conf

TCP端口检查方式

systemctl start keepalived.service
ip a

主服务器

备服务器

ipvsadm -ln            #规则已自动生成

  • 检验

刷新

将主服务器宕机后,备服务器启用,结果与以上情况相同

十、实现master/master双主架构

  • 配置
#服务器1的配置keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id lb01 # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
}vrrp_instance VI_1 {state MASTER # 在另一个主机上为BACKUPinterface ens33virtual_router_id 51 # 每个vrrp_instance唯一priority 100 # 在另一个主机上为50,保证能选出主advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.10 dev ens33 label ens33:0    # 指定vrrp_instance的VIP和label}
}vrrp_instance VI_2 { # 再定义一个虚拟路由器VI_2实例state BACKUP # 在另一个主机上为MASTERinterface ens33virtual_router_id 61 # 每个vrrp_instance唯一priority 50 # 在另一个主机上为100,保证能选出主advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.50 dev ens33 label ens33:1     # 指定vrrp_instance的VIP和label}
}
#服务器2的配置 keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id lb02 # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
}vrrp_instance VI_1 {state BACKUP # 此行修改为BACKUPinterface ens33virtual_router_id 51priority 50 # 此行修改为50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.10 dev ens33 label ens33:0}
}vrrp_instance VI_2 {state MASTER # 此行修改为MASTERinterface ens33virtual_router_id 61priority 100 # 此行修改为100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.50 dev ens33 label ens33:1}
}
  • 验证
# 重启keepalived服务:在两台设备上都执行:
systemctl restart keepalived# 查看两个节点各自的VIP
[root@lb01 keepalived]# ip a | egrep "10.0.0.10|0.50"inet 10.0.0.10/32 scope global ens33:0
[root@lb02 keepalived]# ip a | egrep "10.0.0.10|0.50"inet 10.0.0.50/32 scope global ens33:1

十一、Nginx实现高可用

  • yum方式安装的配置文件/etc/keepalived
#主服务器配置
vi keepalived.conf
keepalived.conf:
#检测脚本
vrrp_script chk_http_port {script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动interval 2                          #(检测脚本执行的间隔,单位是秒)weight 2                            #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {state MASTER            # 指定keepalived的角色,MASTER为主,BACKUP为备interface ens33         # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡virtual_router_id 66    # 虚拟路由编号,主从要一直priority 100            # 优先级,数值越大,获取处理请求的优先级越高advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)#授权访问authentication {auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信auth_pass 1111}track_script {chk_http_port            #(调用检测脚本)}virtual_ipaddress {192.168.16.130            # 定义虚拟ip(VIP),可多设,每行一个}
}
#备服务器配置
#检测脚本
vrrp_script chk_http_port {script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本,检测nginx是否启动interval 2                          #(检测脚本执行的间隔)weight 2                            #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {state BACKUP                        # 指定keepalived的角色,MASTER为主,BACKUP为备interface ens33                      # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡virtual_router_id 66                # 虚拟路由编号,主从要一直priority 99                         # 优先级,数值越大,获取处理请求的优先级越高advert_int 1                        # 检查间隔,默认为1s(vrrp组播周期秒数)#授权访问authentication {auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信auth_pass 1111}track_script {chk_http_port                   #(调用检测脚本)}virtual_ipaddress {192.168.16.130                   # 定义虚拟ip(VIP),可多设,每行一个}
}
  • 检测脚本
#!/bin/bash
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then    #如果nginx没有启动就启动nginx                        systemctl start nginx                #重启nginxif [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重启失败,则停掉keepalived服务,进行VIP转移killall keepalived                    fi
fi
  • 实验

实验环境同LVS+Keepalived高可用负载均衡,负载调度器配置不同

  • 负载调度器配置(均已使用yum安装完nginx)

nginx -V

cd /etc/nginx
vim nginx.conf

nginx -t
systemctl enable --now nginx

  • 测试

刷新


另一台配置同上测试结果相同


  • 高可用操作
yum install -y keepalived

cd /etc/keepalived
touch check_nginx.sh
vim check_nginx.sh#!/bin/bashif !killall -0 nginx &> /dev/nullthensystemctl stop keepalived
fichmod +x check_nginx.sh

vim keepalived.conf
systemctl start keepalived
systemctl enable keepalived
ip a

主服务器

备服务器

  • 测试

刷新

尝试故障转移测试(关闭主服务器nginx后keepalived也停止运行)

VIP转移到备服务器,且测试结果同上

若需要还原,则因为脚本的缘故,应先启动主服务器nginx服务再启动keepalived

十二、Keepalived脑裂故障

  • 现象

        主服务器和备服务器都同时拥有相同的VIP

  • 原因

        因为主服务器和备服务器的通信中断,导致备服务器无法收到主服务器发送的VRRP报文,备服务器误认为主服务器已经故障了并通过ip命令生成VIP

  • 解决

        关闭主服务器或备服务器其中一个的keepalived服务

  • 预防

        如果是系统防火墙导致,则关闭防火墙或添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输
        如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信
        在主服务器使用脚本定时判断与备服务器通信链路是否中断,如果判断是主备服务器之间的链接中断则自行关闭主服务器上的keepalived服务

#主服务器脚本#!/bin/bash
while true
do
ping -c4 -i 0.5 -W 2 备服务器IPif 「 $? -ne 0 ]then ssh 另一台主机IP ping -c 4 -i 0.5 -W2 -I 另一台主机IP 备服务器IPif [ $? -eg 0 ]then systemctl stop keepalivedfifi
sleep 20
done

        利用第三方应用或监控系统检测是否发生了脑裂故障现象,如果确认发生了脑裂故障则通过第三方应用或监控系统来关闭主服务器或备服务器其中一个的keepalived服务

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

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

相关文章

OceanMind海睿思成功签约南京市交通集团,助力集团数字化转型高效推进!

近日,中新赛克海睿思与南京市政府批准成立的市级国有全资公司——南京市交通建设投资控股(集团)有限责任公司(以下简称“南京市交通集团”)达成深度战略合作,为南京市交通集团提供数据中心及监管数据管理平…

2.4G低功耗无线收发SOC芯片-SI24R03

随着物联网产业对集成度的需求越来越高, 也在不断地完善公司产品生态。 “射频MCU”产品组合--无线SOC芯片(MCU),简化了系统设计。只需要少量的外围器件,用户即可实现产品的开发,有效减少了PCB板的占用…

vue关闭页面时触发的函数(ai生成)

在Vue中,可以通过监听浏览器的beforeunload事件来在关闭页面前触发函数。这里是一个简单的示例: new Vue({el: #app,methods: {handleBeforeUnload(event) {// 设置returnValue属性以显示确认对话框event.returnValue 你确定要离开吗?;// 在…

什么是校园抄表系统?

1.校园抄表系统的简述 校园抄表系统是当代高校管理中的一个重要组成部分,主要运用于全自动搜集、管理方法与分析校园里的电力能源使用数据,如水电煤等。它通过先进的方式方法,完成了对能源消耗的实时监控系统,提升了电力能源管理…

(源码)一套医学影像PACS系统源码 医院系统源码 提供数据接收、图像处理、测量、保存、管理、远程医疗和系统参数设置等功能

PACS系统还提供了数据接收、图像处理、测量、保存、管理、远程医疗和系统参数设置等功能。 PACS系统提高了医学影像的利用率和诊疗效率,为医生提供了更加准确和及时的诊断依据。它是医院信息化的必备系统之一,已经成为医学影像管理和传输的重要工具。 P…

忆捷硬盘数据恢复方法有哪些?常见的有这四种

在数字化时代,硬盘作为存储大量数据的重要设备,其安全性与可靠性直接关系到我们的工作和生活。然而,无论是由于误操作、病毒感染还是硬件故障,硬盘数据丢失的情况时有发生。对于使用忆捷硬盘的用户来说,如何在数据丢失…

从零手写实现 nginx-22-modules 模块配置加载

前言 大家好,我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的,可以参考我的另一个项目: 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

DETR实现目标检测(二)-利用自己训练的模型进行预测

1、图片预测(CPU) 关于DETR模型训练自己的数据集参考上篇文章: DETR实现目标检测(一)-训练自己的数据集-CSDN博客 训练完成后的模型文件保存位置如下: 准备好要预测的图片: 然后直接调用模型进行预测,并设…

linux部署运维3——centos7.9离线安装部署配置涛思taos2.6时序数据库TDengine以及java项目链接问题处理(二)

上一篇讲了centos7.9如何安装涛思taos2.6时序数据库的操作步骤和方案,本篇主要讲解taos数据库的初始化,相关配置说明,数据库和表的创建问题以及java项目连接问题。 centos7.9如何离线安装taos2.6,请点击下方链接详细查看&#xf…

React的@reduxjs/toolkit的异步方法处理和实现

一、使用异步方法,需要 createAsyncThunk 函数 1.首先在特定的ts文件中建立异步 const fetchArticles=createAsyncThunk(searchArticle/fetchArticles,async({SearchKey,type},thunkAPI)=>{const params = {Filter: SearchKey,PageSize: 10,PageNum: 1,ArticleType: &quo…

YOLOv5改进 | Head | 将yolov5的检测头替换为ASFF_Detect

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 在目标检测中,为了解决尺度变化的问题,通常采用金字塔特征表示。然而,对于基于特征金字塔的单次检测器来…

Python中的pass语句

在Python编程语言中,pass是一个特殊的语句,它并不执行任何操作,仅仅用作占位符。当我们在编写代码时,有时需要定义一个空的代码块或函数,但又不想立即实现它,这时候pass语句就派上了用场。pass语句可以帮助…

h5页面上传图片安卓手机无法调用摄像头

<input type”file”> 在ios中&#xff0c;会 而安卓中&#xff0c;没有这些选项 解决方法&#xff1a; 给input 加上accept属性 <input type”file” accept”image/*” /> //调用相机 &#xff0c;图片或者相册 &#xff08;两者都行&#xff09; 加上了cap…

MYSQL 查看SQL执行计划

一、explain explain select id,db,user,host,command,time,state,info from information_schema.processlist order by time desc; id: 查询的标记&#xff0c;可以查看不同查询的执行顺序。 select_type: 查询的类型&#xff0c;如SIMPLE、SUBQUERY、PRIMARY等。 table: …

本地Zabbix开源监控系统安装内网穿透实现远程访问详细教程

文章目录 前言1. Linux 局域网访问Zabbix2. Linux 安装cpolar3. 配置Zabbix公网访问地址4. 公网远程访问Zabbix5. 固定Zabbix公网地址 &#x1f4a1;推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【…

web前端按值传递:深入剖析与探索

web前端按值传递&#xff1a;深入剖析与探索 在Web前端开发中&#xff0c;按值传递是一种重要的参数传递方式。然而&#xff0c;其背后的机制、影响以及在实际应用中的使用技巧&#xff0c;往往让开发者感到困惑。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;…

Ollama在windows上的设置

下载 Download Ollama on macOS 安装&#xff1a;是不可以选择安装路径&#xff0c;系统自动运行&#xff0c;不启动模型不占用GPU 参数设置&#xff1a;windows添加环境变量&#xff08;需要重启ollama&#xff09; 修改模型位置&#xff1a;添加 OLLAMA_MODELS D:\LLM\Oll…

【必会面试题】TCP协议的粘包拆包

目录 TCP数据报文结构粘包拆包如何处理粘包和拆包 TCP协议的粘包和拆包是数据传输过程中常见的现象&#xff0c;它们不是TCP协议本身的设计目的&#xff0c;而是基于TCP协议的特性自然产生的结果。 TCP数据报文结构 字段名English Name长度&#xff08;比特&#xff09;描述源…

军用FPGA软件 Verilog语言的编码准测之时钟

军用FPGA软件 Verilog语言的编码准测之时钟 语言 &#xff1a;Verilg HDL EDA工具&#xff1a;ISE、Vivado、Quartus II 军用FPGA软件 Verilog语言的编码准测之时钟一、引言二、基本编程规范之时钟强制准则1----禁止将寄存器的输出直接连接到其他寄存器的时钟管脚。强制准则2--…

ADOQuery中使用Resync解决读取lookup数据不正确的问题

在使用 Delphi2007 的ADOQuery时&#xff0c;遇到一个看到的数据与读取 lookup 数据不一样的问题。 使用 MSSQL数据。有一个存储过程。使用ADOQuery&#xff08;QTY1)获取返回的数据。 如&#xff1a; ID NAME MACHINE QTY 1 JOE XL75…