LVS+Keepalived 高可用集群搭建

news2025/4/12 14:59:33

 一、高可用集群:

1.什么是高可用集群:


高可用集群(High Availability Cluster)是以减少服务中断时间为目地的服务器集群技术它通过保护用户的业务程序对外不间断提供的服务,把因软件、硬件、人为造成的故障对业务的影响降低到最小程度。

2.高可用的自动切换/故障转移(FailOver)


通俗地说,即当A无法为客户服务时,系统能够自动地切换,使B能够及时地顶上继续为客户提供服务,且客户感觉不到这个为他提供服务的对象已经更换。 通过上面判断节点故障后,将高可用集群资源(如VIP、httpd等)从该不具备法定票数的集群节点转移到故障转移域(Failover Domain,可以接收故障资源转移的节点)。

3.高可用中的自动侦测:


自动侦测阶段由主机上的软件通过冗余侦测线,经由复杂的监听程序,逻辑判断,来相互侦测对方运行的情况。 常用的方法是:集群各节点间通过心跳信息判断节点是否出现故障。

4.脑裂现象:


在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。

5.脑裂的原因:


因心跳线坏了(包括断了,老化)。 因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。 因心跳线间连接的设备故障(网卡及交换机)。 因仲裁的机器出问题(采用仲裁的方案)。 高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。 其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。

  二、keepalived原理与简介:

1.keepalived是什么


keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。

2.keepalived工作原理:


keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。

将N台提供相同功能的服务器组成一个服务器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该服务器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master

3.keepalived主要有三个模块:


分别是core、check和vrrp。 core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。 check负责健康检查,包括常见的各种检查方式。 vrrp模块是来实现VRRP协议的。

 三、VRRP虚拟路由冗余协议

虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP)是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议,1998年已推出正式的RFC2338协议标准。

VRRP广泛应用在边缘网络中,它的设计目标是支持特定情况下IP数据流量失败转移不会引起混乱,允许主机使用单路由器,以及即使在实际第一跳路由器使用失败的情形下仍能够维护路由器间的连通性。

那么这个VRRP协议是干嘛用呢?传统上来说我们通过一个路由器上网,如果故障那就不能用了,如果使用2个路由器,有一个故障你就需要手动的设置客户端切换到另外的路由器上,或者使用ARP客户端也可以实现,但总之部署比较麻烦不利于管理,就像下图

image

有没有一种办法可以自动转移而省去手动配置呢?我们就可以通过VRRP协议来实现路由器的故障转移。如下图

image

虚拟路由器是VRRP备份组中所有路由器的集合,它是一个逻辑概念,并不是正真存在的。从备份组外面看备份组中的路由器,感觉组中的所有路由器就像一个 一样,可以理解为在一个组中: 主路由器+所有备份路由器=虚拟路由器。

四、LVS+keepalived高可用集群的大致工作流程: 

在lvs没有实现高可用之前,我们的架构是一台lvs服务器和两台web服务器,由lvs做负载均衡, 将用户的请求按照一定的负载均衡算法,分发给两台web服务器。然而,这种架构有一个很大的痛点,由于我们访问web服务器是由lvs来进行负载均衡,也就是必须经过lvs服务器,从而访问到real-server也就是我们的web服务器。那么当lvs服务器挂掉之后 ,我们就无法达到均衡的去访问web服务器了。所以我们必须使用高可用技术,就是配置两台lvs服务器,在这两台lvs服务器上面都安装上keepalived。在正常情况下,一台lvs服务器作为master另一台lvs服务器作为backup,虚拟的vip只在master服务器上出现。我们只对外暴露出vip让客户进行访问,并不将真实的web服务器的ip暴露给用户,这样能够保证我们web服务器的安全,所以客户只能通过vip来访问我们的web服务器。 当客户通过vip来访问web服务器的时候,会先经过带有vip的服务器,也就是master,再通过master来进行负载均衡。当发生特殊情况:master服务器挂了的时候。此时的vip就会自动跳到backup服务器上,此时我们通过vip来访问web服务器的时候,也会先经过带有vip的服务器,也就是backup,再通过backup来进行负载均衡,从而实现了lvs的高可用。

 五、搭建LVS+Keepalived 高可用集群

服务器说明IPopenEuler主机名称
lvs调度器192.168.46.110lvs01
lvs调度器192.168.46.120lvs02
web服务器192.168.46.130server1
web服务器192.168.46.140server2
client192.168.46.150client

DIP: 192.168.46.100

1. 配置lvs调度器(以master为例)

(1)安装LVSkeepalived软件包

yum install -y keepalived ipvsadm

# 检查LVS
lsmod | grep ip_vs

(2)配置转发及防火墙

#修改配置文件
[root@lvs01 ~]# vim /etc/sysctl.conf
#将0改为1
net.ipv4.ip_forward=1

