linux系统------LVS+KeepAlived+Nginx高可用方案

目录

一、环境搭建

1.环境准备

2.安装ipvsadm 和 安装 keepalived(Lvs服务器)

3.为两台RS配置虚拟ip(nginx服务器)

1.配置虚拟网络子接口(回环接口)

2.修改内容如下:

3.配置ARP

二、Keepalived+Lvs+Nginx高可用集群负载均衡的搭建

1. 配置 LVS-keepalived(主)

2. 配置Lvs-keepalived(备)

3、检查服务和配置

4. 测试

1.测试Lvs

2.测试nginx


一、环境搭建

1.环境准备

HOSTNAMEIP说明
nginx192.168.100.10nginx服务器
nginx192.168.100.11nginx服务器
Lvs+keepalived(主)192.168.100.100Lvs+keepalived(VIP:192.168.100.109)
Lvs+keepalived(备)192.168.100.101Lvs+keepalived(VIP:192.168.100.109)

并关闭防火墙和安全上下文       

所有计算机节点关闭网络配置管理器,因为有可能会和网络接口冲突:

systemctl stop NetworkManager

2.安装ipvsadm 和 安装 keepalived(Lvs服务器)

yum install ipvsadm -y
yum install keepalived -y

安装成功进行检测

[root@lvs1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn[root@lvs2 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

3.为两台RS配置虚拟ip(nginx服务器)

1.配置虚拟网络子接口(回环接口)

(两台服务器配置一样,以下已一台服务器配置作为演示)

配置虚拟网络子接口可以理解为构建一个虚拟ip,这个ip只能返回数据,不能被访问。

1.进入到网卡配置目录,找到 lo(本地环回接口,用户构建虚拟网络子接口),拷贝一份新的随后进行修改:

2.修改内容如下:

(注意:由于没有多的网卡,一下是临时配置在lo下)

root@web1 network-scripts]# ifconfig lo:0 192.168.100.109/32
[root@web1 network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet 192.168.100.109/0 scope global lo:0valid_lft forever preferred_lft foreverinet6 ::1/128 scope host noprefixroute valid_lft forever preferred_lft forever

3.重启后通过ip addr 查看如下,表示ok:

[root@web1 network-scripts]# ifup lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)

另一台nginx服务配置同上(web2)

3.配置ARP

1.打开sysctl.conf

vim /etc/sysctl.conf

2.配置所有网卡、默认网卡以及虚拟网卡的arp响应级别和通告行为,分别对应:all,default,lo

[root@web1 ~]# vim /etc/sysctl.conf      #添加配置如下
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.default.arp_ignore=1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce=2

3.刷新配置

sysctl -p

4.增加一个网关,用于接收数据报文,当有请求到本机后,会交给lo去处理

[root@web1 ~]# route add -host 192.168.100.109 dev lo:0

5.防止重启失效,做如下处理,用于开机自启动

vim /etc/profile
route add -host 192.168.100.109 dev lo:0

nginx服务器web2同上操作

二、Keepalived+Lvs+Nginx高可用集群负载均衡的搭建

这种架构目前在很多公司都在采用的高可用高性能架构, 优点如下:

  1. 使用Keepalived + Lvs 后可以实现主备切换高可用

  2. 结合了Lvs 后, 针对于后台的Real Server 这些真实的服务器做健康检查, 如果某台真实的服务器宕机后, Lvs就会自动剔除, 如果恢复后也可以自动加入.

  3. 其实 Keepalived 本身就是为 Lvs 定做了, 他们的匹配度, 结合度非常高, 通过 keepalivd 就可以配置 Lvs与 RS 的关系, 如负载均衡算法, 健康检查配置等.

1. 配置 LVS-keepalived(主)

1、keepalived配置文件, 修改配置信息

cd /etc/keepalived
vim keepalived.conf

配置文件如下:

! Configuration File for keepalivedglobal_defs {router_id LVS1
}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.100.109}
}
# LVS 配置: 配置集群访问的 IP+端口, 端口和nginx保持一致, 都是80, IP与端口是空格而不是冒号
virtual_server 192.168.100.109 80 {# 健康检查的时间, 单位是秒delay_loop 6# 配置负载均衡的算法, 默认是 轮询lb_algo rr# 设置LVS的工作模式 NAT|TUN|DR  lb是load_balance 负载均衡的缩写lb_kind DR# 会话持久化的时间, 默认是 50 秒persistence_timeout 5# 协议 -tprotocol TCP# Real Server 配置  nginx服务ip+端口real_server 192.168.100.10 80 {# 轮询的权重, 默认有多少台, 就设置为多少个 1weight 1# 设置健康检查, 基于 tcpTCP_CHECK {# 检查的80端口connect_port 80# 检查的超时时间 2秒connect_timeout 2# 重试的次数 我们设置为2, 一般是5-7nb_get_retry 2# 设置间隔时间 3sdelay_before_retry 3}}real_server 192.168.100.11 80 {weight 1# 设置健康检查, 基于 tcpTCP_CHECK {# 检查的80端口connect_port 80# 检查的超时时间 2秒connect_timeout 2# 重试的次数 我们设置为2, 一般是5-7nb_get_retry 2# 设置间隔时间 3sdelay_before_retry 3}}
}

