LVS-DR+keepalived实现高可用负载群集

news2025/1/16 12:57:02

VRRP 通信原理:
VRRP就是虚拟路由冗余协议,它的出现就是为了解决静态路由的单点故障。
VRRP是通过一种竞选的一种协议机制,来将路由交给某台VRRP路由。
VRRP用IP多播的方式(多播地址224.0.0.18)来实现高可用的通信,工作时主节点发包,备节点接收包,当备节点接收不到主节点发的数据包时候,就启动接管主节点的资源,备节点可以有多个,通过优先级来进行竞选,但一般keepalived系统运维工作时一对。
VRRP使用加密协议加密数据,但keepalive官方目前还是推荐用明文的方式认证类型和密码。
在这里插入图片描述
Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。

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

Keepalived体系主要模块及其作用:
keepalived体系架构中主要有三个模块,分别是core、check和vrrp。
●core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
●vrrp模块:是来实现VRRP协议的。
●check模块:负责健康检查,常见的方式有端口检查及URL检查。

以下实验使用LVS-DR+keepalived的抢占模式实现高可用负载群集:

Web 服务器120.0.0.101(VIP 20.0.0.10)
Web 服务器220.0.0.102(VIP 20.0.0.10)

NFS 共享存储器:20.0.0.103

LVS+keepalived 主负载调度器:20.0.0.104(VIP 20.0.0.10)

LVS+keepalived 备负载调度器:20.0.0.105(VIP 20.0.0.10)

网关/路由器:20.0.0.2
客户端:192.168.116.50


一、配置NFS共享存储
systemctl stop firewalld.service 
systemctl disable firewalld.service 
setenforce 0

 
yum -y install nfs-utils rpcbind
mkdir /opt/nfs/server1 /opt/nfs/server2
chmod -R 777 /opt/nfs
 
vim /etc/exports
/opt/nfs 20.0.0.0/24(rw,sync)
/opt/nfs/server1 20.0.0.0/24(rw,sync)
/opt/nfs/server2 20.0.0.0/24(rw,sync)
 
systemctl restart rpcbind.service
systemctl restart nfs.service

检查发布的共享策略
showmount -e
在共享目录中添加web测试页面:
mkdir /opt/nfs/server1 server2
echo this is web-01>>/opt/nfs/server1/index.html
echo this is web-02>>/opt/nfs/server2/index.html
检查一下是否写入成功:
cat /opt/nfs/server1/index.htmlcat 
cat /opt/nfs/server2/index.html

二.配置节点web服务(20.0.0.101 20.0.0.102两台的配置相同)
【安装 Nginx 服务】
1、安装依赖包
yum -y install pcre-devel zlib-devel gcc gcc-c++ make

2、创建运行用户
useradd -M -s /sbin/nologin nginx

3、编译安装
cd /opt
tar zxvf nginx-1.22.0.tar.gz -C /opt/

cd nginx-1.22.0/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module

make -j 4 && make install

4、优化路径
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

5、添加 Nginx 系统服务
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

[Unit]:这个部分定义了服务单元的元数据。
Description: 描述该服务单元的信息,描述为"nginx"。
After: 定义服务单元所依赖的其他单元,这里表示服务需要在网络加载完成之后启动。

[Service]:这个部分定义了服务的运行配置。
Type: 指定服务的类型,这里是forking,表示服务是一个后台进程(通常是fork出子进程)。
PIDFile: 指定保存主进程ID的文件路径,Nginx将会把主进程ID写入这个文件,以便Systemd可以追踪和管理进程。
ExecStart: 指定启动服务的命令。这里是启动Nginx的命令/usr/local/nginx/sbin/nginx。
ExecReload: 指定重新加载配置的命令。当执行此命令时,Systemd将发送HUP信号给主进程,Nginx将重新加载配置文件。
ExecStop: 指定停止服务的命令。当执行此命令时,Systemd将发送QUIT信号给主进程,Nginx将优雅地停止服务。
PrivateTmp: 将此项设置为true,表示为服务提供独立的临时目录。

[Install]:这个部分定义了服务的安装配置。
WantedBy: 指定服务所属的目标(target),这里是multi-user.target,表示服务在多用户模式下启动。

chmod 777 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

查看nginx服务是否启动:

netstat -antp | grep 80

将网站根目录挂载到各自的共享目录
首先打开nfs服务:
systemctl restart rpcbind.service
systemctl restart nfs.service

mount 20.0.0.103:/opt/nfs/server1 /usr/local/nginx/html/
mount 20.0.0.103:/opt/nfs/server2 /usr/local/nginx/html/

在web01 -02上查看是否共享成功

cat /usr/local/nginx/html/index.html
cat /usr/local/nginx/html/index.html

设置回环网卡,虚拟ip(web-01 web-02都要设置)

cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:0

vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=20.0.0.10
NETMASK=255.255.255.255
ONBOOT=yes

~    

ifup lo:0  

配置回环网卡完成后
ifconfig 查看一下是否配置成功

添加静态路由(将数据包封锁在回环网卡中)

