LVS(Linux virual server)四层负载均衡实验

LVS简介

LVS 全称 Linux Virtual Server,是 Linux 内核层实现的高性能、高可用 的负载均衡集群技术,由章文嵩博士开发,目前是 Linux 内核的标准模块 之一。它的核心作用是将前端的请求流量分发到后端多台真实服务器 (Real Server)上,从而提升服务的并发处理能力和可用性。

LVS:Linux Virtual Server,负载调度器,内核集成,章文嵩,阿里的四层SLB(Server LoadBalance)是基 于LVS+keepalived实现 LVS

官网: http://www.linuxvirtualserver.org/

LVS 相关术语

VS: Virtual Server,负责调度

RS:RealServer,负责真正提供服务

lvs集群的类型

lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT

lvs-dr: 操纵封装新的MAC地址

lvs-tun: 在原请求IP报文之外新加一个IP首部

lvs-fullnat: 修改请求报文的源和目标IP

NAT模式实验主机环境搭建

VS主机配置

RS1配置

RS2配置

验证是否配置成功(在vs主机上测试)

NAT模式实现方法

#开启内核路由功能

#编写策略

注意执行以上指令时出现【未找到命令时】需要安装 ipvsadm

root@vsssnnode \~\]# yum install ipvsadm -y \[root@vsssnnode \~\]# ipvsadm -C 清空服务器上所有已配置的 LVS 规则 \[root@vsssnnode \~\]# ipvsadm -A -t 172.25.254.100:80 -s wrr 创建一个对外提供服务的 LVS 虚拟节点(VIP),指定用 "加权轮询" 算法分发请求。 \[root@vsssnnode \~\]# ipvsadm -A -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 1 Illegal 'real-server' option with the 'add-service' command \[root@vsssnnode \~\]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 1 \[root@vsssnnode \~\]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1 把后端真实服务器(192.168.0.10/20:80)加入刚才创建的 LVS 虚拟服务,指定用 NAT 模式转发,权重为 1。 \[root@vsssnnode \~\]# ipvsadm -Ln 查看当前配置好的所有 LVS 规则(验证配置是否生效) IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -\> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.25.254.100:80 wrr -\> 192.168.0.10:80 Masq 1 0 0 -\> 192.168.0.20:80 Masq 1 0 0 测试结果 ![](https://i-blog.csdnimg.cn/direct/5511100592e14637a0c9950a8d37950b.png) #### 利用自定义文件进行持久化 \[root@vsnode \~\]# ipvsadm-save -n -A -t 172.25.254.100:80 -s wrr -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 2 -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1 \[root@vsnode \~\]# ipvsadm-save -n \> /mnt/ipvs.rule \[root@vsnode \~\]# ipvsadm -C ![](https://i-blog.csdnimg.cn/direct/597e42ef2ffe476f9675d392802d4161.png) \[root@vsnode \~\]# ipvsadm-restore \< /mnt/ipvs.rule ![](https://i-blog.csdnimg.cn/direct/d08692b884cb4334a6fa8b8382efbbde.png) #### 利用守护进程进行规则持久化 \[root@vsnode \~\]# ipvsadm-save -n \> /etc/sysconfig/ipvsadm \[root@vsnode \~\]# ipvsadm -C ![](https://i-blog.csdnimg.cn/direct/6d9814d67a40469c94f4ecf821ab4bc5.png) \[root@vsnode \~\]# systemctl enable --now ipvsadm.service Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service. ![](https://i-blog.csdnimg.cn/direct/247b689945314396af6500196ac4990a.png) ## DR模式实验 ![](https://i-blog.csdnimg.cn/direct/dd8d5716408543d99c0327aa0fd00aa3.png) ### 环境设定 #### #在路由器中配置 \[root@router \~\]# systemctl disable --now ipvsadm.service Removed "/etc/systemd/system/multi-user.target.wants/ipvsadm.service". \[root@router \~\]# ipvsadm -C #### #在路由器中 \[root@router \~\]# vmset.sh eth0 172.25.254.100 vsnode \[root@router \~\]# vmset.sh eth1 192.168.0.100 vsnode noroute、 #### #设定内核路由功能 \[root@router \~\]# echo net.ipv4.ip_forward=1 \>\> /etc/sysctl.conf \[root@router \~\]# sysctl -p net.ipv4.ip_forward = 1 #### #数据转发策略 \[root@router \~\]# iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.0.100 \[root@vsnode \~\]# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100 ![](https://i-blog.csdnimg.cn/direct/72343f83cb8142aa88298ce5782af6df.png) ### vsnode 调度器配置 \[root@vsnode \~\]# vmset.sh eth0 192.168.0.50 vsnode norouter \[root@vsnode \~\]# vim /etc/NetworkManager/system-connections/eth0.nmconnection \[connection

