lvs

一:lvs概述

LVS是linux内核的一部分,因此性能高

linux虚拟服务器(即分发器或调度器director);

他不是真正提供服务,但他接受客户的访问,为整个集群提供一个唯一的入口。虚拟服务器再和真实服务器通信(read server)。

它真正提供服务,集群中每个real server可以是一台物理主机,也可以是虚拟机。

lvs相关术语(必记):

DS(或DR):Director  server调度服务器。指的是前端负载均衡器节点。

RS:(real server)后端真实的工作服务器。

vip:virtual  IP虚拟ip。是指向外部直接面用户请求,作为用户请求的目标的ip地址(外网ip地址)。

dip: Director  server ip调度服务器ip,主要用于和内部主机通讯的ip地址。(内网ip地址)

Rip:(real server ip)后端服务器的ip地址。

Cip:client ip,客户端的ip。

注意:LVS调度器需要有2块网卡,一块是对外(wan口)的网卡,一块是对内(lan口)的网卡

二、LVS三种模式
VS/NAT: 网络地址转换模式, 进站/出站的数据流量经过分发器。NAT模式是通过修改客户请求数据包中的端口号、IP地址来实现负载均衡。
VS/DR : 直接路由模式,只有进站的数据流量经过分发器(数据链路层负载均衡,因为他修改的是目的mac地址)
VS/TUN: 隧道模式,只有进站的数据流量经过分发器

三、lvs基本工作原理

dDYBAAAAAAAA&ek=1&kp=1&pt=0&bo=KgIlAQAAAAADEDk!&tl=1&su=0101153185&tm=1553857200&sce=0-12-12&rf=2-9

dL8AAAAAAAAA&ek=1&kp=1&pt=0&bo=KgJEAQAAAAADEFg!&tl=1&su=0175693649&tm=1553857200&sce=0-12-12&rf=2-9

1.当用户请求到达Director server,请求的数据报文会先到内核空间的PREROUTING链。此时报文的源ip为cip,目标ip为vip。

2.PREROUTING检查发现数据包的目标ip是本机,将数据包送至input链

3.ipvs比对数据包请求的服务是否为集群服务,修改数据包的目标ip地址为后端服务器ip,然后将数据吧发送至postrouting链。

4.postrouting链通过路由选路,将数据包发送给Real Server

5.Real Server对比发现目标为自己的ip开始构建响应报文回给Director Server。此时报文的源ip为RIP,目标ip为cip

6.Director Server在响应客户端前,此时会将源ip地址修改为自己的ip地址,然后响应给客户端。此时报文的源ip为vip,目标ip为cip。

 

1.LVS-NAT模型 特性

1).RS应该使用私有ip地址,RS的网关必须指向DIP

2)DIP和RIP必须在同一个网段内

3)请求和响应报文都需经过DIrector  Server,高负载场景中,Director Server易成为性能瓶颈

4)支持端口映射

5)RS可以使用任意操作系统

6)缺陷:对Director Server压力会比较大,请求和响应都需经过director server

 

实验

准备real server的http服务

在node12、node13上做:

要让虚拟机上没有安装nginx

yum  -y  install  httpd  curl

systemctl restart httpd

echo  node12.com > /var/www/html/index.html

13就是echo  node13.com > /var/www/html/index.html

curl  127.0.0.1 做本地测试

route  -n 或 netstat  -r查看路由表信息

route  del  dafault  gw  192.168.11.2 临时删除默认网关

route  add  default  gw  192.168.11.11临时设置默认网关

vim  /etc/syscomfig/network-scripts/ifcfg-ens33中修改网关

route  -n

          LVS负载均衡器配置(node11)

在node11上做的

lsof  -i:80 && nginx  -s  quit

curl  192.168.11.12   &&curl  192.168.11.13  必须确保能访问到此服务器的网站

添加一块新的nat类型的虚拟网卡

将虚拟网卡ens37的ip设置为192.168.10.11

在网络适配器下添加一块nat网卡

cd  /etc/sysconfig/network-scripts/

cp  -av   ifcfg-ens33   ifcfg-ens37

删除两块网卡的gateway网关

route  -n

route  del  default   gw  192.168.11.2

route  del  default   gw  192.168.10.2

配置lvs负载均衡集群列表:

ipvsadm  -Ln

ipvsadm  -C  清空ipvs集群配置信息

ipvsadm  -A  -t  192.168.10.11:80  -s  rr

ipvsadm  -a  -t  192.168.10.11:80  -r  192.168.11.12:80  -m