#临时配置
route add -host 20.0.0.10 dev lo:0
 
#永久配置
vim /etc/rc.local
/sbin/route add -host 20.0.0.10 dev lo:0
chmod +x /etc/rc.d/rc.local

调整内核的ARP响应参数(阻止更新VIP的MAC地址,防止发生冲突)

vim /etc/sysctl.conf
#添加
net.ipv4.conf.lo.arp_ignore = 1        
net.ipv4.conf.lo.arp_announce = 2    
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
 
#加载配置文件并查看
sysctl -p

三、配置主备LVS+keepalived负载调度器(keepalived-01 ;keepalived-02)

关闭防火墙下载keepalived和ipvsadm,并修改内核参数

systemctl stop firewalld.service 。
systemctl disable firewalld.service 
setenforce 0


modprobe ip_vs
yum -y install ipvsadm keepalived
 
vim /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
 
sysctl -p
修改主负载器配置文件:
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak  #改配置文件前先备份
vim keepalived.conf

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
  router_id LVS_01
   #vrrp_skip_check_adv_addr
   #vrrp_strict
   #vrrp_garp_interval 0
   #vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abc123
    }
    virtual_ipaddress {
        20.0.0.10
    }
}

virtual_server 20.0.0.10 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 10
    protocol TCP

    real_server 20.0.0.101 80 {
        weight 1
        TCP_CHECK {
                connect_port 80
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
}
}
real_server 20.0.0.102 80 {
        weight 1
        TCP_CHECK {
                connect_port 80
                connect_timeout 3
              nb_get_retry 3
                delay_before_retry 3
}
}
}
修改备负载器配置文件(与主配置一致,只需修改以下部分) :

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
  router_id LVS_02
   #vrrp_skip_check_adv_addr
   #vrrp_strict
   #vrrp_garp_interval 0
   #vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abc123
    }
    virtual_ipaddress {
        20.0.0.10
    }
}

