一篇精通LVS(保姆级)

华子目录

LVS前言

集群分布式

系统性能扩展

  • Scale UP向上扩展加硬件增强
  • Scale Out向外扩展加设备增强,但是需要注意调度流量的分配问题Cluster集群

集群cluster

  • Cluster: 集群,是为了解决某个特定问题将服务器组合起来形成的单个系统
Cluster常见的三种类型:
  • LBLoadBalancing负载均衡)由多个主机组成,每个主机只承担一部分访问

  • HAHigh Availiablity高可用),SPOF(single Point Of failure)(解决单点主机失效)

    • MTBFMean Time Between Failure 平均无故障时间正常时间
    • MTTRMean Time To Restorationrepair平均恢复前时间也就是故障时间
    • A=MTBF/(MTBF+MTTR)属于 (0,1)99%, 99.5%, 99.9%, 99.99%, 99.999%A的值越高,服务器性能越好
  • HPCHigh-performance computing高性能计算,国家战略资源,不在课程范围内)

分布式

  • 分布式存储Ceph,GlusterFs,FastDFS,MogileFs
  • 分布式计算hadoop,Spark
分布式常见应用
  • 分布式应用:服务按照功能拆分,使用微服务
  • 分布式静态资源静态资源放在不同的存储集群
  • 分布式数据和存储:使用key-value缓存系统
  • 分布式计算:对特殊业务使用分布式计算,比如Hadoop集群

集群与分布式的区别

  • 集群:同一个业务系统部署在多台服务器上,集群中,每一台服务器实现的功能没有差别数据和代码都是一样的
  • 分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的数据和代码也是不一样的分布式每台服务器功能加起来,才是完整的业务
  • 分布式是以缩短单个任务执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率
  • 对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器负载情况,决定由给哪一台去完成响应,并且后台服务器垮了,其它的服务器可以顶上来分布式每一个节点,都完成不同的业务,如果一个节点垮了那这个业务可能就会失败。

LVSLinux virtual server

lvs简介

  • LVSLinux Virtual Server负载调度器linux内核集成,由中国章文嵩创作,阿里的四层SLB(Server LoadBalance)是基于LVS+keepalived实现
  • LVS官网: http://www.linuxvirtualserver.org/

lvs相关术语

  • VSVirtual Server负责调度lvs服务器
  • RSRealServer负责真正提供服务的服务器
  • CIPClient IP,客户端的ip
  • VIPVirtual serve IP lvs调度器外网的ip
  • DIPDirector IP lvs调度器内网的ip
  • RIPReal server IP真正提供服务的服务器ip

流量访问流程

  • 来时流量:CIP --> VIP == DIP --> RIP
  • 回时流量:CIP <-- VIP == DIP <-- RIP

lvs集群体系架构

在这里插入图片描述

工作原理

  • VS根据请求报文目标IP目标协议及端口将其调度转发某RS上,VS会根据调度算法挑选RS

lvs集群的类型

  • lvs-nat:修改请求报文的目标IP多目标IPDNAT
  • lvs-dr:操纵封装新的MAC地址
  • lvs-tun:在原请求IP报文之外新加一个IP首部
  • lvs-fullnat修改请求报文的源和目标IP

lvs-nat

  • 本质是多目标IPDNAT,通过将请求报文中的目标地址目标端口修改为某挑出RSripport实现转发
  • ripdip应在同一个IP网络同一网段),且应使用私网地址
  • RS网关要指向dip
  • 请求报文响应报文都必须经由Director转发,Director易于成为系统瓶颈
  • 支持端口映射,可修改请求报文目标port
  • vs必须是Linux系统RS可以是任意OS系统

nat模式数据逻辑

在这里插入图片描述

  • 客户端发送访问请求请求数据包中含有请求来源(cip),访问目标地址(VIP),访问目标端口(80port)
  • VS服务器接收到访问请求做DNAT请求数据包中的目的地址VIP换成RSRIP相应端口9000
  • RS1响应请求,发送响应数据包,包中的响应报文为数据来源(RIP1)响应目标(CIP)响应端口(9000port)
  • VS服务器接收到响应数据包改变包中的数据来源(RIP1-->VIP)响应目标端口(9000-->80)
  • VS服务器把修改过报文的响应数据包回传给客户端

nat模式的弊端

  • lvsNAT模式接收和返回客户端数据包时都要经过lvs调度机,所以lvs调度机容易阻塞

实验拓扑

在这里插入图片描述