id=eth0

type=ethernet

interface-name=eth0

ipv4

method=manual

address1==192.168.0.50/24,192.168.0.100

root@vsnode \~\]# cd /etc/NetworkManager/system-connections/ \[root@vsnode system-connections\]# cp -p eth0.nmconnection lo.nmconnection \[root@vsnode system-connections\]# vim lo.nmconnection \[connection

id=lo

type=loopback

interface-name=lo

ipv4

method=manual

address1==127.0.0.1/8

address2=192.168.0.200/32

root@RS1 system-connections\]# nmcli connection reload \[root@RS1 system-connections\]# nmcli connection up eth0 连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/7) \[root@RS1 system-connections\]# nmcli connection up lo 连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/8) ![](https://i-blog.csdnimg.cn/direct/51e16be8143b4bd6a4d96f40388a69eb.png) 检测 ![](https://i-blog.csdnimg.cn/direct/8317070635434091a0ed5eb79422ba8b.png) ### 客户机配置 ![](https://i-blog.csdnimg.cn/direct/60f07e7c7e15457fa0811b618d52ca21.png) root@client xia\]# vim /etc/NetworkManager/system-connections/eth0.nmconnection \[connection

id=eth0

type=ethernet

interface-name=eth0

ipv4

method=manual

address1=172.25.254.99/24,172.25.254.100

dns=8.8.8.8;

RS1配置

RS2配置