virtual_server 20.0.0.10 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 10
    protocol TCP

    real_server 20.0.0.101 80 {
        weight 1
        TCP_CHECK {
                connect_port 80
                connect_timeout 3
                nb_get_retry 3
                delay_before_retry 3
}
}
real_server 20.0.0.102 80 {
        weight 1
        TCP_CHECK {
                connect_port 80
                connect_timeout 3
              nb_get_retry 3
 delay_before_retry 3
}
}
}
启动keepalived再启动ipvsadm(ipvsadm会自动加载keepslived中的配置:

systemctl restart keepalived.service
ipvsadm-save > /etc/sysconfig/ipvsadm
 
#启动ipvsadm (分别添加主备负载均衡器VIP 的分发策略)
systemctl restart ipvsadm.service

ipvsadm -C   ##清空规则
ipvsadm -A -t 20.0.0.10:80 -s rr
ipvsadm -a -t 20.0.0.10:80 -r 20.0.0.101:80 -g
ipvsadm -a -t 20.0.0.10:80 -r 20.0.0.102:80 -g


查看主负载和副负载均衡器:
ipvsadm -ln

访问:20.0.0.10
可以将主负载器服务停止或关机(模拟宕机),继续访问 20.0.0.10查看主备切换是否正常

在这里插入图片描述

脑裂现象的解释和解决办法:
1.解释
在抢占模式中,MASTER需要定时发送报文通告BACKUP自己仍在运作,但是当MASTER还在运作,但其中的线路或交换机等出现故障导致BACKUP不能收到通告时,会认为MASTER已经失效,此时BACKUP抢占VIP会导致VIP同时存在,这就是脑裂现象。

2.解决方法
1.主备服务器之间使用双链路通信;
2. 通过脚本来实时监控主备的网络状态,然后再根据脚本逻辑采取措施(关掉主服务器的keepalived服务器);

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

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

相关文章

opencv运动目标检测-背景建模

背景建模 帧差法 由于场景中的目标在运动,目标的影像在不同图像帧中的位置不同。该类算法对时间上连续的两帧图像进行差分运算,不同帧对应的像素点相减,判断灰度差的绝对值,当绝对值超过一定阈值时,即可判断为运动目…

Java虚拟机(JVM):垃圾收集算法

目录 一、分代收集理论 二、标记-清除算法 三、标记-复制算法 四、标记-整理算法 一、分代收集理论 分代收集理论建立在两个分代假说之上: 1、弱分代假说:绝大多数对象都是朝生夕灭的。 2、强分代假说:熬过越多次垃圾收集过程的对象就…

Python中数据结构列表详解

列表是最常用的 Python 数据类型,它用一个方括号内的逗号分隔值出现,列表的数据项不需要具有相同的类型。 列表中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。列表都可…

C语言之指针进阶篇(1)

目录​​​​​​​ 引言 字符指针 指针数组 数组指针 数组指针的定义 &数组名vs数组名 数组指针的使用 一维数组使用 二维数组使用 一维数组传参 二维数组传参 总结 数组参数 一维数组传参 二维数组传参 指针参数 一级指针传参 二级指针传参 引言 今…

Jmeter对websocket进行测试

JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar下载 公司使用websocket比较奇怪,需要带认证信息进行长连接,通过websocket插件是请求失败,如下图,后面通过代码实现随再打包jar包完成websocket测试 本地实现代码如下: pa…

总结,由于顺丰的问题,产生了电脑近期一个月死机问题集锦

由于我搬家,我妈搞顺丰发回家,但是没有检查有没有坏,并且我自己由于不可抗力因素,超过了索赔时间,反馈给顺丰客服,说超过了造成了无法索赔的情况,现在总结发生了损坏配件有几件,显卡…

Java 项目日志实例基础:Log4j

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ 介绍几个日志使用方面的基础知识。 1 Log4j 1、Log4j 介绍 Log4j(log for java)是 Apache 的一个开源项目,通过使用 Log4j,我…

奥威BI数据可视化工具:个性化定制,打造独特大屏

每个人都有自己独特的审美,因此即使是做可视化大屏,也有很多人希望做出不一样的报表,用以缓解审美疲劳的同时提高报表浏览效率。因此这也催生出了数据可视化工具的个性化可视化大屏制作需求。 奥威BI数据可视化工具:个性化定制&a…

nginx代理webSocket链接响应403

一、场景 使用nginx代理webSocket链接,nginx响应403 1、nginx访问日志响应403 [18/Aug/2023:09:56:36 0800] "GET /FS_WEB_ASS/webim_api/socket/message HTTP/1.1" 403 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit…

opencv-dnn

# utils_words.txt 标签文件 import osimage_types (".jpg", ".jpeg", ".png", ".bmp", ".tif", ".tiff")def list_images(basePath, containsNone):# return the set of files that are validreturn list_file…

机器学习|决策树:数学原理及代码解析

机器学习|决策树:数学原理及代码解析 决策树是一种常用的监督学习算法,适用于解决分类和回归问题。在本文中,我们将深入探讨决策树的数学原理,并提供 Python 示例代码帮助读者更好地理解和实现该算法。 决策树数学原…

大语言模型-RLHF(七)-PPO实践(Proximal Policy Optimization)原理实现代码逐行注释

从open AI 的论文可以看到,大语言模型的优化,分下面三个步骤,SFT,RM,PPO,我们跟随大神的步伐,来学习一下这三个步骤和代码实现,本章介绍PPO实践。 生活中,我们经常会遇到…

数字化时代,数据仓库和商业智能BI系统演进的五个阶段

数字化在逐渐成熟的同时,社会上也对数字化的性质有了进一步认识。当下,数字化除了前边提到的将复杂的信息、知识转化为可以度量的数字、数据,在将其转化为二进制代码,引入计算机内部,建立数据模型,统一进行…

Java数据库连接池原理及spring boot使用数据库连接池(HikariCP、Druid)

和线程池类似,数据库连接池的作用是建立一些和数据库的连接供需要连接数据库的业务使用,避免了每次和数据库建立、销毁连接的性能消耗,通过设置连接池参数可以防止建立连接过多导致服务宕机等,以下介绍Java中主要使用的几种数据库…

IP 地址监控工具

地址监控实用程序是一套 IP 工具,包括 IP 地址监控工具、流氓检测工具和 MAC 地址解析器,用于日常监控和管理 DNS 名称、IP和 MAC 地址。地址监控工具用于 IP监控,用于管理 DNS 名称、网络的 IP 和 MAC 地址,并跟踪 IP 地址。 IP…

基于基于springboot+vue+B2C模式的电子商务平台【源码+论文+演示视频+包运行成功】

博主介绍:✌csdn特邀作者、博客专家、java领域优质创作者、博客之星,擅长Java、微信小程序、Python、Android等技术,专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推…

Unity 物体的运动之跟随鼠标

你想让鼠标点击哪里,你的运动的对象就运动到哪里吗? Please follow me ! 首先,你要先添加一个Plane ,以及你的围墙,你的移动的物体 想要实现跟随鼠标移动,我们先创建一个脚本 using System.Collections; using Syst…

Coremail参与编制|《信创安全发展蓝皮书——系统安全分册(2023年)》

信创安全发展蓝皮书 近日,Coremail参与编制的《信创安全发展蓝皮书—系统安全分册(2023年)》重磅发布。 此次信创安全发展蓝皮书由工业和信息化部电子第五研究所联合大数据协同安全技术国家工程研究中心重磅共同发布。 本次蓝皮书涵盖信创系…

关于路由器和DNS解析的一些新理解

其实我本人对于交换机和路由器这些网络硬件是比较感兴趣的,也在一点一点的学习相关知识,每次解决一个问题,就让我对一些事情有新的思考。。 今天前台同事,的机器突然上不了网,,和领导一起去看了一波&#…

Danswer 快速指南:不到15分钟打造您的企业级开源知识问答系统

一、写在前面 至于为什么需要做企业知识库,知识问答检索系统,以及现有GPT模型在企业应用中存在哪些劣势,今天在这里就不再赘述了,前面介绍其他构建知识库案例的文章中基本上都有讲过,如果您有兴趣可以去翻翻历史文章来…