目录
二.lvs(Linux virtual server) 运行原理
一.集群和分布式简介
1.linux集群(Cluster)
Linux集群(cluster)就是一组Linux计算机,它们作为一个整体向用户提供一组网络资源,这些单个的计算机系统就是集群的节点(node)。一个理想的集群,用户是不会意识到集群系统底层的节点的,在他们看来,集群是一个系统,而非多个计算机系统,并且集群系统的管理员可以随意增加和删改集群系统的节点。
1.1 Linux集群系统的优点
Linux集群系统的优点主要有4方面:
- 易于扩展,管理员可很方便的增加或删除集群系统中的节点。
- 高可用性,当集群中某一个节点失效时,其负责的任务可以传递给其他节点,有效避免单点故障。
- 高性能,负载均衡的集群系统能够承担极大的并发客户请求。
- 高性价比,可以使用相对廉价的硬件构造出高性能的系统。
1.2 常见的Linux集群类型
常见的Linux集群类型包括:
- LB:Load Balancing,负载均衡集群
负载均衡集群中有调度器(Director),它处在多台内部服务器的上层,根据定义的调度方式从下层的服务器组中选择一台来响应客户端发送的请求。
- HA:High Availability,高可用性集群
顾名思义就是服务的可用性比较高,当某台服务器故障后不会造成所提供的服务中断,集群自动将客户的访问请求转交给一个正常工作的服务器。
- HP:Hight Performance,高性能
高性能的集群是当某一项任务计算量非常大的时候,由一个计算机集群共同来完成这项任务,这种 处理方式我们称为并行处理机制。一般高性能集群用于科研工作方面。
1.3 常见的Linux集群扩展类型(组建方式)
- scale up(纵向扩展):通过增加硬件资源,即增加更好的设备来满足性能消耗的需求。但是此方式性价比很低。
- scale out(横向扩展):通过硬件或软件的方式,将由单一服务器负责的业务需求转为一组节点服务器来进行处理,此种方式易于扩展且性价比高。
2.分布式
分布式存储 :Ceph , GlusterFs , FastDFS , MogileFs分布式计算 :hadoop , Spark分布式常见应用分布式应用—— 服务按照功能拆分,使用微服务分布式静态资源—— 静态资源放在不同的存储集群上 分布式数据和存储 -- 使用 key-value 缓存系统分布式计算—— 对特殊业务使用分布式计算,比如 Hadoop 集群
3.集群和分布式
- 集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据 和代码都是一样的
- 分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式 中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起 来,才是完整的业务
- 分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数 来提升效率,
- 对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器 完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决 定由给哪一台去完成响应,并且台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点, 都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败
3.1集群和分布式的通俗理解
集群
小张开了一家小饭店,刚开始的时候店里只有一个厨师,切菜洗菜备料炒菜全干。后来由于饭香甜可口,人流量越来越多了,一个厨师忙不过来了,小张又请了两个厨师,那么这时候三个厨师炒一样的菜,做相同的切菜洗菜备料炒菜等工作,那这三个厨师的关系是集群。也就意味着来一个顾客,只有其中的一个厨师会为这个顾客服务。
分布式
又经过一段时间,店里的生意更加火爆了,小张为了让厨师们能专心炒菜,把菜做到极致,又请了个配菜师负责切菜、备菜、备料,那么厨师和配菜师的关系是分布式,后来一个配菜师也忙不过来了,小张就又请了两个配菜师,三个配菜师关系也是集群。
二.lvs(Linux virtual server) 运行原理
1.lvs介绍
LVS是章文嵩博士发起的自由软件项目,它的官方站点是http://www.linuxvirtualserver.org。LVS工作在内核空间,实现TCP/IP协议群的四层路由,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但从Linux2.4内核以后已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能
- VS: Virtual Server,负责调度
- RS:RealServer,负责真正提供服务
2.lvs集群体系结构
LVS采用三层结构:调度器、服务器池、共享存储,结构如下图:
负载调度器(load balancer/Director):由一台或多台负载调度器组成,主要作用类似一个路由器,将用户请求分发给服务器池上的real server;
服务器池(server pool/Realserver):一组真正执行客户请求的服务器,执行的服务一般有WEB、MAIL、FTP和DNS等。
共享存储(shared storage):为服务器池提供一个共享的存储区,能使得服务器池拥有相同的内容,提供相同的服务。
用户(user)请求通过网络到达lvs(load balance),两个共同组成了高可用,一个出问题另一个立即顶替,保证了稳定性,然后负责将请求调度到真正的real server上, 调度也有四种方式(lvs-nat, lvs-dr,lvs-tun,lvs-fullnat)。调度过来到底给那台,用到lvs的算法。
3.LVS集群类型相关术语
访问流程:CIP <--> VIP == DIP <--> RIP
4.lvs集群的类型
lvs-nat : 修改请求报文的目标IP, 多目标 IP 的 DNAT (就是user访问到lvs,lvs做了个转换,直接访问real server)lvs-dr : 操纵封装新的 MAC 地址lvs-tun : 在原请求IP 报文之外新加一个 IP 首部lvs-fullnat : 修改请求报文的源和目标 IP
4.1 nat模式
Ivs-nat:
- 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和 PORT实现转发
- RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
- 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
- 支持端口映射,可修改请求报文的目标PORT
- VS必须是Linux系统,RS可以是任意OS系统
nat模式数据逻辑
1. 客户端发送访问请求,请求数据包中含有请求来源( cip ),访问目标地址( VIP )访问目标端口( 9000port )2.VS 服务器接收到访问请求做 DNAT 把请求数据包中的目的地由 VIP 换成 RS 的 RIP 和相应端口3.RS1 相应请求,发送响应数据包,包中的相应保温为数据来源( RIP1 )响应目标( CIP )相应端口( 9000port )4.VS 服务器接收到响应数据包,改变包中的数据来源( RIP1-->VIP ) , 响应目标端口( 9000-->80 )5.VS 服务器把修改过报文的响应数据包回传给客户端6.lvs 的 NAT 模式接收和返回客户端数据包时都要经过 lvs 的调度机,所以 lvs 的调度机容易阻塞
nat模型优劣势
优势:节点服务器使用私有IP地址,与负载调度器位于同一个物理网络,安全性比DR模式和TUN模式要高。
劣势:调度器位于客户端和集群节点之间,并负责处理进出的所有通信(压力大的根本原因),大规模应用场景中,调度器容易成为系统瓶颈。
lvs-nat模式原理及部署方法
实验环境部署
设备 角色 ip
rhel9-lvs lvs vip:192.168.10.129/24
dip: 192.168.94.130/24
rhel9-ndoe1 RS1 rip: 192.168.94.135/24
rhel9-node2 RS2 rip: 192.168.94.140/24
rhel9-node3 Client cip: 192.168.10.160/24
rhel9-lvs
rhel-node1,rhel-ndoe2
rhel-node3
注:nat模式和仅主机模式是为了区分网络。(nat模式看作外网,仅主机模式看作内网)
rhel-lvs :
由于lvs两个网卡上的ip属于两个网段,是不通信的,所以需要打开其内核路由功能
[root@rhel9-lvs ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1 # 这里默认的是0,需要改成1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@rhel9-lvs ~]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward=1
# 在配置文件的最后一行加上
[root@rhel9-lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
# 加上配置参数后不回立刻生效,需要输入以上指令,才回生效
rhel-node1,rhel-node2的网关必须指向lvs(就是192.168.94.130)
[root@rhel-node1 ~]# vim /etc/NetworkManager/system-connections/ens160.nmconnection
# 修改配置文件中的网关
[root@rhel-node1 ~]# grep ^address /etc/NetworkManager/system-connections/ens160.nmconnection
address1=192.168.94.135/24,192.168.94.130
[root@rhel-node1 ~]# nmcli connection up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/2)
[root@rhel-node1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.94.130 0.0.0.0 UG 100 0 0 ens160
192.168.94.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
[root@node2 ~]# vim /etc/NetworkManager/system-connections/ens160.nmconnection
[root@node2 ~]# grep ^address /etc/NetworkManager/system-connections/ens160.nmconnection
address1=192.168.94.140/24,192.168.94.130
[root@node2 ~]# nmcli connection reload
[root@node2 ~]# nmcli connection up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/2)
[root@node2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.94.130 0.0.0.0 UG 100 0 0 ens160
192.168.94.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
在rhel-node1和rhel-node2上安装web服务
[root@rhel-node1 ~]# systemctl stop firewalld.service
[root@rhel-node1 ~]# setenforce 0
[root@rhel-node1 ~]# getenforce
Permissive
# 关闭防火墙和selinux
[root@rhel-node1 ~]# yum install httpd -y
[root@rhel-node1 ~]# systemctl enable httpd --now
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
# 开机自启加启动
[root@rhel-node1 ~]# echo node1 - 192.168.94.135 > /var/www/html/index.html
# 将内容写入共享目录
[root@rhel-node1 ~]# systemctl restart httpd
[root@rhel-node2 ~]# systemctl stop firewalld.service
[root@rhel-node2 ~]# setenforce 0
[root@rhel-node2 ~]# getenforce
Permissive
# 关闭防火墙和selinux
[root@rhel-node2 ~]# yum install httpd -y
[root@rhel-node2 ~]# systemctl enable httpd --now
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
# 开机自启加启动
[root@rhel-node2 ~]# echo node2 - 192.168.94.140 > /var/www/html/index.html
# 将内容写入共享目录
[root@rhel-node2 ~]# systemctl restart httpd
注:在实验当中两个服务器内容不一样是为了更清晰的展现效果,在工作中两个服务器内容应当一致。
在rhel-lvs主机中检测:
[root@rhel9-lvs ~]# curl 192.168.94.135
node1 - 192.168.94.135
[root@rhel9-lvs ~]# curl 192.168.94.140
node2-192.168.94.140
#lvs主机应当看可以正常范围到两个web服务器中的内容
以上均为实验开始前的环境部署
实验流程
在lv主机上安装lvs软件包
[root@rhel9-lvs ~]# yum install ipvsadm -y
查看当前策略
[root@rhel9-lvs ~]# ipvsadm -Ln
# 查看当前策略
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 当前无策略
在lvs主机上开始写入策略
[root@rhel9-lvs ~]# ipvsadm -A -t 192.168.10.129:80 -s rr
# -A 表示增加虚拟server, -t 表示增加的调度是tcp协议的服务
# 后面输入的ip是客户访问此ip时开始调度:后加访问的端口
# -s 是指定你的调度算法 rr 是轮巡(静态算法)
[root@rhel9-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.10.129:80 rr
# 该策略有了之后,后段需要调度那些主机,需要继续写出来
[root@rhel9-lvs ~]# ipvsadm -a -t 192.168.10.129:80 -r 192.168.94.135:80 -m
[root@rhel9-lvs ~]# ipvsadm -a -t 192.168.10.129:80 -r 192.168.94.140:80 -m
[root@rhel9-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.10.129:80 rr
-> 192.168.94.135:80 Masq 1 0 0
-> 192.168.94.140:80 Masq 1 0 0
# -r 表示real server 真实主机
# -m 表示我们当前用的lvs的模式是nat ,同理,-g 则表示直连路由, -i表示tun,隧道模式
# -w 指定权重,就是给谁多给谁少, 因为此时的算法是rr,和-w 冲突,所以不生效,要想生效算法应写wr
检测:当访问192.168.10.129时,他真正访问的应该是后端的服务器
注意,lvs主机的防火墙和selinux也要关闭
[root@rhel9-lvs ~]# for i in {1..10}
> do
> curl 192.168.10.129
> done
node2-192.168.94.140
node1 - 192.168.94.135
node2-192.168.94.140
node1 - 192.168.94.135
node2-192.168.94.140
node1 - 192.168.94.135
node2-192.168.94.140
node1 - 192.168.94.135
node2-192.168.94.140
node1 - 192.168.94.135
# 因为是轮循的算法,所以是你一次我一次
# 在企业中两次访问结果应是一致的,以上只是测试,为了更好的提现效果
[root@rhel9-lvs ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
# 保存策略
原理
客户把流量打到了vip上,vip得到流量以后去读取我们lvs的规则策略,看是给谁的,然后查看调度算法是什么,得到调度算法后,按照调度算法对后端的real server(rs)进行调度,调度后rs得到了请求,rs看到的请求是cip, 但是rs无法仍过来数据请求,所以他只能向网关里面扔数据请求,而rs的网关恰恰是lvs的dip,网关处理扔过来的数据请求,最后通过lvs主机的vip来转发到我们的客户。
4.2 lvs-dr:lvs的默认模式
通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。
要点:
- Director和各RS都得配置使用VIP;
- 确保前端路由器将目标IP为VIP的请求报文发往Director:通过在RS上修改内核参数以限制arp通告及应答级别(arp_announce及arp_ignore);
- RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director;VIP配置在DR上的时候,应该是在eth0:0上,在RS上配置VIP的时候,就必须是lo:0了,否则达不到让RS不响应VIP的ARP通告的效果。
- RS跟Director要在同一个物理网络即同一广播域;
- 请求报文要经由Director,但响应不能经由Director,而是由RS通过网关直接发往Client;
- 不支持端口映射
lvs-dr图解及逻辑
1、客户端CIP的请求发送给Director调度器的VIP;
2、Director调度器收到客户端的请求包后,将数据包的MAC地址改成Director调度器选择的某一台RS的MAC地址,并通过交换机(数据链路层)发送给RS服务器(因为MAC地址是RS的MAC地址,所以,RS可以接收到该数据报),注意:此时数据包的目的及源IP地址没有发生任何改变;
3、 (1) RS的数据链路层收到发送来的数据报文请求后,会从链路层往上传给IP层,此时IP层需要验证请求的目标IP地址。因为包的目标IP(即VIP)并不是像常规数据报那样为RS的本地IP,而仅仅目的MAC地址是RS的。所以,在RS上需要配置一个VIP的LoopbackDevice,是因为LoopbackDevice是服务器本地使用的网络接口,对外是不可见的,不会跟Director的VIP冲突;
(2) RS处理数据包完成后,将应答直接返回给客户端(源IP为VIP,目标IP为CIP),响应的数据报不再经过Director调度器。因此如果对外提供LVS负载均衡服务,则RS需要连上互联网才能将应答包返回给客户端。RS最好为带公网IP的服务器,这样可以不经过网关直接回应客户;如果多个RS使用了同一网关出口,网关会成为LVS架构的瓶颈,会大大降低LVS的性能。
dr模型优劣势
优势:负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端,大大提高了 服务器并发能力。
劣势:(1) LVS-RS间必须在同一个VLAN;(2) RS上绑定VIP,风险大。
解决vip响应问题
DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:
1.在前端网关做静态绑定
2.在各RS使用arptables
3.在各RS修改内核参数,来限制arp响应的级别
限制响应级别:arp_ignore
0:默认值,表示可使用本地任意接口上配置的任意地址进行响应
1:仅在请求的目标ip配置在本地主机的接收到请求报文的接口上时,才给予响应
限制通告级别:arp_announce
0: 默认值,把本机所有接口的所有信息向每个接口的网络进行通告
1:尽量避免将接口信息向非直接连接网络进行通告
2: 必须避免将接口信息向非本网络进行通告
1.Director 服务器采用双 IP 桥接网络,一个是 VPP ,一个 DIP2.Web 服务器采用和 DIP 相同的网段和 Director 连接3. 每个 Web 服务器配置 VIP4. 每个 web 服务器可以出外网
lvs-dr模式原理及部署方法
原理:用户的请求传递到lvs(director),通过lvs传递到远端的真实主机,真实主机不经过我们的lvs直接就传递到客户机,减轻了lvs调度器的压力。
注:默认的情况下是不能跨vlan的,我们的lvs和real server必须处在同一个vlan里面。如果要跨vlan就需要使用隧道。
实验环境部署
设备 角色 ip
rhel9-node1 user(客户机) 192.168.10.130/24 rhel9-lvs lvs(调度器) 192.168.94.129/24
rhel9-node4 路由器 192.168.10.133/24
192.168.94.140/24
rhel9-node2 real-server(真实主机) 192.168.94.131/24
rhel9-node3 real-server(真实主机) 192.168.94.130/24
vip:192.168.94.200/32 仅在lvs,node2,和node3主机的环回上设置
注:nat模式和仅主机模式是为了区分网络。(nat模式看作外网,仅主机模式看作内网)
192.168.10.0 网段为nat模式 192.168.94.0 为仅主机模式 , 达到2个vlan的目的
VIP就设置为lvs,node2,node3 的环回地址
rhel9-node1(客户机)
node1为客户机,为nat模式网段,需要将ndoe1主机的网关改为node4(路由器)nat模式网络ip
[root@rhel9-node1 ~]# 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: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:a9:52:82 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.10.130/24 brd 192.168.10.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::9ef0:c209:2ca8:3107/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@rhel9-node1 ~]# vim /etc/NetworkManager/system-connections/ens160.nmconnection
[root@rhel9-node1 ~]# grep ^address /etc/NetworkManager/system-connections/ens160.nmconnection
address1=192.168.10.130/24,192.168.10.133
# 192.168.10.133 为node4nat模式网络ip
[root@rhel9-node1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.10.2 0.0.0.0 UG 100 0 0 ens160
192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
[root@rhel9-node1 ~]# nmcli connection reload
[root@rhel9-node1 ~]# nmcli connection up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@rhel9-node1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.10.133 0.0.0.0 UG 100 0 0 ens160
192.168.10.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
rhel9-node4为路由器(双网卡,兼具nat模式和仅主机模式双网段)
[root@rhel9-src ~]# 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: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:06:42:0a brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.10.133/24 brd 192.168.10.255 scope global dynamic noprefixroute ens160
valid_lft 914sec preferred_lft 914sec
inet6 fe80::20c:29ff:fe06:420a/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:06:42:14 brd ff:ff:ff:ff:ff:ff
altname enp19s0
inet 192.168.94.140/24 brd 192.168.94.255 scope global noprefixroute ens224
valid_lft forever preferred_lft forever
inet6 fe80::b0aa:c729:54d4:cdc4/64 scope link noprefixroute
valid_lft forever preferred_lft forever
node9-lvs为lvs调度器(网络为仅主机模式)
注:lvs的网关需要和路由器仅主机模式ip一致;在lvs调度器上的vip设置为其网卡上的环回
[root@rhel9-lvs ~]# ip a a dev lo 192.168.94.200
[root@rhel9-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.94.200/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:a6:54:78 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.94.129/24 brd 192.168.94.255 scope global dynamic noprefixroute ens160
valid_lft 1445sec preferred_lft 1445sec
inet6 fe80::20c:29ff:fea6:5478/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@rhel9-lvs ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.94.2 0.0.0.0 UG 100 0 0 ens160
192.168.94.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
[root@rhel9-lvs ~]# vim /etc/NetworkManager/system-connections/ens160.nmconnection
[root@rhel9-lvs ~]# nmcli connection reload
[root@rhel9-lvs ~]# nmcli connection up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@rhel9-lvs ~]# grep ^address /etc/NetworkManager/system-connections/ens160.nmconnection
address1=192.168.94.129/24,192.168.94.140
[root@rhel9-lvs ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.94.140 0.0.0.0 UG 100 0 0 ens160
192.168.94.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
node2,node3(都为真实主机)
vip设置为其环回,网关设置为node4仅主机模式网络的ip
[root@rhel9-node3 ~]# ip a a dev lo 192.168.94.200
[root@rhel9-node3 ~]# 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.94.200/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:1a:2d:78 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.94.130/24 brd 192.168.94.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::2631:ad5a:7a34:aa15/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@rhel9-node3 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.10.2 0.0.0.0 UG 100 0 0 ens160
192.168.10.2 0.0.0.0 255.255.255.255 UH 100 0 0 ens160
192.168.94.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
[root@rhel9-node3 ~]# vim /etc/NetworkManager/system-connections/ens160.nmconnection
[root@rhel9-node3 ~]# grep ^address /etc/NetworkManager/system-connections/ens160.nmconnection
address1=192.168.94.130/24,192.168.94.140
[root@rhel9-node3 ~]# nmcli connection reload
[root@rhel9-node3 ~]# nmcli connection up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@rhel9-node3 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.94.140 0.0.0.0 UG 100 0 0 ens160
192.168.94.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
[root@rhel9-node2 ~]# ip a a dev lo 192.168.94.200/32
[root@rhel-node2 ~]# 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.94.200/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:09:d1:40 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.94.131/24 brd 192.168.94.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::c82:aef3:b738:335b/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@rhel-node2 ~]# vim /etc/NetworkManager/system-connections/ens160.nmconnection
[root@rhel-node2 ~]# grep ^address /etc/NetworkManager/system-connections/ens160.nmconnection
address1=192.168.94.131/24,192.168.94.140
[root@rhel-node2 ~]# nmcli connection reload
[root@rhel-node2 ~]# nmcli connection up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)
[root@rhel-node2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.94.140 0.0.0.0 UG 100 0 0 ens160
192.168.94.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
实验流程
rhel9-node4(路由器)
由于rhel9-node4两个网卡上的ip属于两个网段,是不通信的,所以需要打开其内核路由功能
[root@rhel9-src ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0 # 默认是0 关闭的,将其改为1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@rhel9-src ~]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward=1
# 在最后一行加上
[root@rhel9-src ~]# sysctl -p
net.ipv4.ip_forward = 1
# 刷新
rhel9-node2,rhel9-node3(真实主机)
在主机上按照web服务
[root@rhel-node2 ~]# yum install httpd -y
[root@rhel-node2 ~]# echo rhel-node2 - 192.168.94.131 > /var/www/html/index.html
[root@rhel-node2 ~]# systemctl restart httpd.service
[root@rhel-node2 ~]# systemctl enable httpd --now
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@rhel-node2 ~]# curl 192.168.94.131
rhel-node2 - 192.168.94.131
[root@rhel9-node3 ~]# yum install httpd -y
[root@rhel9-node3 ~]# echo rhel-node3 - 192.168.94.130 > /var/www/html/index.html
[root@rhel9-node3 ~]# systemctl restart httpd.service
[root@rhel9-node3 ~]# systemctl enable httpd --now
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@rhel9-node3 ~]# curl 192.168.94.130
rhel-node3 - 192.168.94.130
在主机中解决ARP响应问题
[root@rhel-node2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rhel-node2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rhel-node2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rhel-node2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
# 使vip不对外响应, 只有先all再改lo才能对网卡生效,否则不生效
# 如果需要设置永久设定,就需要将以上内容加到 /etc/sysctl.conf 里面
[root@rhel9-node3 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rhel9-node3 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@rhel9-node3 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rhel9-node3 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
rhle9-lvs
下载ipvsadm软件包
[root@rhel9-lvs ~]# yum install ipvsadm -y
设定策略
[root@rhel9-lvs ~]# ipvsadm -A -t 192.168.94.200:80 -s wrr
[root@rhel9-lvs ~]# ipvsadm -a -t 192.168.94.200:80 -r 192.168.94.130:80 -g -w 1
[root@rhel9-lvs ~]# ipvsadm -a -t 192.168.94.200:80 -r 192.168.94.131:80 -g -w 2
测试
rhel-node1测试
[root@rhel9-node1 ~]# for i in {1..10}
> do
> curl 192.168.94.200
> done
rhel-node2 - 192.168.94.131
rhel-node3 - 192.168.94.130
rhel-node2 - 192.168.94.131
rhel-node2 - 192.168.94.131
rhel-node3 - 192.168.94.130
rhel-node2 - 192.168.94.131
rhel-node2 - 192.168.94.131
rhel-node3 - 192.168.94.130
rhel-node2 - 192.168.94.131
rhel-node2 - 192.168.94.131
拓展:防火墙标签解决轮询错误
以 http 和 https 为例,当我们在 RS 中同时开放 80 和 443 端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题当我第一次访问 80 被轮询到 RS1 后下次访问 443 仍然可能会被轮询到 RS1 上
问题呈现
在node2,node3真实主机上安装https的加密模块
[root@rhel-node2 ~]# yum install mod_ssl -y
# 安装mod模块,就是https的加密模块,ssl
[root@rhel-node2 ~]# systemctl restart httpd
[root@rhel9-node3 ~]# yum install mod_ssl -y
[root@rhel9-node3 ~]# systemctl restart httpd
rhel-lvs
将加权轮询改为轮询,使实验结果能够更加清晰
[root@rhel9-lvs ~]# ipvsadm -E -t 192.168.94.200:80 -s rr
[root@rhel9-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.94.200:80 rr
-> 192.168.94.130:80 Route 1 0 0
-> 192.168.94.131:80 Route 2 0 0
测试
[root@rhel9-node1 ~]# curl -k https://192.168.94.200
rhel-node2 - 192.168.94.131
[root@rhel9-node1 ~]# curl -k https://192.168.94.200
rhel-node3 - 192.168.94.130
# -k 忽略证书
rhel-lvs
在lvs调度器上增加策略
[root@rhel9-lvs ~]# ipvsadm -A -t 192.168.94.200:443 -s rr
[root@rhel9-lvs ~]# ipvsadm -a -t 192.168.94.200:443 -r 192.168.94.130:443 -g
[root@rhel9-lvs ~]# ipvsadm -a -t 192.168.94.200:443 -r 192.168.94.131:443 -g
[root@rhel9-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.94.200:80 rr
-> 192.168.94.130:80 Route 1 0 0
-> 192.168.94.131:80 Route 2 0 0
TCP 192.168.94.200:443 rr
-> 192.168.94.130:443 Route 1 0 0
-> 192.168.94.131:443 Route 1 0 0
在node1上测试
[root@rhel9-node1 ~]# curl 192.168.94.200;curl -k https://192.168.94.200
rhel-node2 - 192.168.94.131
rhel-node2 - 192.168.94.131
注:正常情况下第一个请求到达了131,第二个请求就应该是130,但是两次反馈都相同,所以并不合理
解决问题
FWM:FireWall MarkMARK target 可用于给特定的报文打标记 ,--set-mark value其中 :value 可为 0xffff 格式,表示十六进制数字借助于防火墙标记来分类报文,而后基于标记定义集群服务: 可将多个不同的应用使用同一个集群服务进行调度
实现方法:在Director主机打标记
iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports
$portl,$port2,..-i MARK --set-mark NUMBER
在Director主机基于标记定义集群服务
ipvsadm -A -f NUMBER [options]
解决如下: 在lvs调度器中设定端口标签,认为80和443是一个整体
[root@rhel9-lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.94.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666
[root@rhel9-lvs ~]# ipvsadm -A -f 6666 -s rr
[root@rhel9-lvs ~]# ipvsadm -a -f 6666 -r 192.168.94.131 -g
[root@rhel9-lvs ~]# ipvsadm -a -f 6666 -r 192.168.94.130 -g
# -A 添加
# -d 目的地址
# -p 访问的协议
# -m 多端口标记
# -j 动作
# MARK 标记
测试:
[root@rhel9-node1 ~]# curl 192.168.94.200;curl -k https://192.168.94.200
rhel-node3 - 192.168.94.130
rhel-node2 - 192.168.94.131
4.3 lvs-tun模式
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP)
要点
(1)DIP,VIP,RIP都应该是公网地址; (2)RS的网关不能,也不可能指向DIP,在RS的lo别名网卡上配置vip地址; (3)请求报文要经由Director,但响应不能经由Director; (4)不支持端口映射; (5)RS的OS得支持隧道功能
图解
1、用户发送请求到Director的VIP请求服务;
2、当用户请求到达Director的时候,根据调度算法选择一台RS进行转发,这时使用隧道(tun)封装两个IP首部,此时源IP是DIP,目标IP是RIP;
3、当RS接收到数据报后,看到外层的IP首部,目标地址是自己,就会拆开封装,解析完毕后,发送响应报文,源IP是VIP,目标IP是CIP。
tun模型优劣势
优势:实现了异地容灾,避免了一个机房故障导致网站无法访问。
劣势:RS配置复杂。
4.4 lvs-fullnat
通过同时修改请求报文的源IP地址和目标IP地址进行转发
要点
(1)VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP; (2)RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client; (3)请求和响应报文都经由Director; (4)支持端口映射; (5)lvs-fullnat型lvs默认不支持需更换支持的内核
图解
1、客户端将请求发送给Director的VIP请求服务;
2、VIP通过调度算法,将请求发送给后端的RS,这个时候源地址改成DIP,目标地址改成RIP;
3、RS接收到请求后,由于源地址是DIP,则一定会对DIP进行回应;
4、Director收到RS的响应后,修改数据报的源地址为VIP,目标地址为CIP进行响应。
注意:此调度方式还没有正式被Linux官方录入系统标准库,所以如果向使用此模式,需要去lvs官网下载源码,并且需要重新编译系统内核才可使用。
4.5 lvs调度算法
lvs调度算法类型
- 静态方法:仅根据算法本身进行调度,不考虑RS的负载情况
- 动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度
lvs静态调度算法
- RR:roundrobin 轮询 RS分别被调度,当RS配置有差别时不推荐
- WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
- SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
- DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
lvs动态调度算法
- LC:least connections(最少链接发)
适用于长连接应用 Overhead (负载值) =activeconns (活动链接数) x 256+inactiveconns (非活动链接数)
- WLC:Weighted LC(权重最少链接)
默认调度方法 Overhead=(activeconns x 256+inactiveconns)/weight
- SED:Shortest Expection Delay
初始连接高权重优先 Overhead=(activeconns+1+inactiveconns) x 256/weight但是,当node1 的权重为 1 , node2 的权重为 10 ,经过运算前几次的调度都会被 node2 承接
- NQ:Never Queue,第一轮均匀分配,后续SED
- LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
- LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
三.lvs部署命令介绍
1.lvs软件相关信息
- 程序包:ipvsadm
- Unit File: ipvsadm.service
- 主程序:/usr/sbin/ipvsadm
- 规则保存工具:/usr/sbin/ipvsadm-save
- 规则重载工具:/usr/sbin/ipvsadm-restore
- 配置文件:/etc/sysconfig/ipvsadm-config
- ipvs调度规则文件:/etc/sysconfig/ipvsadm
2.ipvsadm命令
【基本描述】
ipvsadm是linux下的LVS虚拟服务器的管理工具,LVS工作于内核空间,而ipvsadm则提供了用户空间的接口;
【用法】
基本用法如下,分别用于设置虚拟服务算法和后端真实服务器
ipvsadm 选项 服务器地址 -s 算法
ipvsadm 选项 服务器地址 -r 真实服务器地址 [工作模式][权重]...
可使用yum安装或者从官网下载安装包源码安装,两种方式皆可
先检查是否已经安装ipvsadm
[root@rhel-lvs ~]# yum list installed | grep ipvsadm
若没有安装,则使用以下命令安装ipvsadm
[root@rhel-lvs ~]# yum -y install ipvsadm
- 核心功能:
- 集群服务管理:增、删、改
- 集群服务的RS管理:增、删、改
- 查看
命令参数
1.管理集群服务中的增删改ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]-A #添加-E #修改-t#tcp服务-u #udp服务-s #指定调度算法,默认为WLC-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver-f #firewall mask 火墙标记,是一个数字
查看
[root@rhel9-lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
增加一个集群服务
[root@rhel9-lvs ~]# ipvsadm -A -t 192.168.1.100:80 -s rr
### 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.1.100:80 rr
修改一个集群服务
修改集群服务的调度算法。
[root@rhel9-lvs ~]# ipvsadm -E -t 192.168.1.100:80 -s wlc
[root@rhel9-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.1.100:80 wlc
删除一个集群服务
[root@rhel9-lvs ~]# ipvsadm -D -t 192.168.1.100:80
[root@rhel9-lvs ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# 为空
删除所有集群服务
[root@rhel9-lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
真实服务器管理
对要转发的真实服务器条目的增删查改。绑定集群服务、指定LVS转发的工作模式。
-a # 添加 realserver-e # 更改 realserver-t #tcp 协议-u #udp 协议-f # 火墙 标签-r #realserver 地址-g # 直连路由模式-i #ipip 隧道模式-m #nat 模式-w # 设定权重-Z # 清空计数器-C # 清空 lvs 策略-L # 查看 lvs 策略-n # 不做解析--rate :输出速率信息
往集群服务中添加一个真实服务器
[root@rhel9-lvs ~]## ipvsadm -a -t 192.168.1.100:80 -r 172.16.16.2:80 -m -w 1
[root@rhel9-lvs ~]## ipvsadm -a -t 192.168.1.100:80 -r 172.16.16.3:80 -m -w 1
[root@rhel9-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.1.100:80 wlc
-> 172.16.16.2:80 Masq 1 0 0
-> 172.16.16.3:80 Masq 1 0 0
修改集群服务中的一个真实服务器
修改集群服务中的一个真实服务器的权重值。
[root@rhel9-lvs ~]# ipvsadm -e -t 192.168.1.100:80 -r 172.16.16.2:80 -m -w 2
[root@rhel9-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.1.100:80 wlc
-> 172.16.16.2:80 Masq 2 0 0
-> 172.16.16.3:80 Masq 1 0 0
删除集群服务中的一个真实服务器
[root@rhel9-lvs ~]# ipvsadm -d -t 192.168.1.100:80 -r 172.16.16.2:80
[root@rhel9-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.1.100:80 wlc
-> 已被删除
-> 172.16.16.3:80 Masq 1 0 0
清空转发请求计数器
[root@rhel9-lvs ~]# ipvsadm -Z
查看访问量
[root@rhel9-lvs ~]# ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
保存
[root@rhel9-lvs ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
# -n 代表不做解析,加 -n 保存更快