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服务
相关文章:

Keepalived LVS群集
一、Keepalived案例分析 企业应用中,单台服务器承担应用存在单点故障的危险 单点故障一旦发生,企业服务将发生中断,造成极大的危害 二、Keepalived工具介绍 专为LVS和HA设计的一款健康检查工具 支持故障自动切换(Failover&#…...

harbor问题总结
1. http协议的仓库docker login不上,更改/etc/docker/daemon.json,加一个镜像仓库地址 http: server gave HTTP response to HTTPS client 分析一下这个问题如何解决中文告诉我详细的解决方案-CSDN博客 2. Error response from daemon: login attempt t…...

windows系统,家庭自用NAS。本地局域网 Docker安装nextcloud
windows系统,家庭自用NAS。本地局域网 Docker安装nextcloud 1、docker安装 太简单了,直接去搜一搜。 docker-compose 相关命令 docker-compose down docker compose up -d2、还是使用老的 在你需要挂载的目录下,新建一个文件,…...

迅狐跨境商城系统|全平台兼容|前端采用uni-app跨端框架,后端采用ThinkPHP5框架
高效实现全平台兼容的迅狐跨境商城系统 迅狐跨境商城系统是一款专为跨境电商企业设计的全平台兼容系统。其前端采用uni-app跨端框架,后端采用ThinkPHP5框架,旨在实现高效的开发和运营管理。 1. 全平台兼容的前端设计 迅狐跨境商城系统的前端采用uni-a…...

Elixir学习笔记——进程(Processes)
在 Elixir 中,所有代码都在进程内运行。进程彼此隔离,彼此并发运行并通过消息传递进行通信。进程不仅是 Elixir 中并发的基础,而且还提供了构建分布式和容错程序的方法。 Elixir 的进程不应与操作系统进程混淆。Elixir 中的进程在内存和 CPU…...

困惑度作为nlp指标的理解示例
为了更清晰地说明困惑度的计算过程以及如何通过困惑度判断模型的优劣,我们可以通过一个简单的例子来演示。假设我们有一个非常简单的文本语料库和两个基础的语言模型进行比较。 示例文本 假设我们的文本数据包括以下两个句子: “cat sits on the mat”…...

01 Pytorch 基础
paddle不需要放数据到gpu! 区别:1.batch_norlization 不同 2. 1.数据处理 1.取一个数据,以及计算大小 (剩下的工作,取batch,pytorch会自动做好了) 2.模型相关 如何得到结果 3.模型训练/模型…...

STL——set、map、multiset、multimap的介绍及使用
文章目录 关联式容器键值对树形结构与哈希结构setset的介绍set的使用set的模板参数列表set的构造set的使用set的迭代器使用演示 multisetmultiset演示 mapmap的定义方式map的插入map的查找map的[ ]运算符重载map的迭代器遍历multimapmultimap的介绍multimap的使用 在OJ中的使用…...
使用C语言,写一个类似Linux中执行cat命令的类似功能
一、详细的代码案例 #include <stdio.h> #include <stdlib.h> #include <string.h>// 函数声明 void cat_file(const char *filename);int main(int argc, char *argv[]) {if (argc < 2) {fprintf(stderr, "Usage: %s filename1 [filename2 ...]\n&…...

【Android】Android系统性学习——Android系统架构
前言 部分内容参考《Android进阶解密》 – 刘望舒 1. Android版本 官方链接:https://developer.android.com/studio/releases/platforms 里面有各个版本的官方文档,有些新功能的用法在这里面。 现在做安卓11,有时候需要向下兼容 2. AOSP …...

鸿蒙应用开发
学习视频: 00.课程介绍_哔哩哔哩_bilibili 官网:开发者文档中心 | 华为开发者联盟 (huawei.com) 开发工具 :DevEcoStudio , 类似Jetbrains 全家桶 ArkTS开发语言 :(基于TS,集成了前端语言…...

索引失效有效的11种情况
1全职匹配我最爱 是指 where 条件里 都是 ,不是范围(比如>,<),不是 不等于,不是 is not null,然后 这几个字段 建立了联合索引 ,而且符合最左原则。 那么就要比 只建…...

字符数组基础知识及题目
死识。。。 字符该如何存储呢?这一点我们在以前就接触过了。用char来存储。 如何输入一个单词呢? char a[10002]; scanf("%s",a); 就不用地址符了。 如何输入句子呢? char a[100002]; gets(a); gets是读入句子的,…...
一个简单的玩具机器人代码
编写一个玩具机器人脚本通常取决于机器人的硬件、接口和具体功能。然而,由于我们不能直接控制一个真实的硬件机器人,所以只是写一个模拟的C语言脚本示例,该脚本描述了一个简单的玩具机器人可能执行的一些基本操作。 假设我们的“玩具机器人”…...

设计模式-装饰器模式Decorator(结构型)
装饰器模式(Decorator) 装饰器模式是一种结构模式,通过装饰器模式可以在不改变原有类结构的情况下向一个新对象添加新功能,是现有类的包装。 图解 角色 抽象组件:定义组件的抽象方法具体组件:实现组件的抽象方法抽象装饰器&…...
RK3588开发板中使用Qt对zip文件进行解压
操作步骤: 下载源码quazip-0.7.3.zip ,在网上找找下载地址上传源码进行解压,然后使用命令 cd quazip-0.7.3 qmake make主要用的是quazip-0.7.3/quazip这个里面的源码,然后把源码加入到自己创建的qt项目pro中,导入方式…...

三、网络服务协议
目录 一、FTP:文件传输协议 二、Telnet:远程登录协议 三、AAA认证 四、DHCP 五、DNS 六、PPP协议 七、ISIS协议 一、FTP:文件传输协议 C/S架构,现多用于企业内部的资料共享和网络设备的文件传输,企业内部搭建一…...

C++初学者指南第一步---1. C++开发环境设置
C初学者指南第一步—1. C开发环境设置 目录 C初学者指南第一步---1. C开发环境设置1.1 工具1.1.1 代码编辑器和IDE1.1.2 Windows1.1.3 命令行界面 1.2 编译器1.2.1 gcc/g (支持Linux/Windows/MacOSX)1.2.2 clang/clang (支持Linux/Windows/MacOS)1.2.3 Microsoft Visual Studio…...

二维数组与指针【C语言】
二维数组与指针 一维数组一维数组与指针二维数组二维数组与指针总结补充判断以下方式是否正确打印二维数组一维数组 int arr[] = {11, 22, 33, 44};arr:首地址(第一个元素的地址) 一维数组与指针 int arr[] = {11, 22, 33, 44};因为,arr表示的是首地址,等价于 int* p =…...
解决linux下安装apex库报错:ModuleNotFoundError: No module named ‘packaging‘
使用如下命令安装apex: git clone https://github.com/NVIDIA/apex cd apex pip install -v --disable-pip-version-check --no-cache-dir --global-option"--cpp_ext" --global-option"--cuda_ext" ./ 报错: Running command py…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
算法刷题-回溯
今天给大家分享的还是一道关于dfs回溯的问题,对于这类问题大家还是要多刷和总结,总体难度还是偏大。 对于回溯问题有几个关键点: 1.首先对于这类回溯可以节点可以随机选择的问题,要做mian函数中循环调用dfs(i&#x…...