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 测试结果  #### 利用自定义文件进行持久化 \[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  \[root@vsnode \~\]# ipvsadm-restore \< /mnt/ipvs.rule  #### 利用守护进程进行规则持久化 \[root@vsnode \~\]# ipvsadm-save -n \> /etc/sysconfig/ipvsadm \[root@vsnode \~\]# ipvsadm -C  \[root@vsnode \~\]# systemctl enable --now ipvsadm.service Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.  ## DR模式实验  ### 环境设定 #### #在路由器中配置 \[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  ### 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)  检测  ### 客户机配置  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 模式) 测试  ### 利用持久连接实现会话粘滞 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 测试  观察变化动向 