清除负载均衡的规则

[root@lvs1 keepalived]# ipvsadm -C

重启keepalived, 使得配置生效

[root@lvs1 keepalived]# systemctl restart keepalived.service

2. 配置Lvs-keepalived(备)

步骤同 LVS-keepalived(主)一样 ,只有配置文件不一样

vim  /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {#主服务器配置不同,名称随便起router_id LVS2
}vrrp_instance VI_1 {#主服务器配置不同state BACKUPinterface ens33virtual_router_id 51#主服务器配置不同,权重需要比主服务器低priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.100.109}
}
# LVS 配置: 配置集群访问的 IP+端口, 端口和nginx保持一致, 都是80, IP与端口是空格而不是冒号
virtual_server 192.168.100.109 80 {# 健康检查的时间, 单位是秒delay_loop 6# 配置负载均衡的算法, 默认是 轮询lb_algo rr# 设置LVS的工作模式 NAT|TUN|DR  lb是load_balance 负载均衡的缩写lb_kind DR# 会话持久化的时间, 默认是 50 秒persistence_timeout 5# 协议 -tprotocol TCP# Real Server 配置  nginx服务ip+端口real_server 192.168.100.10 80 {# 轮询的权重, 默认有多少台, 就设置为多少个 1weight 1# 设置健康检查, 基于 tcpTCP_CHECK {# 检查的80端口connect_port 80# 检查的超时时间 2秒connect_timeout 2# 重试的次数 我们设置为2, 一般是5-7nb_get_retry 2# 设置间隔时间 3sdelay_before_retry 3}}real_server 192.168.100.11 80 {weight 1# 设置健康检查, 基于 tcpTCP_CHECK {# 检查的80端口connect_port 80# 检查的超时时间 2秒connect_timeout 2# 重试的次数 我们设置为2, 一般是5-7nb_get_retry 2# 设置间隔时间 3sdelay_before_retry 3}}
}

改完配置文件,进行重启keeplivaed,命令同上!

[root@lvs2 keepalived]# vim keepalived.conf
[root@lvs2 keepalived]# systemctl restart keepalived.service

3、检查服务和配置

     3.1  OpenEuler里自带ipvsadm模块儿 (主和备都需要做)

此时需启动它,得先创建一个ipvsadm文件

