一、LVS定义:
是一个基于 Linux 操作系统的开源软件负载均衡项目。 LVS 主要用于实现服务器的负载均衡和高可用性。它工作在网络的第四层,可以对 TCP 和 UDP 协议进行负载均衡。通过将客户端的请求分发到多台服务器上,从而提高系统的整体性能和可靠性。
二、集群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% ;SLA:Service level agreement(服务等级协议)是在一定开销下为保障服务的性能和可用性,服 务提供商与用户间定义的一种双方认可的协定。通常这个开销是驱动提供服务质量的主要因素。在 常规的领域中,总是设定所谓的三个9,四个9来进行表示,当没有达到这种水平的时候,就会有一 些列的惩罚措施,而运维,最主要的目标就是达成这种服务水平。 停机时间又分为两种,一种是计划内停机时间,一种是计划外停机时间,而运维则主要关注计划外停机时间
- HPC(High-performance computing)
分布式
- 分布式存储:Ceph,GlusterFs,FastDFS,MogileFs
- 分布式计算:hadoop,Spark
应用:
- 分布式应用-服务按照功能拆分,使用微服务
- 分布式静态资源--静态资源放在不同的存储集群上
- 分布式数据和存储--使用key-value缓存系统
- 分布式计算--对特殊业务使用分布式计算,比如Hadoop集群
区别与联系
- 集群:同一个业务系统,部署在多台服务器上,集群中,每一台服务器实现的功能没有差别,数据 和代码都是一样的;通过提高单位时间内执行的任务数 来提升效率。
- 分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起 来,才是完整的业务;以缩短单个任务的执行时间来提升效率的。
举例来说,对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器 完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决定由给哪一台去完成响应,并且台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点, 都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败。
三、LVS运行原理
- VS: Virtual Server,负责调度。
- RS:RealServer,负责真正提供服务。
1.LVS概念
VS |
Virtual Server(虚拟服务器)
|
RS |
Real Server(真实服务器)
|
CIP |
Client IP(客户端IP地址)
|
VIP |
Virtual serve IP VS
外网的IP(虚拟服务器的外网IP地址)
|
DIP |
Director IP VS
内网的
IP(Director的内网IP地址)
|
RIP |
Real server IP(真实服务器的IP地址)
|
访问流程:CIP---VIP==DIP---RIP
2、LVS集群类型
- lvs-nat: 修改请求报文的目标IP,多目标IP的DNAT
- lvs-dr: 操纵封装新的MAC地址
- lvs-tun: 在原请求IP报文之外新加一个IP首部
- lvs-fullnat: 修改请求报文的源和目标IP
四、LVS的NAT模式
数据逻辑:
- 客户端发送访问请求,请求数据包中含有请求来源(cip),访问目标地址(VIP)访问目标端口 (9000port)
- VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口
- RS1相应请求,发送响应数据包,包中的相应保温为数据来源(RIP1)响应目标(CIP)相应端口 (9000port)
- VS服务器接收到响应数据包,改变包中的数据来源(RIP1-->VIP),响应目标端口(9000-->80)
- VS服务器把修改过报文的响应数据包回传给客户端
- lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞
1、实验环境:
主机名 | IP | VIP |
lvs | 192.168.0.100 | 172.25.254.100 |
server1 | 192.168.0.10 | null |
server | 192.168.0.20 | null |
2、命令
(1)在server1和server2上
[root@server1 boot]#vmset.sh eth0 192.168.0.100 webserver1.hyl.org
[root@server1 boot]#vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@server1 boot]#nmcli connection reload
[root@server1 boot]#nmcli connection up eth0
[root@server1 boot]#route -n
[root@server1 boot]# yum install httpd -y
[root@server1 boot]# echo webserver - 192.168.0.10 > /var/www/html/index.html
[root@server boot]# systemctl enable --now httpd
[root@server2 boot]# echo webserver2 - 192.168.0.20 > /var/www/html/index.html
[root@server2 boot]# systemctl enable --now httpd
(2)lvs
关闭防火墙
[root@lvs boot]# systemctl stop firewalld.service
配置
[root@lvs boot]# vmset.sh eth0 172.25.254.100 lvs.hyl.org
[root@lvs boot]# vmset.sh eth1 192.168.0.100 lvs.hyl.org
[root@lvs boot]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
[root@lvs boot]# nmcli connection reload
[root@lvs boot]# nmcli connection up eth1
[root@lvs boot]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@lvs boot]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@lvs boot]# sysctl -p
net.ipv4.ip_forward = 1
测试
[root@lvs boot]# curl 192.168.0.10
[root@lvs boot]# curl 192.168.0.20
安装ipvsadm
[root@lvs boot]# yum install ipvsadm -y
添加调度策略
[root@lvs boot]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs boot]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs boot]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
[root@lvs boot]# 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
保存规则
[root@lvs boot]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
[root@lvs boot]# 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
-a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
[root@lvs boot]# ipvsadm -C
[root@lvs boot]# ipvsadm-restore < /etc/sysconfig/ipvsadm
[root@lvs boot]# 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
-a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
删除所有规则
[root@lvs boot]# ipvsadm -C
[root@lvs boot]# ipvsadm -Ln
重新加载规则
[root@lvs boot]# ipvsadm -R < /etc/sysconfig/ipvsadm-config
[root@lvs boot]# ipvsadm -Ln
测试
[root@lvs boot]# for i in {1..10}; do curl 172.25.254.100; done
五、LVS的DR模式
定义:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源 IP/PORT,以及目标IP/PORT均保持不变
1、实验环境
主机名 | IP | 网关 | VIP |
client | 172.25.254.200 | 172.25.254.100 | null |
router | 172.25.254.100/仅主机192.168.0.100 | null | |
lvs | 192.168.0.50 | 192.168.0.100 | 192.168.0.200 |
server1 | 192.168.0.10 | 192.168.0.200 | 192.168.0.200 |
server2 | 192.168.0.20 | 192.168.0.100 | 192.168.0.200 |
2、配置
(1)server1和server2相同配置
使用vim,这里已经配置好,直接查看
[root@server1 ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0
type=ethernet
interface-name=eth0
[ipv4]
address1=192.168.0.20/24,192.168.0.100
method=manual
RS主机中使VIP不对外响应
[root@server boot]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@server boot]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@server boot]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@server boot]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@server boot]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@server boot]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@server boot]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@server boot]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
在server中设定VIP
[root@server boot]# ip a a 192.168.0.200/32 dev lo
[root@server2 boot]# ip a a 192.168.0.200/32 dev lo
(2)client
[root@client ~]# vmset.sh eth0 172.25.254.200 client.hyl.org
[root@client ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@client ~]# nmcli connection reload
[root@client ~]# nmcli connection up eth1
(3)router
[root@router ~]# vmset.sh eth0 172.25.254.100 router.hyl.org
[root@router ~]# vmset.sh eth1 192.168.0.100 router.hyl.org
[root@router ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
[root@router ~]# nmcli connection reload
[root@router ~]# nmcli connection up reth1
[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection
[connection]
id=eth0 //eth0为nat网卡
type=ethernet
interface-name=eth0
[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114;
[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection
[connection]
id=eth1 //eth1为仅主机网卡
type=ethernet
interface-name=eth1
[ipv4]
address1=192.168.0.100/24
method=manual
启用内核路由功能
[root@router ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@router ~]# vim /etc/sysctl.conf
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1
(4)lvs
[root@lvs boot]# vmset.sh eth1 192.168.0.50 lvs.hyl.org
[root@lvs boot]#vim /etc/NetworkManager/system-connections/eth1.nmconnect ion
[root@lvs boot]# nmcli connection reload
[root@lvs boot]#nmcli connection up reth1
在lvs主机中添加VIP
[root@lvs ~]# ip a a 192.168.0.200/32 dev lo
[root@lvs ~]# nmcli connection reload
[root@lvs ~]# nmcli connection up lo
配置策略
[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 -A -t 192.168.0.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
[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.200:80 wrr
-> 192.168.0.10:80 Route 1 0 0
-> 192.168.0.20:80 Route 2 0 0
测试
[root@client ~]# for i in {1..10}
> do
> curl 192.168.0.200
> done
六、LVS的防火墙标签解决轮询错误
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出现了一个轮询错乱的问题
1、安装mod_ssl模块,以此让RS支持https
[root@server1 ~]# yum install mod_ssl -y
[root@server2 ~]# yum install mod_ssl -y
安装完成之后都要重启
systemctl restart httpd
测试一下
[root@lvs ~]# curl -k https://192.168.0.20
当用client主机去访问会出现轮询错误,同时显示server1或server2上面的内容,按照轮询规则访问时出现一次内容
2、防火墙标记解决轮询调度问题
ipvsadm -AlE -tlulf service-address [-s scheduler] [-p [timeout]] //默认360秒在lvs调度器中设定
[root@lvs ~]# ipvsadm -E -f 6666 -s rr -p [3000]
[root@lvs ~]# ipvsadm -LnC
例:
[root@lvs ~]# ipvsadm -E -f 66 -s rr -p
[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 360
-> 192.168.0.10:0 Route 1 0 0
-> 192.168.0.20:0 Route 1 0 0
测试(在client主机里)
删除持久连接
[root@lvs ~]# ipvsadm -E -f 66 -s rr
[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.10:0 Route 1 0 0
-> 192.168.0.20:0 Route 1 0 0
查看
至此,以上就是lvs的全部内容了