全网最详细教你学习LVS(Linux virual server)

LVS 官网 : http://www.linuxvirtualserver.org/                    //(可参考)

一、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% SLAService 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模式

数据逻辑:

  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的调度机容易阻塞

1、实验环境:

主机名IPVIP
lvs192.168.0.100172.25.254.100
server1192.168.0.10null
server192.168.0.20null

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
client172.25.254.200172.25.254.100null
router172.25.254.100/仅主机192.168.0.100null
lvs192.168.0.50192.168.0.100192.168.0.200
server1192.168.0.10192.168.0.200192.168.0.200
server2192.168.0.20192.168.0.100192.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的全部内容了 

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值