华子目录
LVS前言
集群
与分布式
系统性能扩展
Scale UP
:向上扩展
,加硬件
增强Scale Out
:向外扩展
,加设备
增强,但是需要注意调度流量的分配问题
,Cluster集群
集群cluster
Cluster
:集群
,是为了解决某个特定问题将服务器
组合起来形成的单个系统
Cluster
常见的三种类型:
-
LB
:LoadBalancing
(负载均衡
)由多个主机
组成,每个主机只承担一部分访问
-
HA
:High Availiablity
(高可用
),SPOF(single Point Of failure
)(解决单点主机失效
)MTBF
:Mean Time Between Failure
平均无故障时间
,正常时间
MTTR
:Mean Time To Restoration
(repair
)平均恢复前时间
,也就是故障时间
A=MTBF/(MTBF+MTTR)
属于(0,1)
:99%, 99.5%, 99.9%, 99.99%, 99.999%
,A的值越高,服务器性能越好
-
HPC
:High-performance computing
(高性能计算
,国家战略资源,不在课程范围内)
分布式
- 分布式
存储
:Ceph,GlusterFs,FastDFS,MogileFs
- 分布式
计算
:hadoop,Spark
分布式常见应用
- 分布式
应用
:服务按照功能
拆分,使用微服务
- 分布式
静态资源
:静态资源
放在不同的存储集群
上 - 分布式
数据和存储
:使用key-value
缓存系统 - 分布式
计算
:对特殊业务
使用分布式计算
,比如Hadoop
集群
集群与分布式的区别
- 集群:
同一个业务系统
,部署在多台服务器上
,集群中,每一台服务器实现的功能没有差别
,数据和代码
都是一样的 - 分布式:
一个业务
被拆成多个子业务
,或者本身就是不同的业务
,部署在多台服务器
上。分布式中,每一台服务器
实现的功能是有差别的
,数据和代码也是不一样的
,分布式每台服务器功能加起来,才是完整的业务
- 分布式是以
缩短单个任务
的执行时间
来提升效率的,而集群
则是通过提高单位时间内执行的任务数
来提升效率
- 对于大型网站,访问用户很多,实现
一个群集
,在前面部署一个负载均衡服务器
,后面几台服务器完成同一业务。如果有用户进行相应业务访问时,负载均衡器
根据后端哪台服务器
的负载情况
,决定由给哪一台去完成响应,并且后台服务器
垮了,其它的服务器可以顶上来
。分布式
的每一个节点
,都完成不同的业务
,如果一个节点垮了
,那这个业务可能就会失败。
LVS
(Linux virtual server
)
lvs
简介
LVS
:Linux Virtual Server
,负载调度器
,linux内核集成
,由中国章文嵩
创作,阿里的四层SLB
(Server LoadBalance
)是基于LVS+keepalived
实现LVS
官网: http://www.linuxvirtualserver.org/
lvs
相关术语
VS
:Virtual Server
,负责调度
的lvs
服务器RS
:RealServer
,负责真正提供服务
的服务器CIP
:Client IP
,客户端的ipVIP
:Virtual serve IP
lvs调度器外网的ip
DIP
:Director IP
lvs调度器内网的ip
RIP
:Real server IP
真正提供服务的服务器ip
流量访问流程
- 来时流量:
CIP --> VIP == DIP --> RIP
- 回时流量:
CIP <-- VIP == DIP <-- RIP
lvs集群体系架构
工作原理
VS
根据请求报文
的目标IP
和目标协议及端口
将其调度转发
至某RS
上,VS
会根据调度算法
来挑选RS
lvs集群的类型
lvs-nat
:修改请求报文的目标IP
,多目标IP
的DNAT
lvs-dr
:操纵封装新的MAC
地址lvs-tun
:在原请求IP报文
之外新加一个IP首部
lvs-fullnat
:修改
请求报文的源和目标IP
lvs-nat
- 本质是
多目标IP
的DNAT
,通过将请求报文
中的目标地址
和目标端口
修改为某挑出
的RS
的rip
和port
实现转发 rip
和dip
应在同一个IP网络
(同一网段
),且应使用私网地址
RS
的网关
要指向dip
请求报文
和响应报文
都必须经由Director
转发,Director
易于成为系统瓶颈
- 支持
端口映射
,可修改请求报文
的目标port
vs
必须是Linux系统
,RS
可以是任意OS系统
nat模式数据逻辑
客户端
发送访问请求
,请求数据包
中含有请求来源(cip)
,访问目标地址(VIP)
,访问目标端口(80port)
VS服务器
接收到访问请求做DNAT
把请求数据包
中的目的地址
由VIP
换成RS
的RIP
和相应端口9000
RS1
响应请求,发送响应数据包
,包中的响应报文
为数据来源(RIP1)
,响应目标(CIP)
,响应端口(9000port)
VS服务器
接收到响应数据包
,改变
包中的数据来源(RIP1-->VIP)
,响应目标端口(9000-->80)
VS服务器
把修改过报文的响应数据包
回传给客户端
nat模式的弊端
lvs
的NAT模式
接收和返回客户端数据包时都要经过lvs
的调度机
,所以lvs
的调度机容易阻塞
实验拓扑
实验主机准备
- 准备
3
台主机,一台lvs
,两台webserver
(webserver1,Webserver2
) lvs
主机上两个网卡
,一个nat
,一个仅主机
- 两个
webserver
上一个仅主机
网卡 rip
的网关
指向dip
lvs
网卡设定
- 由于
lvs
的nat模式
和仅主机模式
的网卡
处于不同vlan
,两个网卡要想通信
,就必须打开Linux内核路由转发功能
webserver1
网卡设定
webserver2
和webserver1
一样
实验步骤
1.lvs
上的ip
设置
vip
:172.25.254.100
dip
:192.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.webserver1
的ip
配置
rip
:192.168.0.10
网关
指向dip
:192.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.webserver2
的ip
配置
rip
:192.168.0.20
网关
指向dip
:192.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
(企业当中最常用)
DR
:Direct Routing
,直接路由
,LVS默认模式
,应用最广泛
,通过为请求报文
重新封装
一个MAC首部
进行转发
,源MAC
是DIP
所在的接口的MAC
,目标MAC
是某挑选出
的RS
的RIP
所在接口的MAC地址
源IP/PORT
,以及目标IP/PORT
均保持不变
dr模式数据逻辑
- 在
DR模式
中,RS
接收到访问请求
后不需要
回传给VS调度器
,而是直接
把回传数据
发送给client客户端
,所以RS
和vs
上都要有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
- 确保
前端路由器
将目标IP
为VIP
的请求报文
发往Director
RS
的RIP
可以使用私网地址
,也可以是公网地址
;RIP
与DIP
在同一IP网络(中间不能加路由器)
RIP
的网关
不能指向DIP
,以确保响应报文
不会经由Director
。需要指向边界路由
的内网地址
RS
和Director
要在同一个物理网络
请求报文
要经由Director
,但响应报文
不经由Director
,而由RS
直接发往Client
不支持端口映射
(端口不能修改
)- 由于
dr模式
下源目ip
不变,只有二层mac
发生变化,所以vs
和rs
的端口
必须保持一致
RS
可使用大多数OS系统
- 在
RS
上修改内核参数
以限制arp通告
及应答级别
(使其只能接收,不能响应
) vs
是知道rs
的主机网卡的mac
,所以vs
和rs
需要处于同一vlan
中,中间不能加路由器
实验拓扑
内网
由仅主机ip
负责通信
,vip
负责对外
client
和router
之间是互联网
。由于实验环境有限
,为了让client
访问到rs
上,我们让client
的网关
指向router
的nat
,来模拟外网互通
。lvs
和rs
的网关
都指向router的仅主机(边界路由器的内网地址)
- 为了
简单配置
,对lo
网卡进行设定(也可以对eth0
网卡设定),使其成为vip
实验主机准备
- 准备
5
台机子,一台client
,一台router
,一台lvs
,两台webserver
充当RS
client
上一个nat
网卡router
上一个nat
网卡,一个仅主机
网卡lvs
上一个仅主机
网卡用于内网通信
,lo
网卡用作vip
RS
上一个仅主机
网卡用于内网通信
,lo
网卡用作vip
client
的网关
指向router
的nat
网卡,lvs,RS
的网关
指向router
的仅主机
网卡
主机准备
client
上一个nat
网卡
router
上一个nat
网卡,一个仅主机
网卡
- 由于
router
的nat模式
和仅主机模式
的网卡
处于不同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.client
的ip
设定
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
网卡设置为vip
:192.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
网卡设置为vip
:192.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
网卡设置为vip
:192.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
),将报文
发往挑选出
的目标RS
;RS
直接响应
给客户端
(源IP是VIP
,目标IP是CIP
)
tun
模式数据传输过程
客户端
发送请求数据包
,包内有源IP+vip+dport
- 到达
vs调度器
后对客户端
发送过来的数据包
重新封装
添加IP报文头
,新添加
的IP报文头
中包含TUNSRCIP
(DIP
)+TUNDESTIP
(RSIP1
)并发送到RS1
RS
收到VS调度器
发送过来的数据包
做出响应
,生成的响应报文
中包含SRCIP
(VIP
)+DSTIP
(CIP
)+port
,响应数据包
通过网络
直接回传
给client
tun
模式特点
DIP
,VIP
,RIP
都应该是公网地址
RS
的网关
一般不能指向DIP
请求报文
要经由Director
,但响应
不能经由Director
不支持端口映射
RS
的OS系统
须支持隧道
功能
lvs-fullnat
(了解)
fullnat
:通过同时
修改请求报文
的源IP地址
和目标IP地址
进行转发
CIP
-->DIP
VIP
-->RIP
VIP
是公网地址
,RIP
和DIP
是私网地址
,且通常不在
同一IP网络
;因此,RIP
的网关
一般不会指向DIP
RS
收到的请求报文
源地址是DIP
,因此,只需响应给DIP
;但Director
还要将其发往Client
请求
和响应报文
都经由Director
- 支持
端口映射
注意
- 此类型
kernel
默认不支持
lvs
工作模式总结
nat模式 | dr模式 | tun模式 | |
---|---|---|---|
RS 操作系统 | 不限 | 禁用arp响应 | 支持隧道 |
调度器 和服务器网络 | 可跨网络 | 不可跨网络 | 可跨网络 |
调度服务器 数量 | 少 | 多 | 多 |
RS 服务器网关 | 指向到调度器DIP | 指向到边界路由器 的内网地址 | 指向到边界路由器 的内网地址 |
lvs-nat
与lvs-fullnat
:请求
和响应
报文都经由Director
lvs-nat
:RIP
的网关
要指向DIP
lvs-fullnat
:RIP
和DIP
未必在同一IP网络
,但要能通信
lvs-dr
与lvs-tun
:请求报文
要经由Director
,但响应报文
由RS
直接发往Client
lvs-dr
:通过封装
新的MAC首部
实现,通过MAC网络
转发lvs-tun
:通过在原IP报文
外封装新IP头
实现转发
,支持远距离通信
lvs
的调度算法
lvs调度算法类型
ipvs scheduler
调度器:根据其调度
时是否考虑
各RS
当前的负载状态
被分为两种
:静态方法
和动态方法
静态方法
:仅根据算法本身
进行调度
,不考虑RS
的负载
情况动态方法
:主要根据每台RS
当前的负载状态
及调度算法
进行调度,overhead=value
负载值较小
的RS将被调度
lvs静态
调度算法
rr
:roundrobin
轮询RS
分别被调度,当RS
配置有差别时不推荐
wrr
:Weighted RR
,加权轮询
,根据RS
的配置进行加权调度
,性能差
的RS
被调度
的次数少
sh
:Source Hashing
,源地址哈希
,实现session sticky
,对源IP地址进行hash
;将来自于同一个IP地址的请求
始终发往第一次挑中的RS
,从而实现会话绑定
。如果客户端内网
有多个主机
访问一个网站的时候,就会从同一个公网ip
去访问服务器,就会导致RS服务器
宕机dh
:Destination Hashing
;目标地址哈希
,第一次轮询调度至RS
,后续将发往同一个目标地址
的请求
始终转发至第一次 挑中的RS
,典型使用场景
是正向代理缓存场景
中的负载均衡
,如:宽带运营商
lvs动态
调度算法
主要根据RS
当前的负载状态
及调度算法
进行调度,Overhead value
负载值较小
的RS会被调度
-
LC
:least connections
(最少链接发
)- 适用于
长连接
应用,Overhead
(负载值
)=activeconns
(活动链接数
) x256
+inactiveconns
(非活动链接数
) 活动链接数
:tcp
连接上,并且正在进行数据交互
的非活动链接数
:tcp
连接上,没有
进行数据交互
的
- 适用于
-
WLC
:Weighted LC
(权重最少链接
)默认
调度方法,Overhead
=(activeconns
x256
+inactiveconns
) /weight
weight
表示权重
-
SED
:Shortest Expection Delay
(初始连接高权重优先
)Overhead
= (activeconns
+1
+inactiveconns
) x256
/weight
- 但是,当
RS1
的权重
为1
,RS2
的权重
为10
,经过运算前几次
的调度
都会被RS2
承接 wlc
和sed
算法弊端
相似
-
NQ
:Never Queue
,第一轮
均匀分配到各RS
中,后续SED
-
LBLC
:Locality-Based LC
,动态的dh算法
,使用场景
:根据负载状态
实现正向代理
-
LBLCR
:LBLC 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 | 删除 |
-t | tcp服务 |
-u | udp服务 |
-s | 指定调度算法 ,默认为WLC 。注意:rr 调度算法对权重 不生效,wrr 算法对权重 生效 |
-p | 设置持久连接超时 ,持久连接可以理解为在同一个时间段同一个来源的请求 调度到同一Realserver |
-f | firewall 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 -R
或ipvsadm-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 |
-t | tcp 协议 |
-u | udp 协议 |
-f | 防火墙 标签,是一个数字 |
-r | real server 地址 |
-g | 直连路由 模式 |
-i | ip隧道 模式 |
-m | nat 模式 |
-w | 设置权重 |
-Z | 清空计数器 |
-C | 清空lvs 策略 |
-L | 查看lvs 策略 |
-n | 不做解析 |
--rate | 输出速率 信息 |
解决rr
轮询错误
轮询规则中可能会遇到的错误
- 以
http
和https
为例,当我们在RS
中同时开放80
和443
端口,那么默认控制
是分开轮询
的,这样我们就出现了一个轮询错乱
的问题
- 当我
第一次
访问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
安装完之后,证书
和密钥
就使用默认
的
webserver1
和webserver2
上重启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
轮询问题
FWM
:FireWall 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