# 启动
[root@lvs01 ~]# sysctl -p

(3)配置keepalived实现LVS负载均衡

a. 首先进行原配置文件的备份保存
[root@lvs01 ~]# cd /etc/keepalived/

# 进行备份
[root@lvs01 keepalived]# cp keepalived.conf{,.bak}

# 进行查看
[root@lvs01 keepalived]# ls
keepalived.conf  keepalived.conf.bak
b. 修改原配置文件(注意:大括号是否完整)
[root@lvs01 keepalived]# vim keepalived.conf
[root@lvs01 keepalived]# cat keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_1
}

vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.46.100
    }
}

virtual_server 192.168.46.100 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    # persistence_timeout 50  #对该地方进行注释,方便测试实验结果
    protocol TCP
    real_server 192.168.46.130 80 {
        weight 1
        TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
        }
    }
    real_server 192.168.46.140 80 {
        weight 1
        TCP_CHECK {
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
        }

    }
}
参数说明:
virtual_server 192.168.79.110 80 { #定义虚拟服务,需指定IP地址和端口,空格隔开
delay_loop 6 #定义RS运行情况监测时间间隔
lb_algo wrr #定义负载调度算法
lb_kind DR #定义LVS的工作模式
nat_mask 255.255.255.0 #定义虚拟服务的mask
persistence_timeout 300 #定义会话保持时间,S为单位
protocol TCP #指定转发协议
real_server 192.168.79.118 80 { #定义真实服务器IP地址和端口
weight 1 #定义RS的权重
TCP_CHECK { #RS server 健康检查部分
connect_timeout 8 #定义超出8s连接超时
nb_get_retry 3 #定义重试次数
delay_before_retry 3 #定义重试时间间隔
connect_port 80 #定义健康检查端口
}

(4)拷贝master上的keepalived.conf到backup上

[root@lvs01 keepalived]# scp keepalived.conf 192.168.46.120:$PWD

(5)拷贝后,修改配置文件

只需修改三个地方:

1.router_id Director2

2.state BACKUP

3.priority 80

 (6)启动keepalived服务

[root@lvs01 keepalived]# systemctl start keepalived.service

# 查看ip绑定情况
[root@lvs01 keepalived]# ip ad

可以看出lvs01上的ens160上出现了虚拟IP地址,而lvs02上没有出现说明配置正确,否则两台及其都有虚拟IP的话就出现了脑裂。

2. 配置web服务器

(1)安装nginx测试点

[root@server1 ~]# yum install -y nginx

(2)查看80端口是否启动

[root@server1 ~]# netstat -anpt | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3046/nginx: master
tcp6       0      0 :::80                   :::*                    LISTEN      3046/nginx: master

(3)自定义web主页

# 编写默认主页内容
echo "test page, `hostname -I`" > /usr/share/nginx/html/index.html

# 设置开机自启动
systemctl enable --now nginx.service

# 进行测试
[root@server1 ~]# curl localhost
test page, 192.168.46.130

(4)编写脚本,进行绑定VIP和抑制arp

配置脚本如下:

#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DR-RIP
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.46.150
. /etc/rc.d/init.d/functions
start() {
PID=`ifconfig | grep lo:10 | wc -l`
if [ $PID -ne 0 ];
then
echo "The LVS-DR-RIP Server is already running !"
else
/sbin/ifconfig lo:10 $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev lo:10
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/ens160/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/ens160/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
/bin/touch $LOCK
echo "starting LVS-DR-RIP server is ok !"
fi
}
stop() {
/sbin/route del -host $VIP dev lo:10
/sbin/ifconfig lo:10 down >/dev/null
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/ens160/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/ens160/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
rm -rf $LOCK
echo "stopping LVS-DR-RIP server is ok !"
}
status() {
if [ -e $LOCK ];
then
echo "The LVS-DR-RIP Server is already running !"
else
echo "The LVS-DR-RIP Server is not running !"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $1 {start|stop|restart|status}"
exit 1
esac
exit 0
# 创建开机自启动脚本lvs_dr
[root@openEuler ~]# vim /etc/init.d/lvs_rs
 
# 设置编辑权限
[root@openEuler ~]# chmod +x /etc/init.d/lvs_rs
 
# 修改脚本内容
[root@openEuler ~]# vim /etc/init.d/lvs_rs
VIP=192.168.46.100
 
echo "1" >/proc/sys/net/ipv4/conf/ens160/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/ens160/arp_announce
 
echo "0" >/proc/sys/net/ipv4/conf/ens160/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/ens160/arp_announce
 
 
# 将 lvs_dr 服务添加到系统的服务列表中
[root@openEuler ~]# chkconfig --add lvs_rs
 
# 将 lvs_dr 服务设置为在系统运行级别 3、4 和 5 时自动启动
[root@openEuler ~]# chkconfig lvs_rs on
 
# 启动该服务
[root@openEuler ~]# systemctl start lvs_rs.service
 
# 查看服务是否启动
[root@openEuler ~]# systemctl status lvs_rs.service
 
# 查看是否运行脚本,存在VIP
[root@openEuler ~]# ip ad

# 查看是否配置成功
[root@openEuler ~]# route -n

3. 测试 

(1)查看VIP在哪个机器上

VIP在lvs01上

(2)在client上访问192.168.46.100

[root@slient ~]# for ((i=1;i<7;i++)) ; do curl 192.168.46.100; done

实现负载均衡!

(3)假设master上的keepalived停止服务,看lvs02是否承担master任务

# 在lvs01 上停止服务
[root@lvs01 ~]# systemctl stop keepalived.service

#查看lvs02 IP地址
[root@lvs02 ~]# ip ad

现象表明,VIP漂移到lvs02上,实现高可用!

(4)关闭server1站点服务

[root@server1 ~]# systemctl stop nginx.service

server1 站点关闭后,再次访问vip我们发现仍能访问到业务。说明我们的高可用集群试验成功。到此实验完毕!

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

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

相关文章

PydanticToolsParser 工具(tool call)把 LLM 生成的文本转成结构化的数据(Pydantic 模型)过程中遇到的坑

PydanticToolsParser 的作用 PydanticToolsParser 是一个工具&#xff0c;主要作用是 把 LLM 生成的文本转成结构化的数据&#xff08;Pydantic 模型&#xff09;&#xff0c;让代码更容易使用这些数据进行自动化处理。 换句话说&#xff0c;AI 生成的文本通常是自然语言&…

python-leetcode-乘积最大子数组

152. 乘积最大子数组 - 力扣&#xff08;LeetCode&#xff09; class Solution:def maxProduct(self, nums: List[int]) -> int:if not nums:return 0max_prod nums[0]min_prod nums[0]result nums[0]for i in range(1, len(nums)):if nums[i] < 0:max_prod, min_prod…

江协科技/江科大-51单片机入门教程——P[1-1] 课程简介P[1-2] 开发工具介绍及软件安装

本教程也力求在玩好单片机的同时了解一些计算机的基本概念&#xff0c;了解电脑的一些基本操作&#xff0c;了解电路及其元器件的基本理论&#xff0c;为我们学习更高级的单片机&#xff0c;入门IT和信息技术行业&#xff0c;打下一定的基础。 目录 1.课程简介 2.开发工具及…

简单介绍JVM

1.什么是JVM&#xff1f; JVM就是Java虚拟机【Java Virtual Machine】&#xff0c;简称JVM。主要部分包括类加载子系统&#xff0c;运行时数据区&#xff0c;执行引擎&#xff0c;本地方法库等&#xff0c;接下来我们一一介绍 2.类加载子系统 JVM中运行的就是我们日常写的JA…

【对话推荐系统】Towards Topic-Guided Conversational Recommender System 论文阅读

Towards Topic-Guided Conversational Recommender System 论文阅读 Abstract1 Introduction2 Related Work2.1 Conversation System2.2 Conversational Recommender System2.3 Dataset for Conversational Recommendation 3 Dataset Construction3.1 Collecting Movies for Re…

当下弹幕互动游戏源码开发教程及功能逻辑分析

当下很多游戏开发者或者想学习游戏开发的人&#xff0c;想要了解如何制作弹幕互动游戏&#xff0c;比如直播平台上常见的那种&#xff0c;观众通过发送弹幕来影响游戏进程。需要涵盖教程的步骤和功能逻辑的分析。 首先&#xff0c;弹幕互动游戏源码开发教程部分应该分步骤&…

STM32——HAL库开发笔记21(定时器2—输出比较)(参考来源:b站铁头山羊)

本文主要讲述输出比较及PWM信号相关知识。 一、概念 所谓输出比较&#xff0c;就是通过单片机的定时器向外输出精确定时的方波信号。 1.1 PWM信号 PWM信号即脉冲宽度调制信号。PWM信号的占空比 &#xff08;高电压 所占周期 / 整个周期&#xff09; * 100% 。所以PWM信号…

YOLOv12 ——基于卷积神经网络的快速推理速度与注意力机制带来的增强性能结合

概述 实时目标检测对于许多实际应用来说已经变得至关重要&#xff0c;而Ultralytics公司开发的YOLO&#xff08;You Only Look Once&#xff0c;只看一次&#xff09;系列一直是最先进的模型系列&#xff0c;在速度和准确性之间提供了稳健的平衡。注意力机制的低效阻碍了它们在…

动态内容加载的解决方案:Selenium与Playwright对比故障排查实录

方案进程 2024-09-01 09:00 | 接到亚航航班数据采集需求 2024-09-01 11:30 | 首次尝试使用Selenium遭遇Cloudflare验证 2024-09-01 14:00 | 切换Playwright方案仍触发反爬机制 2024-09-01 16:30 | 引入爬虫代理IPUA轮换策略 2024-09-02 10:00 | 双方案完整实现并通过压力测试故…

NLP学习记录十:多头注意力

一、单头注意力 单头注意力的大致流程如下&#xff1a; ① 查询编码向量、键编码向量和值编码向量分别经过自己的全连接层&#xff08;Wq、Wk、Wv&#xff09;后得到查询Q、键K和值V&#xff1b; ② 查询Q和键K经过注意力评分函数&#xff08;如&#xff1a;缩放点积运算&am…

Spring基础01

Spring基础01 软件开发原则 OCP开闭原则&#xff1a;七大开发原则当中最基本的原则&#xff0c;其他的六个原则是为这个原则服务的。 对扩展开放&#xff0c;对修改关闭。在扩展系统功能的时候&#xff0c;没有修改之前写好的代码&#xff0c;就符合OCP原则&#xff0c;反之&a…

2025年2月,TVBOX接口最新汇总版

这里写自定义目录标题 1、离线版很必要2、关于在线版好还是离线版更实在&#xff0c;作个总结&#xff1a;★ 离线版的优点&#xff1a;★ 离线版的缺点&#xff1a; 3.1、 针对FM内置的写法&#xff1b;3.2、 如果是用在YSC&#xff0c;那么格式也要有些小小的改变3.2.1、 YSC…

Dubbo RPC 原理

一、Dubbo 简介 Apache Dubbo 是一款高性能、轻量级的开源 RPC 框架&#xff0c;支持服务治理、协议扩展、负载均衡、容错机制等核心功能&#xff0c;广泛应用于微服务架构。其核心目标是解决分布式服务之间的高效通信与服务治理问题。 二、Dubbo 架构设计 1. 核心组件 Prov…

第2章_保护您的第一个应用程序

第2章_保护您的第一个应用程序 在本章中&#xff0c;您将学习如何使用 Keycloak 保护您的第一个应用程序。为了让事情更有趣&#xff0c;您将运行的示例应用程序由两部分组成&#xff0c;前端 Web 应用程序和后端 REST API。这将向您展示用户如何向前端进行身份验证&#xff0…

【Godot4.3】自定义圆角容器

概述 Godot控件想要完全实现现代UI风格&#xff0c;需要进行大量的自定义组件设计。本篇就依托于笔者自己对现代UI设计中的圆角面板元素模仿来制作圆角容器组件。 圆角容器 圆角元素在现代的扁平UI设计中非常常见&#xff0c;在Godot中可以通过改进PanelContainer来或者自定…

Flutter系列教程之(5)——常用控件Widget的使用示例

目录 1.页面跳转 2.某个控件设置点击事件 3.AlertDialog对话框的使用 4.文本输入框 5.按钮 圆角扁平按钮: 圆角悬浮按钮: 6.补充 圆点 7.布局使用 Row控件左右对齐 调整边距 1.页面跳转 首先&#xff0c;先介绍一下页面跳转功能吧 Flutter使用 Navigator 进行页面…

DeepSeek开源周,第三弹再次来袭,DeepGEMM

在大型模型推理中&#xff0c;矩阵乘法&#xff08;GEMM&#xff09;是计算的核心瓶颈。DeepGEMM 应运而生——一款专为 FP8精度矩阵乘法 设计的轻量级CUDA库&#xff0c;由深度求索&#xff08;DeepSeek&#xff09;团队开源。它凭借极简代码&#xff08;核心仅300行&#xff…

stm32四种方式精密控制步进电机

在搭建完clion的开发环境后&#xff0c;我决定重写之前的项目并优化完善&#xff0c;争取做出完全可落地的东西&#xff0c;也结合要写的论文内容一同学习下去。 因此&#xff0c;首当其冲的就是回到步进电机控制领域&#xff0c;把之前使用中断溢出进行步进电机控制的方案进行…

git merge -s ours ...的使用方法

当我们在自己的feature branch上开发时&#xff0c;并且已经commit&#xff0c;push了好几次 同时develop分支也commit , push了好几次&#xff0c; 如下图所示 这个时候就不能直接将feature branch上的改动 pull request到develop上面&#xff0c;因为develop基线已经不一样了…

数字可调控开关电源设计(论文+源码)

1 设计要求 在本次数字可调控开关电源设计过程中&#xff0c;对关键参数设定如下&#xff1a; &#xff08;1&#xff09;输入电压&#xff1a;DC24-26V,输出电压&#xff1a;12-24&#xff08;可调&#xff09;&#xff1b; &#xff08;2&#xff09;输出电压误差&#xf…