[root@lvs1 keepalived]# touch /etc/sysconfig/ipvsadm
[root@lvs1 keepalived]# systemctl start ipvsadm
[root@lvs1 keepalived]# lsmod | grep ip_vs
ip_vs_rr               12288  0
ip_vs                 229376  2 ip_vs_rr
nf_conntrack          212992  1 ip_vs
nf_defrag_ipv6         24576  2 nf_conntrack,ip_vs
libcrc32c              12288  2 nf_conntrack,ip_vs
[root@lvs1 keepalived]# systemctl status ipvsadm
● ipvsadm.service - Initialise the Linux Virtual ServerLoaded: loaded (/usr/lib/systemd/system/ipvsadm.service; disabled; preset: disabl>Active: active (exited) since Tue 2025-07-15 16:49:31 CST; 35s agoProcess: 29784 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore < /etc/sysconfig/>Main PID: 29784 (code=exited, status=0/SUCCESS)7月 15 16:49:31 lvs1 systemd[1]: Starting Initialise the Linux Virtual Server...
7月 15 16:49:31 lvs1 systemd[1]: Finished Initialise the Linux Virtual Server.

        3.2   检查web1 和web2(两台Rs) 的(nginx服务是否启用)

                检查web1 和 web2  配置网卡信息是否正确(  lo  )

        3.3  加载主和备 keepalived.conf

[root@lvs1 keepalived]# systemctl restart keepalived.service 
[root@lvs2 keepalived]# systemctl restart keepalived.service 

        3.4  加载ip_vs模块

[root@lvs1]# modprobe ip_vs
[root@lvs2]# modprobe ip_vs

重启完出现相同路由规则标识已配置成功

[root@lvs1 keepalived]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.109:80 rr persistent 50-> 192.168.100.10:80            Route   1      0          0         -> 192.168.100.11:80            Route   1      0          0    

4. 测试

1.测试Lvs

访问192.168.100.109   可以正常访问

停掉 LVS 的 Master 节点

[root@lvs1 keepalived]# systemctl stop keepalived.service

观察主节点LVS节点 IP

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:6a:66:62 brd ff:ff:ff:ff:ff:ffinet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe6a:6662/64 scope link noprefixroute valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:6a:66:62 brd ff:ff:ff:ff:ff:ffinet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.100.109/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe6a:6662/64 scope link noprefixroute valid_lft forever preferred_lft forever

重启Master 节点,我们发现ip又漂移回来了

2.测试nginx

我们关闭10节点的Nginx服务器(假如宕机状态)

[root@web1 keepalived]# systemctl stop nginx

进入master节点进行查看集群信息

[root@lvs1 keepalived]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.109:80 rr persistent 50-> 192.168.100.11:80            Route   1      0          0 

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

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

相关文章

【MySQL】性能优化实战指南:释放数据库潜能的艺术

文章目录MySQL性能优化实战指南&#xff1a;释放数据库潜能的艺术&#x1f680; 引言为什么需要MySQL性能优化&#xff1f;&#x1f4cb; 性能优化基础知识MySQL性能瓶颈分析1. 硬件资源瓶颈2. MySQL内部瓶颈&#x1f3c6; 优化配置策略大全&#x1f4be; 内存配置优化InnoDB缓…

Unity 3D碰撞器

在Unity中&#xff0c;碰撞器&#xff08;Collider&#xff09;是用于检测物体之间碰撞的组件&#xff0c;它们定义了物体的物理边界。碰撞器与刚体&#xff08;Rigidbody&#xff09;配合使用&#xff0c;实现物理模拟。下面我将按您的要求&#xff0c;从碰撞器的种类、常用参…

Windows批处理实现带时间戳ping

windows环境 &#xff0c; 将以下代码保存为 .bat文件 echo off echo.---------------------------------------------------------- echo.----------------------------------------------------------- echo off set /p hostplease input your destination ip : set logfi…

GeoPandas 城市规划:Python 空间数据初学者指南

安装和设置 在深入研究数据之前&#xff0c;我们需要准备好工具。设置 GeoPandas 及其必要的依赖项是第一步。 我们将在 Google Colab 中完成此操作。 !pip install geopandas contextily matplotlib 空间数据有多种格式&#xff0c;但 GeoJSON 是常见且易于访问的格式。Ge…

力扣面试150题--环形子数组的最大和

Day 80 题目描述思路 初次做法&#xff1a;在昨天代码的基础上修改 计算普通子数组的最大和 使用动态规划计算以每个位置为起点的最大子数组和&#xff08;存储在 val 中&#xff09;&#xff0c;并更新全局最大值 rightmax。计算后缀和与前缀和 sum[i]&#xff1a;从位置 i 到…

python类Keys

类Keys的定义:Elass Keys (object): 程轩开Set of special keys codes.#n# 第 15 章 网络爬虫 合情些准出照地限公轵 esms0 pro 瘀 Δ器代刍奄炖慧 图 15-39 工件肉业鱼光得 国有上子 理人场营&#xff0c;有司;可有B 相关围书 图 15-40 页源代码 ython". 名可能不鞋 NUL…

svn如何设置忽略文件夹或者文件的提交

使用svn&#xff0c;每次提交代码时&#xff0c;都会把java的编译文件target&#xff0c;或者前端的node_modules&#xff0c;dist等不需要提交的目录或这文件&#xff0c;列出来实现。通过配置svn&#xff0c;可以在提交代码时&#xff0c;自动忽略这些不需要提交到仓库的文件…

MonoGame 游戏开发框架日记 -06

第六章&#xff1a;动画类以及动画精灵 好久不见家人们好久没更新MonoGame系列了&#xff0c;不是主包弃坑了&#xff0c;主要是主包最近忙着搞项目学科一找暑假工打&#xff0c;这不一闲下来就立刻马不停蹄的来给大家更新了&#xff0c;今天的教程代码部分比较多接下来我们正式…

LVS四种工作模式深度解析

LVS&#xff08;linux virual server&#xff09;LVS四种工作模式深度解析 LVS-NAT模式 四台虚拟机 火墙关闭 关闭火墙 systemctl stop firewalldsystemctl disable firewalld关闭开机自启火墙1.clienteth0 IP&#xff1a;172.25.254.1002.lvs eth0ip :172.25.254.200; eth1ip:…

[设计模式]C++单例模式的几种写法以及通用模板

之前在这篇文章中简单的介绍了一下单例模式的作用和应用C中单例模式详解_c单例模式的作用-CSDN博客&#xff0c;今天我将在在本文梳理单例模式从C98到C11及以后的演变过程&#xff0c;探讨其不同实现方式的优劣&#xff0c;并介绍在现代C中的最佳实践。 什么是单例模式&#x…

小架构step系列19:请求和响应

1 概述作为Web程序&#xff0c;通用形式是发起HTTP请求并获取返回的结果&#xff0c;在这个过程中&#xff0c;需要把请求映射到代码的接口上&#xff0c;提供这种接口的类一般称为Controller&#xff0c;也就是需要把请求映射到Controller的接口方法上&#xff0c;把请求的参数…

论文分享 | LABRADOR:响应引导的针对物联网设备的黑盒模糊测试

由于固件仿真以及重托管的技术挑战&#xff0c;部分企业级 IoT 设备只能在黑盒环境下进行模糊测试。分享一篇发表于 2024 年 S&P 会议的论文 Labrador&#xff0c;它利用响应来引导请求变异&#xff0c;实现了针对 IoT 设备的高效黑盒模糊测试。 猴先生说&#xff1a;这篇论…

WPF为启动界面(Splash Screen)添加背景音乐

1. 添加音频文件到项目 将音频文件&#xff08;如.mp3/.wav&#xff09;放入项目文件夹&#xff08;如Resources&#xff09;在解决方案资源管理器中右键文件 → 属性&#xff1a; 生成操作&#xff1a;选择Resource&#xff08;嵌入资源&#xff09;或Content&#xff08;内容…

【Jmeter】报错:An error occured:Unknown arg

问题 调试Jmeter时&#xff0c;报错&#xff1a;‘An error occurred: Unknown arg: l’&#xff0c;脚本如下&#xff1a; $JMETER_PATH -n -t "$target_jmx" -l "$SCENARIO_REPORT_DIR/result_${threads}.jtl" -e -o "$SCENARIO_REPORT_DIR/htm…

vue3使用KeepAlive组件及一些注意事项

目录 一、KeepAlive的作用 二、缓存组件配置 2.1、过滤缓存组件 2.2、最大缓存实例数 三、KeepAlive组件的生命周期 四、错误用法 4.1、缓存v-if包裹的动态组件 4.2、拼写错误 一、KeepAlive组件的作用 首先&#xff0c;keep-alive是一个vue的内置组件&#xff0c;官网…

辛普森悖论

辛普森悖论第一步&#xff1a;概念拆解想象你在比较两个班级的考试成绩&#xff1a;​第一天​&#xff1a;实验组&#xff08;1个学生考了90分&#xff09;&#xff0c;对照组&#xff08;99个学生平均考了80分&#xff09;​第二天​&#xff1a;实验组&#xff08;50个学生平…

有效的括号数据结构oj题(力口20)

目录 目录 题目描述 题目分析解析 解决代码 写题感悟&#xff1a; 题目描述 还有实例 题目分析解析 对于这个题目&#xff0c;我们首先有效字符串需要满足什么&#xff0c;第一个左右括号使用相同类型的括号&#xff0c;这好理解&#xff0c;无非就是小括号和小括号大括号…

Mock 单元测试

作者&#xff1a;小凯 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01; 本文的宗旨在于通过简单干净实践的方式教会读者&#xff0c;如何使用 Mock (opens new window)进行工程的单元测试&#xff0c;以便于验证系统中的独立模块功能的健壮性。 从整个工程所…

MySQL 深度性能优化配置实战指南

🔧 一、硬件与系统层优化:夯实性能基石 ​​硬件选型策略​​ ​​CPU​​:读密集型场景选择多核CPU(如32核);写密集型场景选择高主频CPU(如3.5GHz+)。 ​​内存​​:建议≥64GB,​​缓冲池命中率≥99%​​ 是性能关键指标。 ​​存储​​:​​必用NVMe SSD​​,I…

Visual Studio Code(VSCode)中设置中文界面

在VS Code中设置中文界面主要有两种方法&#xff1a;通过扩展市场安装中文语言包或通过命令面板直接切换语言。‌方法一&#xff1a;通过扩展市场安装中文语言包‌打开VS Code&#xff0c;点击左侧活动栏的"扩展"图标&#xff08;或按CtrlShiftX&#xff09;。在搜索…