ipvsadm  -a  -t  192.168.10.11:80  -r  192.168.11.13:80  -m

ipvsadm  -Ln

查看并临时开启路由转发功能

cat  /proc/sys/net/ipv4/ip_forward

echo 1  >  /proc/sys/net/ipv4/ip_forward

------------------------------------------------------------------

开启永久路由转发

vim  /etc/syscrl.conf

net.ipv4.ip_forward=1

立即生效:

sysctl  -p

cat  /proc/sys/net/ipv4/ip_forward

 

在vmware虚拟机网络编辑器上

dL8AAAAAAAAA&ek=1&kp=1&pt=0&bo=0QE2AAAAAAADENM!&tl=1&su=0166949905&tm=1553857200&sce=0-12-12&rf=2-9

将子网ip改为192.168.10.1

笔记本物理机的vmnat8虚拟网卡ip和网关信息必须跟此处相同

在网卡中加入网关192.168.10.11

然后做测试

dD4BAAAAAAAA&ek=1&kp=1&pt=0&bo=kAHLAAAAAAADEG8!&tl=1&su=011080593&tm=1553857200&sce=0-12-12&rf=2-9

命令选项解释:[蓝字为常用选项]
-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器(VIP)。
-E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D --delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C --clear 清除内核虚拟服务器表中的所有记录
-R --restore 恢复虚拟服务器规则
-S --save 保存虚拟服务器规则,备份输出为-R 选项可读的格式
-a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录(RIP)。也就是在一个虚拟服务器中增加一台新的真实服务器
-e --edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d --delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l --list 显示内核虚拟服务器表
-Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)
--set tcp tcpfin udp 设置连接超时值
--start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。
--stop-daemon 停止同步守护进程
-h --help 显示帮助信息
-p --persistent [timeout] 持久稳固的服务(持久性连接)。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为360 秒。
-t --tcp-service service-address 说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port]
-f --fwmark-service fwmark 说明是经过iptables 标记过的服务类型。
-u --udp-service service-address 说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port]
-s --scheduler scheduler 使用的调度算法,有这样几个选项 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc.
-M --netmask netmask persistent granularity mask
-r --real-server server-address 真实的服务器[Real-Server:port]
-g --gatewaying 指定LVS 的工作模式为DR直接路由模式(也是LVS 默认的模式)
-i --ipip 指定LVS 的工作模式为隧道模式
-m --masquerading 指定LVS 的工作模式为NAT 模式
-w --weight weight 真实服务器的权值
--mcast-interface interface 指定组播的同步接口
-c --connection 显示LVS 目前的连接 如:ipvsadm -L -c
--timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemon 显示同步守护进程状态
--stats 显示统计信息
--rate 显示速率信息
--sort 对虚拟服务器和真实服务器排序输出
-n --numeric 输出IP地址和端口的数字形式

 

LVS-DR

数据链路层负载均衡

顾名思义,数据链路层负载均衡是指在通信协议的数据链路层修改mac地址进行负载均衡。
这种数据传输方式又称作三角传输模式,负载均衡数据分发过程中不修改IP地址,只修改目的mac地址,通过配置真实物理服务器集群所有机器虚拟IP和负载均衡服务器IP地址一致,从而达到不修改数据包的源地址和目的地址就可以进行数据分发的目的,由于实际处理请求的真实物理服务器IP和数据请求目的IP一致,不需要通过负载均衡服务器进行地址转换,可将相应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。这种负载均衡方式又称作直接路由方式(DR)。

使用三角传输模式的链路层负载均衡时目前大型网站使用最广的一种负载均衡手段。在linux平台上最好的链路层负载均衡开源产品是LVS(linux virtual server)

dDMBAAAAAAAA&ek=1&kp=1&pt=0&bo=KQI.AQAAAAADECE!&tl=1&su=0196793265&tm=1553857200&sce=0-12-12&rf=2-9

 

1.当用户请求到达Director Server,请求的数据会先到内核空间的pereouting链。此时报文的源ip为cip,目标ip为vip。

2.Prerouting检查发现数据包的目标ip是本机,将数据包发送至input链。

3.ipvs比对数据包请求的服务是否为集群服务,若是,将请求报文中的源mac地址修改为dip的mac地址,将目标mac地址修改为rip的mac地址,那么此时数据包将会发送至real server。

4.由于DS和rs在同一个网络中,所以是通过二层来传输。Postrouting链检查目标mac地址为rip的mac地址,那么数据包将会发送至real server。