实验主机准备

  • 准备3台主机,一台lvs,两台webserverwebserver1,Webserver2
  • lvs主机上两个网卡,一个nat,一个仅主机
  • 两个webserver上一个仅主机网卡
  • rip网关指向dip

在这里插入图片描述

  • lvs网卡设定

在这里插入图片描述

  • 由于lvsnat模式仅主机模式网卡处于不同vlan,两个网卡要想通信,就必须打开Linux内核路由转发功能
  • webserver1网卡设定

在这里插入图片描述

  • webserver2webserver1一样

实验步骤

1.lvs上的ip设置
  • vip172.25.254.100
  • dip192.168.0.100
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ethernet]

[ipv4]
address=172.25.254.100/24,172.25.254.2
dns=114.114.114.114
method=manual

[ipv6]
addr-gen-mode=default
method=auto

[proxy]
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ethernet]

[ipv4]
address=192.168.0.100/24
method=manual

[ipv6]
addr-gen-mode=default
method=auto

[proxy]
[root@lvs ~]# nmcli connection reload
[root@lvs ~]# nmcli connection up eth0
[root@lvs ~]# nmcli connection up eth1
[root@lvs ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:35:a8:7c brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 172.25.254.100/24 brd 172.25.254.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::aae4:10d1:b082:a3e8/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:35:a8:86 brd ff:ff:ff:ff:ff:ff
    altname enp19s0
    altname ens224
    inet 192.168.0.100/24 brd 192.168.0.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::d494:9f80:ebde:c2fe/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
2.lvs中开启路由转发功能
[root@lvs ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1  #在末尾添加
[root@lvs ~]# sysctl -p   #重新加载
net.ipv4.ip_forward = 1
3.webserver1ip配置
  • rip192.168.0.10
  • 网关指向dip192.168.0.100
[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ethernet]

[ipv4]
address=192.168.0.10/24,192.168.0.100
method=manual

[ipv6]
addr-gen-mode=default
method=auto

[proxy]
[root@webserver1 ~]# nmcli connection reload
[root@webserver1 ~]# nmcli connection up eth0
[root@webserver1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:5f:4a:ff brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.0.10/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::aae4:10d1:b082:a3e8/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@webserver1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
4.webserver2ip配置
  • rip192.168.0.20
  • 网关指向dip192.168.0.100
[root@webserver2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ethernet]

[ipv4]
address=192.168.0.20/24,192.168.0.100
method=manual

[ipv6]
addr-gen-mode=default
method=auto

[proxy]
[root@webserver2 ~]# nmcli connection reload
[root@webserver2 ~]# nmcli connection up eth0
[root@webserver2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:ef:47:71 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.0.20/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::4edb:9236:122:df1a/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@webserver2 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
5.webserver12端安装httpd,并编写测试网页,开启自启动
  • webserver1
[root@webserver1 ~]# yum install httpd -y
[root@webserver1 ~]# echo webserver1-192.168.0.10 > /var/www/html/index.html
[root@webserver1 ~]# systemctl enable --now httpd
  • webserver2
[root@webserver2 ~]# yum install httpd -y
[root@webserver2 ~]# echo webserver2-192.168.0.20 > /var/www/html/index.html
[root@webserver2 ~]# systemctl enable --now httpd
6.内网web服务测试
[root@lvs ~]# curl 192.168.0.10
webserver1-192.168.0.10
[root@lvs ~]# curl 192.168.0.20
webserver2-192.168.0.20
7.安装lvs软件ipvsadm
  • 软件包名:ipvsadm
[root@lvs ~]# yum install ipvsadm -y
8.查看策略
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
9.启动ipvsadm
  • 注意:在启动ipvsadm之前,需要存在/etc/sysconfig/ipvsadm文本文件,否则启动会失败
[root@lvs ~]# touch /etc/sysconfig/ipvsadm
[root@lvs ~]# systemctl restart ipvsadm
[root@lvs ~]# systemctl enable --now ipvsadm.service
10.添加策略
  • -m表示nat模式
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
[root@lvs ~]# ipvsadm -Ln
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 rr
  -> 192.168.0.10:80              Masq    1      0          0
  -> 192.168.0.20:80              Masq    1      0          0

#当访问172.25.254.100:80端口时,使用rr轮询算法,转发到192.168.0.10:80或192.168.0.20:80中
  • 当停止ipvsadm服务后,会将策略自动写入/etc/sysconfig/ipvsadm文本中。所以策略永久添加,添加完之后就会立即生效
  • 也可以使用ipvsadm-save命令实现永久保存策略
[root@lvs ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
-A -t lvs:http -s rr
-a -t lvs:http -r 192.168.0.10:http -m -w 1
-a -t lvs:http -r 192.168.0.20:http -m -w 1
11.lvs-nat模式测试效果

在这里插入图片描述

lvs-dr(企业当中最常用)

  • DRDirect Routing直接路由LVS默认模式应用最广泛,通过为请求报文重新封装一个MAC首部进行转发源MACDIP所在的接口的MAC目标MAC是某挑选出RSRIP所在接口的MAC地址
  • 源IP/PORT,以及目标IP/PORT保持不变

dr模式数据逻辑

在这里插入图片描述

  • DR模式中,RS接收到访问请求不需要回传给VS调度器,而是直接回传数据发送给client客户端,所以RSvs上都要有vip

dr模式数据传输过程

在这里插入图片描述

  • 客户端发送数据帧vs调度主机数据帧内容客户端IP+客户端的MAC+VIP+VIP的MAC
  • VS调度主机接收到数据帧后把数据帧中的VIP的MAC改为RS1的MAC,此时数据帧中的数据客户端IP+客户端的MAC+VIP+RS1的MAC
  • RS1收到数据包后做出响应回传数据包响应数据包中的内容VIP+RS1的MAC+客户端IP+客户端IP的MAC

dr模式的特点

  • Director(vs调度器)各RS都配置有VIP
  • 确保前端路由器目标IPVIP请求报文发往Director
  • RSRIP可以使用私网地址,也可以是公网地址RIPDIP同一IP网络(中间不能加路由器)
  • RIP网关不能指向DIP,以确保响应报文不会经由Director。需要指向边界路由内网地址
  • RSDirector要在同一个物理网络
  • 请求报文经由Director,但响应报文经由Director,而由RS直接发往Client
  • 不支持端口映射端口不能修改
  • 由于dr模式源目ip不变,只有二层mac发生变化,所以vsrs端口必须保持一致
  • RS可使用大多数OS系统
  • RS上修改内核参数以限制arp通告应答级别(使其只能接收,不能响应
  • vs是知道rs的主机网卡的mac,所以vsrs需要处于同一vlan中,中间不能加路由器

实验拓扑

在这里插入图片描述

  • 内网仅主机ip负责通信vip负责对外
  • clientrouter之间是互联网。由于实验环境有限,为了让client访问到rs上,我们让client网关指向routernat来模拟外网互通
  • lvsrs网关都指向router的仅主机(边界路由器的内网地址)
  • 为了简单配置,对lo网卡进行设定(也可以对eth0网卡设定),使其成为vip

实验主机准备

  • 准备5台机子,一台client,一台router,一台lvs,两台webserver充当RS
  • client上一个nat网卡
  • router上一个nat网卡,一个仅主机网卡
  • lvs上一个仅主机网卡用于内网通信lo网卡用作vip
  • RS上一个仅主机网卡用于内网通信lo网卡用作vip
  • client网关指向routernat网卡,lvs,RS网关指向router仅主机网卡

主机准备
在这里插入图片描述

client上一个nat网卡
在这里插入图片描述

router上一个nat网卡,一个仅主机网卡
在这里插入图片描述

  • 由于routernat模式仅主机模式网卡处于不同vlan,两个网卡要想通信,就必须打开Linux内核路由转发功能

lvs上一个仅主机网卡用于内网通信lo网卡用作vip
在这里插入图片描述

RS上一个仅主机网卡用于内网通信lo网卡用作vip
在这里插入图片描述
在这里插入图片描述

解决vip响应问题

dr模型各主机上均需要配置vip解决地址冲突的方式有三种

  • 前端网关静态绑定
  • 各RS使用arptables
  • 各RS修改内核参数,来限制arp响应通告级别
限制响应级别:arp_ignore
  • 0默认值,表示可使用本地任意接口上配置的任意地址进行响应
  • 1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce
  • 0默认值,把本机所有接口所有信息向每个接口的网络进行通告
  • 1:尽量避免将接口信息非直接连接网络进行通告
  • 2:必须避免接口信息非本网络进行通告

实验步骤

1.clientip设定
  • nat网卡:172.25.254.10/24
  • 网关:172.25.254.100/24
[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
uuid=3fe4f788-e5f3-4046-8a3e-6cdfb8098aab
type=ethernet
interface-name=eth0

[ethernet]

[ipv4]
address=172.25.254.10/24,172.25.254.100
method=manual

[ipv6]
addr-gen-mode=default
method=auto

[proxy]
[root@client ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.25.254.100  0.0.0.0         UG    100    0        0 eth0
172.25.254.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
2.router上的ip设定
  • nat网卡:172.25.254.100/24
  • 仅主机网卡:192.168.0.10/24
[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0

[ethernet]

[ipv4]
address=172.25.254.100/24
method=manual

[ipv6]
addr-gen-mode=default
method=auto

[proxy]
[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1
type=ethernet
interface-name=eth1

[ethernet]

[ipv4]
address=192.168.0.10/24
method=manual

[ipv6]
addr-gen-mode=default
method=auto

[proxy]
3.router开启路由转发功能
[root@router ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1  #在文件末尾添加
[root@router ~]# sysctl -p   #加载
net.ipv4.ip_forward = 1
4.lvs主机中的ip设定
  • 仅主机网卡:192.168.0.200/24
  • lo网卡设置为vip192.168.0.100/32
  • 网关指向:192.168.0.10/24
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
uuid=3fe4f788-e5f3-4046-8a3e-6cdfb8098aab
type=ethernet
interface-name=eth0

[ethernet]

[ipv4]
address=192.168.0.200/24,192.168.0.10
method=manual

[ipv6]
addr-gen-mode=default
method=auto

[proxy]
[root@lvs ~]# ip addr add 192.168.0.100/32 dev lo
[root@lvs ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.0.100/32 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:35:a8:7c brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.0.200/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::4e21:e4b4:36e:6d14/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@lvs ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.10    0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
5.webserver1主机中的ip设定
  • 仅主机网卡:192.168.0.11/24
  • lo网卡设置为vip192.168.0.100/32
  • 网关指向:192.168.0.10/24
[root@webserver1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
uuid=3fe4f788-e5f3-4046-8a3e-6cdfb8098aab
type=ethernet
interface-name=eth0

[ethernet]

[ipv4]
address=192.168.0.11/24,192.168.0.10
method=manual

[ipv6]
addr-gen-mode=default
method=auto

[proxy]
[root@webserver1 ~]# ip addr add 192.168.0.100/32 dev lo
[root@webserver1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.0.100/32 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:5f:4a:ff brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.0.11/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::7baa:9520:639b:5e48/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@webserver1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.10    0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
6.webserver2主机中的ip设定
  • 仅主机网卡:192.168.0.22/24
  • lo网卡设置为vip192.168.0.100/32
  • 网关指向:192.168.0.10/24
[root@webserver2 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
uuid=3fe4f788-e5f3-4046-8a3e-6cdfb8098aab
type=ethernet
interface-name=eth0

[ethernet]

[ipv4]
address=192.168.0.22/24,192.168.0.10
method=manual

[ipv6]
addr-gen-mode=default
method=auto

[proxy]
[root@webserver2 ~]# ip addr add 192.168.0.100/32 dev lo
[root@webserver2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.0.100/32 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:ef:47:71 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.0.22/24 brd 192.168.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5db8:7a0d:b282:fdbf/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@webserver2 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.10    0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
7.RS主机禁用arp响应功能(让其只有lvs进行响应
  • webserver1
  • 只有先修改all,才能再修改某一网卡
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
  • webserver2
  • 只有先修改all,才能再修改某一网卡
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
  • 以上配置为临时修改重启无效。若想永久生效,则需要在/etc/sysctl.conf文件中添加
8.RS上配置web服务
  • webserver1
[root@webserver1 ~]# yum install httpd -y
[root@webserver1 ~]# echo webserver1 > /var/www/html/index.html
  • webserver2
[root@webserver2 ~]# yum install httpd -y
[root@webserver2 ~]# echo webserver2 > /var/www/html/index.html
9.RS上启动web服务
  • webserver1
[root@webserver1 ~]# systemctl enable --now httpd
  • webserver2
[root@webserver2 ~]# systemctl enable --now httpd
10.安装lvs软件包ipvsadm并启动
[root@lvs ~]# yum install ipvsadm -y
[root@lvs ~]# touch /etc/sysconfig/ipvsadm  #在启动之前必须要有这个文件,否则启动失败

[root@lvs ~]# systemctl restart ipvsadm
[root@lvs ~]# systemctl enable ipvsadm
11.设置lvs策略并保存
  • -g表示dr模式
#当访问vip的80端口时,轮询调度到RS的80端口上
[root@lvs ~]# ipvsadm -A -t 192.168.0.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.11:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.22:80 -g
[root@lvs ~]# 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.100:80 rr
  -> 192.168.0.11:80              Route   1      0          0
  -> 192.168.0.22:80              Route   1      0          0
[root@lvs ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
-A -t lvs:http -s rr
-a -t lvs:http -r 192.168.0.11:http -g -w 1
-a -t lvs:http -r 192.168.0.22:http -g -w 1
12.测试
  • client端访问vip
[root@client ~]# curl 192.168.0.100
webserver2
[root@client ~]# curl 192.168.0.100
webserver1

lvs-tun(了解)

  • 转发方式不修改请求报文的IP首部源IP为CIP目标IP为VIP),而在原IP报文之外再封装一个IP首部源IP是DIP目标IP是RIP),将报文发往挑选出目标RSRS直接响应客户端源IP是VIP目标IP是CIP

tun模式数据传输过程

在这里插入图片描述

  • 客户端发送请求数据包,包内有源IP+vip+dport
  • 到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头新添加IP报文头中包含TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1
  • RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIPCIP)+port响应数据包通过网络直接回传client

tun模式特点

  • DIP, VIP, RIP都应该是公网地址
  • RS网关一般不能指向DIP
  • 请求报文要经由Director,但响应不能经由Director
  • 不支持端口映射
  • RSOS系统支持隧道功能

lvs-fullnat(了解)

在这里插入图片描述

  • fullnat:通过同时修改请求报文源IP地址目标IP地址进行转发
  • CIP --> DIP
  • VIP --> RIP
  • VIP公网地址RIPDIP私网地址,且通常不在同一IP网络;因此,RIP网关一般不会指向DIP
  • RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
  • 请求响应报文都经由Director
  • 支持端口映射

注意

  • 此类型kernel默认不支持

lvs工作模式总结

nat模式dr模式tun模式
RS操作系统不限禁用arp响应支持隧道
调度器服务器网络可跨网络不可跨网络可跨网络
调度服务器数量
RS服务器网关指向到调度器DIP指向到边界路由器内网地址指向到边界路由器内网地址
  • lvs-natlvs-fullnat请求响应报文都经由Director
  • lvs-natRIP网关要指向DIP
  • lvs-fullnatRIPDIP未必在同一IP网络,但要能通信
  • lvs-drlvs-tun请求报文要经由Director,但响应报文RS直接发往Client
  • lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发
  • lvs-tun:通过在原IP报文封装新IP头实现转发支持远距离通信

lvs调度算法

lvs调度算法类型

  • ipvs scheduler调度器:根据其调度时是否考虑RS当前的负载状态被分为两种静态方法动态方法
    • 静态方法:仅根据算法本身进行调度,不考虑RS负载情况
    • 动态方法:主要根据每台RS当前的负载状态调度算法进行调度,overhead=value负载值较小RS将被调度

lvs静态调度算法

  • rrroundrobin 轮询RS分别被调度,当RS配置有差别时不推荐
  • wrrWeighted RR加权轮询,根据RS的配置进行加权调度性能差RS调度次数少
  • shSource Hashing源地址哈希,实现session sticky,对源IP地址进行hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定。如果客户端内网多个主机访问一个网站的时候,就会从同一个公网ip去访问服务器,就会导致RS服务器宕机
  • dhDestination Hashing目标地址哈希第一次轮询调度至RS,后续将发往同一个目标地址请求始终转发至第一次 挑中的RS,典型使用场景正向代理缓存场景中的负载均衡,如:宽带运营商

lvs动态调度算法

主要根据RS当前的负载状态调度算法进行调度,Overhead value负载值较小RS会被调度

  • LCleast connections最少链接发

    • 适用于长连接应用,Overhead负载值)=activeconns活动链接数) x 256 + inactiveconns非活动链接数
    • 活动链接数tcp连接上,并且正在进行数据交互
    • 非活动链接数tcp连接上,没有进行数据交互
  • WLCWeighted LC权重最少链接

    • 默认调度方法,Overhead=(activeconns x 256 + inactiveconns ) / weight
    • weight表示权重
  • SEDShortest Expection Delay初始连接高权重优先

    • Overhead = ( activeconns + 1 + inactiveconns ) x 256 / weight
    • 但是,当RS1权重1RS2权重10,经过运算前几次调度都会被RS2承接
    • wlcsed算法弊端相似
  • NQNever Queue第一轮均匀分配到各RS中,后续SED

  • LBLCLocality-Based LC动态的dh算法使用场景:根据负载状态实现正向代理

  • LBLCRLBLC with Replication,带复制功能LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS

4.15版本内核以后新增调度算法

  • FO ( Weighted Fai Over ) 调度算法:常用作灰度发布

    • 在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载 ( 未设置IP_VS_DEST_FOVERLOAD标志 )的且权重最高真实服务器,进行调度
    • 服务器承接大量链接,我们可以对此服务器进行过载标记IP_VS_DEST_FOVERLOAD),那么vs调度器不会链接调度到有过载标记主机中。
    • 服务器更新时,使用到FO算法
  • OVF ( Overflow-connection ) 调度算法

    • 基于真实服务器活动连接数量权重值实现。将新连接调度到权重值最高真实服务器,直到其活动连接数量超过权重值,之后调度下一个权重值最高真实服务器,在此OVF算法中,遍历虚拟服务相关联的真实服务器链表,找到权重值最高可用真实服务器一个可用真实服务器需要同时满足以下条件:
      • 未过载 ( 未设置IP_VS_DEST_FOVERLOAD标志 )
      • 真实服务器当前的活动连接数量小于其权重值
      • 权重值不为

查看内核支持的lvs算法

  • /boot/config-5.14.0-162.6.1.el9_1.x86_64文本中查看
[root@lvs ~]# cd /boot/
[root@lvs boot]# ls
config-5.14.0-162.6.1.el9_1.x86_64   #查看这个文件
efi
grub2
initramfs-0-rescue-5069a42cb215443bb46c2b9b08bfddc6.img
initramfs-5.14.0-162.6.1.el9_1.x86_64.img
loader
symvers-5.14.0-162.6.1.el9_1.x86_64.gz
System.map-5.14.0-162.6.1.el9_1.x86_64
vmlinuz-0-rescue-5069a42cb215443bb46c2b9b08bfddc6
vmlinuz-5.14.0-162.6.1.el9_1.x86_64
[root@lvs boot]# less config-5.14.0-162.6.1.el9_1.x86_64
# IPVS scheduler
# 以下就是lvs支持的调度算法
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_FO=m
CONFIG_IP_VS_OVF=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_MH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m

lvs命令介绍

lvs软件ipvsadm相关信息

  • 程序包:ipvsadm
  • 服务名:ipvsadm.service
  • 主程序:/usr/sbin/ipvsadm
  • 规则保存工具:/usr/sbin/ipvsadm-save
  • 规则重载工具:/usr/sbin/ipvsadm-restore
  • 配置文件:/etc/sysconfig/ipvsadm-config
  • ipvs调度规则文件/etc/sysconfig/ipvsadm

ipvsadm命令

核心功能

  • lvs集群服务器管理:增、删、改
  • 集群服务中对RS服务器的管理增、删、改`
  • 规则查看

lvs集群中的增删改

管理集群服务lvs中的增删改

增加
  • -A添加
[root@lvs ~]# ipvsadm -A -t(tcp)|-u(udp)|-f(防护墙标签) \
> service-address (lvs集群地址) \
> [-s scheduler (调度算法)] \
> [-p [timeout]] 
单个删除
  • -D删除
#删除单个规则
[root@lvs ~]# ipvsadm -D -t|-u|-f service-address
全部删除
  • -C全部删除
[root@lvs ~]# ipvsadm –C   #清空所有规则
清空计数器
[root@lvs ~]# ipvsadm -Z [-t|u|f service-address]   #清空指定的计数器数据
[root@lvs ~]# ipvsadm -Z     #清空所有的计数器数据
修改
  • -E删除
[root@lvs ~]# ipvsadm -E -t(tcp)|-u(udp)|-f(防护墙标签) \
> service-address (lvs集群地址) \
> [-s scheduler (调度算法)] \
> [-p [timeout]] 
参数说明
-A添加
-E修改
-D删除
-ttcp服务
-uudp服务
-s指定调度算法,默认为WLC。注意:rr调度算法对权重不生效,wrr算法对权重生效
-p设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver
-ffirewall mask 火墙标记,是一个数字
-S保存规则,等同于ipvsadm-save
-R重载,等同于ipvsadm-restore
实例
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m

[root@lvs ~]# ipvsadm -A -t 172.25.254.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 172.25.254.200:80 -r 192.168.0.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.200:80 -r 192.168.0.20:80 -m

[root@lvs ~]# ipvsadm -Ln
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 rr
  -> 192.168.0.10:80              Masq    1      0          0
  -> 192.168.0.20:80              Masq    1      0          0
TCP  172.25.254.200:80 wrr
  -> 192.168.0.10:80              Masq    1      0          0
  -> 192.168.0.20:80              Masq    1      0          0


[root@lvs ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  172.25.254.100:80                   0        1        1       63      100
  -> 192.168.0.10:80                     0        1        0       36       57
  -> 192.168.0.20:80                     0        0        0       27       43
TCP  172.25.254.200:80                   0        0        0        0        0
  -> 192.168.0.10:80                     0        0        0        0        0
  -> 192.168.0.20:80                     0        0        0        0        0



[root@lvs ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  172.25.254.100:80                   0        1        1       63      100
  -> 192.168.0.10:80                     0        1        0       36       57
  -> 192.168.0.20:80                     0        0        0       27       43



[root@lvs ~]# ipvsadm -Z    #清空计数器
[root@lvs ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
  -> RemoteAddress:Port
TCP  172.25.254.100:80                   0        0        0        0        0
  -> 192.168.0.10:80                     0        0        0        0        0
  -> 192.168.0.20:80                     0        0        0        0        0
  • 删除172.25.254.200
[root@lvs ~]# ipvsadm -D -t 172.25.254.200:80
[root@lvs ~]# ipvsadm -Ln
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 rr
  -> 192.168.0.10:80              Masq    1      0          1
  -> 192.168.0.20:80              Masq    1      0          1
  • 删除防火墙标记
[root@lvs ~]# ipvsadm -D -f 66
  • 修改调度算法
[root@lvs ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr
[root@lvs ~]# ipvsadm -Ln
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@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  • ipvsadm-save等同于ipvsadm -S
[root@lvs ~]# ipvsadm -S
-A -t lvs:http -s rr
-a -t lvs:http -r 192.168.0.10:http -m -w 1
-a -t lvs:http -r 192.168.0.20:http -m -w 1
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
[root@lvs ~]#
[root@lvs ~]# ipvsadm-save
-A -t lvs:http -s rr
-a -t lvs:http -r 192.168.0.10:http -m -w 1
-a -t lvs:http -r 192.168.0.20:http -m -w 1
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
[root@lvs ~]#
  • 保存规则
  • ipvsadm -S等同于ipvsadm-save
[root@lvs ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
-A -t lvs:http -s rr
-a -t lvs:http -r 192.168.0.10:http -m -w 1
-a -t lvs:http -r 192.168.0.20:http -m -w 1

#或者-n快速简单保存
[root@lvs ~]# ipvsadm -S -n > /etc/sysconfig/ipvsadm
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
-A -t 172.25.254.100:80 -s rr
-a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 1
-a -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1
  • 恢复策略(前提是:/etc/sysconfig/ipvsadm文件中记录着策略)(所以-A添加的策略在内存中保存,-C删除了内存中的策略,通过ipvsadm -Ripvsadm-restore命令进行恢复)
[root@lvs ~]# ipvsadm -C   #先清空
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@lvs ~]# ipvsadm -R < /etc/sysconfig/ipvsadm

[root@lvs ~]# ipvsadm -Ln
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 rr
  -> 192.168.0.10:80              Masq    1      0          0
  -> 192.168.0.20:80              Masq    1      0          0

管理集群中RS增删改

增加
  • -a添加
[root@lvs ~]# ipvsadm -a -t(tcp)|-u(udp)|-f(防火墙标签) service-address (lvs集群地址) \
> -r server-address(RS的地址) [-g | -i| -m] (工作模式) \
> [-w weight](权重)
删除
  • -d删除
[root@lvs ~]# ipvsadm -d -t|-u|-f service-address -r server-address 
修改
  • -e修改
[root@lvs ~]# ipvsadm -e -t(tcp)|-u(udp)|-f(防火墙标签) service-address (lvs集群地址) \
> -r server-address(RS的地址) [-g | -i| -m] (工作模式) \
> [-w weight](权重)
参数说明
-a添加real server
-e更改real server
-ttcp协议
-uudp协议
-f防火墙标签,是一个数字
-rreal server地址
-g直连路由模式
-iip隧道模式
-mnat模式
-w设置权重
-Z清空计数器
-C清空lvs策略
-L查看lvs策略
-n不做解析
--rate输出速率信息

解决rr轮询错误

轮询规则中可能会遇到的错误

  • httphttps为例,当我们在RS中同时开放80443端口,那么默认控制分开轮询的,这样我们就出现了一个轮询错乱问题
    • 当我第一次访问80被轮询到RS1后,下次访问443仍然会被轮询到RS1

问题复现

dr模式的实验进行复现

  • webserver1上安装mod_ssl
[root@webserver1 ~]# yum install mod_ssl -y
  • webserver2上安装mod_ssl
[root@webserver2 ~]# yum install mod_ssl -y

安装完之后,证书密钥就使用默认

  • webserver1webserver2上重启httpd
[root@webserver1 ~]# systemctl restart httpd
[root@webserver2 ~]# systemctl restart httpd
[root@webserver1 ~]# netstat -antlupe | grep httpd
tcp6       0      0 :::443                  :::*                    LISTEN      0          99859      33051/httpd
tcp6       0      0 :::80                   :::*                    LISTEN      0          99851      33051/httpd
[root@webserver2 ~]# netstat -antlupe | grep httpd
tcp6       0      0 :::443                  :::*                    LISTEN      0          100552     32978/httpd
tcp6       0      0 :::80                   :::*                    LISTEN      0          100544     32978/httpd
  • lvs主机添加443端口策略
[root@lvs ~]# 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.100:80 rr
  -> 192.168.0.11:80              Route   1      0          1
  -> 192.168.0.22:80              Route   1      0          1
[root@lvs ~]# ipvsadm -A -t 192.168.0.100:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:443 -r 192.168.0.11:443 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.100:443 -r 192.168.0.22:443 -g
[root@lvs ~]# 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.100:80 rr
  -> 192.168.0.11:80              Route   1      0          0
  -> 192.168.0.22:80              Route   1      0          0
TCP  192.168.0.100:443 rr
  -> 192.168.0.11:443             Route   1      0          0
  -> 192.168.0.22:443             Route   1      0          0
#以上是2个集群
  • 测试(一个访问http,一个访问https
#-k访问时跳过证书
[root@client ~]# curl 192.168.0.100;curl -k https://192.168.0.100:443
webserver1
webserver1
[root@client ~]# curl 192.168.0.100;curl -k https://192.168.0.100:443
webserver2
webserver2
  • 我们发现不合理,应该是一个webserver1,一个webserver2
  • 不合理的根本原因是:两个集群是分开控制的

使用火墙标记解决rr轮询问题

  • FWMFireWall Mark
  • MARK target:可用于给特定的报文标记
  • --set-mark value
    • 其中:value可为0xffff格式,表示十六进制数字,借助于防火墙标记分类报文,而后基于标记定义集群服务:可将多个不同应用使用同一个集群服务进行调度

lvs

#先清空lvs策略
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lvs ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
  • lvs主机中为端口标记
#在lvs调度器中设定端口标签,人为80和443是一个整体
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66

#-d指定vip
[root@lvs ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
MARK       tcp  --  0.0.0.0/0            192.168.0.100        multiport dports 80,443 MARK set 0x42

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
  • 添加策略(在lvs主机基于标记定义集群服务
[root@lvs ~]# ipvsadm -A -f 66 -s rr
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.11 -g
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.22 -g
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  66 rr
  -> 192.168.0.11:0               Route   1      0          0
  -> 192.168.0.22:0               Route   1      0          0
  • 测试结果(发现现象合理测试成功
[root@client ~]# curl 192.168.0.100;curl -k https://192.168.0.100:443
webserver2
webserver1
[root@client ~]# curl 192.168.0.100;curl -k https://192.168.0.100:443
webserver2
webserver1

lvs持久链接

  • 在我们客户上网过程中有很多情况下需要和服务器进行交互客户需要提交响应信息服务器,如果单纯的进行调度导致客户填写的表单丢失,为了解决这个问题我们可以用sh算法,但是sh算法比较简单粗暴,可能会导致调度失衡

解决方案

  • 在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源主机调度到了那个RS
  • 如果在短期默认360S)内,同源再来访问我仍然按照内存记录的调度信息,把这个源访问调度同一台RS
  • 如果过了比较的时间(默认最长时间360s同源访问再次来访,那么就会被调度其他的RS

火墙标记实验,我们通过-p参数,设置会话持久保持时间

  • 如果-p不指定数字,默认为360s
[root@lvs ~]# ipvsadm -E -f 66 -s rr -p 3
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  66 rr persistent 3
  -> 192.168.0.11:0               Route   1      0          0
  -> 192.168.0.22:0               Route   1      0          0
  • 测试
[root@client ~]# curl 192.168.0.100
webserver2
[root@client ~]# curl 192.168.0.100
webserver2
[root@client ~]# curl 192.168.0.100
webserver2

#等待3s过后
[root@client ~]# curl 192.168.0.100
webserver1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

^~^前行者~~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值