root@rs2 system-connections\]# echo 1 \> /proc/sys/net/ipv4/conf/all/arp_ignore 设置所有网卡的 arp_ignore 参数为 1,让服务器只响应目标 IP 是本机网卡配置的 IP 的 ARP 请求。 \[root@rs2 system-connections\]# echo 1 \> /proc/sys/net/ipv4/conf/lo/arp_ignore 单独给回环网卡(lo)设置 arp_ignore=1,强化对 VIP 的 ARP 响应限制(因为 LVS DR 模式下 VIP 通常配置在 lo 网卡上)。 \[root@rs2 system-connections\]# echo 2 \> /proc/sys/net/ipv4/conf/lo/arp_announce 设置回环网卡的 arp_announce 参数为 2,让服务器发送 ARP 包时,只使用目标网段匹配的网卡 IP 作为源 IP,不暴露 VIP。 \[root@rs2 system-connections\]# echo 2 \> /proc/sys/net/ipv4/conf/all/arp_announce 让所有网卡生效 arp_announce=2,全局限制 ARP 包的源 IP 选择,避免 VIP 被对外暴露 ### 利用火墙标记解决轮询错误 1.在rs主机中同时开始http和https两种协议 #在RS1和RS2中开启https RS1 \[root@RS1 \~\]# dnf install mod_ssl -y \[root@RS1 \~\]# systemctl restart httpd \[root@RS1\~\]# systemctl restart httpd RS2 \[root@RS2 \~\]# dnf install mod_ssl -y \[root@RS2 \~\]# systemctl restart httpd \[root@RS2\~\]# systemctl restart httpd 2.在vsnode中添加https的轮询策略 \[root@vsnode \~\]# ipvsadm -A -t 192.168.0.200:80 -s rr 创建 80 端口虚拟服务 \[root@vsnode \~\]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20 -g 添加 80 端口后端 RS2 \[root@vsnode \~\]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10 -g 添加 80 端口后端 RS1 \[root@vsnode \~\]# ipvsadm -A -t 192.168.0.200:443 -s rr 创建 443 端口虚拟服务 \[root@vsnode \~\]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g 添加 443 端口后端 RS1 \[root@vsnode \~\]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g 添加 443 端口后端 RS2 \[root@vsnode \~\]# 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.0.200:80 rr -\> 192.168.0.10:80 Route 1 0 0 -\> 192.168.0.20:80 Route 1 0 0 TCP 192.168.0.200:443 rr -\> 192.168.0.10:443 Route 1 0 0 -\> 192.168.0.20:443 Route 1 0 0 #### 3.轮询错误展示 \[root@client \~\]# curl 192.168.0.200;curl -k https://192.168.0.200 RS2 - 192.168.0.20 RS2 - 192.168.0.20 解决方案:使用火墙标记访问vip的80和443的所有数据包,设定标记为6666,然后对此标记进行负载 \[root@vsnode \~\]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666 给 80/443 流量打 6666 标记 \[root@vsnode \~\]# ipvsadm -A -f 6666 -s rr 创建基于 6666 标记的 LVS 虚拟服务 \[root@vsnode \~\]# ipvsadm -a -f 6666 -r 192.168.0.10 -g 添加后端节点 192.168.0.10(DR 模式) \[root@vsnode \~\]# ipvsadm -a -f 6666 -r 192.168.0.20 -g 添加后端节点 192.168.0.20(DR 模式) 测试 ![](https://i-blog.csdnimg.cn/direct/e76dfce3366d4474a942985d7cb70b0c.png) ### 利用持久连接实现会话粘滞 1.设定ipvs调度策略 \[root@vsnode \~\]# iptables -t mangle -A PREROUTING -d 192.168.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666 对所有访问 192.168.0.100 的 80/443 端口流量打「6666」标记,然后 LVS 对带这个标记的流量做「轮询 + 1 秒会话保持」的 DR 模式负载均衡。 \[root@vsnode \~\]# ipvsadm -A -f 6666 -s rr -p 1 \[root@vsnode \~\]# ipvsadm -Ln 告诉 LVS:要处理 6666 标记的流量,用轮询方式 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -\> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.0.200:80 rr FWM 6666 rr -\> 192.168.0.10:0 Route 1 0 2 -\> 192.168.0.20:0 Route 1 0 0 测试 ![](https://i-blog.csdnimg.cn/direct/ee9de4f2f5584c7da6a20eec313893ab.png) 观察变化动向 ![](https://i-blog.csdnimg.cn/direct/56aa946c57954d0eb2a431c457b01bcc.png)

相关推荐
cyber_两只龙宝2 小时前
Keepalived+LVS--实现IPVS的高可用+高性能的双主双业务架构详细配置流程及解析
linux·运维·集群·lvs·高性能·keepalived·高可用
吕司2 小时前
Linux——System V 共享内存
linux·运维·服务器
芥子沫2 小时前
Windows 命令行和 Linux 差在哪里?
linux·命令行
IvanCodes2 小时前
七、Linux Shell 与脚本基础
linux·云计算
_OP_CHEN2 小时前
【Linux系统编程】(三十七)信号捕捉全链路拆解|从内核态切换到 sigaction 实战
linux·运维·操作系统·进程·c/c++·信号·信号捕捉
S-码农2 小时前
Linux 进程间通信 —— 匿名管道和命名管道
linux
71ber2 小时前
RHCSE 实战笔记:Keepalived 企业级高可用集群深度解析
linux·服务器·keepalived
一个人旅程~2 小时前
everything的快速搜索怎么达成?
linux·windows·电脑
市安2 小时前
Swarm集群管理
运维·nginx·集群·镜像·swarm