5.rs发现请求报文的mac地址是自己的mac地址,就接收此报文。处理完成之后,将响应报文通过eth0网卡然后向外发出。此时的源ip地址为vip,目标ip为cip。

6.响应报文最终送达至客户端

 

1.Lvs-DR模型的特性

1.保证前端路由将目标地址为vip报文发给director server,而不是rs

2.rs可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对rip进行直接访问

3.rs跟Director server必须在同一个物理网络中

4.所有的请求报文经由Director Server,但响应报文必须不能进过Director Server

5.不支持地址转换,也不支持端口映射,因为DR模型是工作在二层的,二层只处理数据包中的mac地址

6.rs可以是大多数常见的操作系统

7.rs的网关觉不允许指向DIr(因为我们不允许他经过director)

8.RS上的lo接口配置vip的ip地址

 

3. 过程及解决方案:
1). 客户端要找vip访问80端口,因为是在同一个网段,所以发arp广播找vip的mac地址通信
2). 因为有RS上也有vip,我们不能直接让RS上的vip回应客户端的广播,所以设置内核参数arp_ignore的内容为1
将arp_ignore 设置为1,意味着当别人的arp请求过来的时候,如果接收的设备上面没有这个ip,就不做出响应. 
默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送mac地址

3). 当DR的vip收到这个广播之后,回应mac地址,然后得到客户端发来的80端口请求,再通过lvs分发到一个RS
4). 那么DR如何分发到一个RS?
dip发出arp广播询问RS的ip地址所对应的mac地址,然后发出一个目标ip为RS_vip,目标mac为RS_eth0_mac的包到RS
5). RS必须要使用vip把回应包发出去(这样client收到之后一看源地址是vip,他就会相信这是正确的地址发来的包)
6). 那么怎样让RS使用lo的vip而不使用eth0?
设置arp_announce文件的内容为2, 2的意思是使用本机最好的本地IP地址把回应包发出去
7). 最后怎么算是最好的本地IP地址?
同一个网段下,使用可变长度子网掩码最长的IP地址被认为是好IP,因为他更精确

dL4AAAAAAAAA&ek=1&kp=1&pt=0&bo=4QE1AQAAAAADEOE!&tl=1&su=0195789073&tm=1553857200&sce=0-12-12&rf=2-9

dL4AAAAAAAAA&ek=1&kp=1&pt=0&bo=KgIiAQAAAAADED4!&tl=1&su=0189802113&tm=1553857200&sce=0-12-12&rf=2-9

vs/dr模式配置

在rel  server上做的  node12

yum  -y   install   httpd

systemclt  restart  httpd

dFIBAAAAAAAA&ek=1&kp=1&pt=0&bo=3wEyAAAAAAADENk!&tl=1&su=0154282433&tm=1553857200&sce=0-12-12&rf=2-9

vim   /aa/lo.sh 脚本如下

dFQBAAAAAAAA&ek=1&kp=1&pt=0&bo=rwFkAAAAAAADEP8!&tl=1&su=0212451265&tm=1553857200&sce=0-12-12&rf=2-9

chmod -v +x lo.sh

.  /aa/lo.sh

然后再传给13的ip

dFQBAAAAAAAA&ek=1&kp=1&pt=0&bo=JAJOAAAAAAADEF0!&tl=1&su=0222883457&tm=1553857200&sce=0-12-12&rf=2-9

 

director调度器

在11上做的

dC0BAAAAAAAA&ek=1&kp=1&pt=0&bo=2wEYAAAAAAADEPc!&tl=1&su=0202461921&tm=1553857200&sce=0-12-12&rf=2-9

给网卡临时设置vip地址

yum  -y  install  ipvsadm

dL8AAAAAAAAA&ek=1&kp=1&pt=0&bo=KgI0AAAAAAADECk!&tl=1&su=039065745&tm=1553857200&sce=0-12-12&rf=2-9

-w  权重  -g指定LVS 的工作模式为DR直接路由模式(也是LVS 默认的模式)
ipvsadm  -sn > /etc/sysconfig/ipvsadm   备份

curl  192.168.11.12

curl  192.168.11.13

访问测试(win7/win10上做):
打开mobaxterm软件,点窗口上的+加号来开启一个cmd命令行界面,执行5次如下命令,看显示的网页信息有何不同
curl 192.168.11.100

dLkAAAAAAAAA&ek=1&kp=1&pt=0&bo=.gEQAQAAAAADEN8!&tl=1&su=0230756353&tm=1553857200&sce=0-12-12&rf=2-9