LVS原理学习以及LVS实战案例
一:LVS原理学习
1.LVS集群
(1).首先说说什么是集群
集群(Cluster): 集群是为了解决某个特定问题将堕胎计算机组合起来形成的单个系统
(2).集群的三种常见类型
- LB:LoadBalancing(负载均衡)由多个主机组成,每个主机只承担一部分访问;
- HA:High Availiablity(高可用)SPOF(single Point Of failure)
- HPC:High-performance computing(高性能计算,国家战略资源)
(3).LVS简介
- LVS:Linux Virtual Server,负载调度器,内核集成,章文嵩,阿里的四层SLB(Server LoadBalance)是基于LVS+keepalived实现
- LVS(Linux Virtual Server)是一个负载均衡解决方案,通过将流量分配到多个服务器上来实现高可用性和扩展性
<1>我们为什么使用LVS?
因为一些场景的流量负载会很大(比如同时有几十万的人访问一个网站等等),这样对服务器的负载就比较大,那么为了减少成本(可以购买昂贵的专用负载均衡的设备),那么就需要一种廉价但可以解决问题的方案,这时,LVS就出来了,本身是一种虚拟化技术,那么除了成本低,还有以下原因,使得LVS应用广泛。
高可用性:提供故障转移和冗余。
可扩展性:允许根据需求增加或减少服务器。
性能优化:通过分担流量来提高系统的整体性能。
(4).LVS集群体系结构
(5).LVS相关术语
- VS:Virtual Server---------------------负责调度的主机
- RS:Real Server-----------------------真正提供服务的主机
- CIP:Client IP---------------------------客户端
- VIP: Virtual serve IP------------------- VS外网的IP
- DIP: Director IP--------------------------VS内网的IP
- RIP: Real server IP---------------------真实提供服务的IP
2.LVS集群的类型
(1)LVS-NAT模式
原理图:
#NAT模式的本质就是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出de RS的RIP和PORT实现转发
#RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP;
#该模式支持端口映射,可修改请求报文的目标PORT;
#VS必须是Linux系统,RS可以是任意OS系统
缺点:因为请求与应答都要经过lvs服务器,所以访问量大的话lvs会形成瓶颈,一般要求10-20台节点(真实服务器)。
#即请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈;
(2)LVS-DR模式
- DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
原理图:
数据传输过程:
- 1.客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
- 2.VS调度主机接收到数据帧后把帧中的VIP的MAC该为RS1的MAC,此时帧中的数据为客户端IP+客户端的MAC+VIP+RS1的MAC
- 3.RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的MAC
DR模式的特点:
- 1.Director和各RS都配置有VIP
- 2.确保前端路由器将目标IP为VIP的请求报文发往Director
- 3.在前端网关做静态绑定VIP和Director的MAC地址
- 4.RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;
- 5.RIP的网关不能指向DIP,以确保响应报文不会经由Director
- 6.RS和Director要在同一个物理网络
- 7.请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client
- 8.不支持端口映射(端口不能修败)
- 9.RS可使用大多数OS系统
3.LVS的调度算法
(1)LVS静态调度算法
- 1:RR:roundrobin轮询
- 2:WRR:加权轮询
- 3:SH:Source Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
- 4:DH:Destination Hashing;目标地址哈希,第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡
(2)LVS动态调度算法(插眼,后续补充完善)
1、LC:least connections(最少链接发)
适用于长连接应用Overhead(负载值)=activeconns(活动链接数) x 256+inactiveconns(非活
动链接数)
2、WLC:Weighted LC(权重最少链接)
默认调度方法Overhead=(activeconns x 256+inactiveconns)/weight
3、SED:Shortest Expection Delay,
初始连接高权重优先Overhead=(activeconns+1+inactiveconns) x 256/weight
但是,当node1的权重为1,node2的权重为10,经过运算前几次的调度都会被node2承接
4、NQ:Never Queue,第一轮均匀分配,后续SED
5、LBLC:Locality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理
6、LBLCR:LBLC with Replication,带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS
7、在4.15内核版本以后新增FO和OVF调度算法(待补充)
二:LVS项目实战
1.LVS-NAT模式集群部署
1.实验环境
主机 | IP | VIP | 角色 |
---|---|---|---|
LVS | 仅主机:192.168.0.100 | NAT:172.25.254.100 | 调度器VS |
webserver1 | 仅主机:192.168.0.10,GW:192.168.0.100 | null | 真实服务器 |
webserver2 | 仅主机:192.168.0.20,GW:192.168.0.100 | null | 真实服务器 |
test | NAT:172.25.254.24 | 测试机 |
2.操作实现
1.在node1中启用内核路由功能
[root@lvs ~]# vim /etc/sysctl.conf
[root@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@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@lvs ~]#
2.在node1中安装ipvsadm
[root@lvs ~]# yum install ipvsadm.x86_64 -y
3.然后给webserver1和webserver2配置http或者nginx服务(因为做策略需要用到该服务)
webserver1:
#下载httpd服务
[root@webserver1 ~]# yum install httpd -y
#写一个测试网页,方便后续测试显示结构
[root@webserver1 ~]# echo webserver1 - 192.168.0.10 > /vaar/www/html/index.html
#开启httpd服务
[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
4.给调度器VS写策略
#rr代表轮询的方式
[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
3.结果测试
1.测试用例
[root@test ~]# for i in {1..10}; do curl 172.25.254.100; done
报错
- 显示拒绝访问
检查错误
1.排查防火墙------已关
2.排查路由---------路由也配置完成
3.发现在node1上忘了启动ipvsadm服务
2.启动ipvsadm服务
[root@lvs ~]# systemctl start ipvsadm.service
报错
输入提示信息发现没有/etc/sysconfig/ipvsadm这个文件或目录
#切换到指定目录下
[root@lvs ~]# cd /etc/sysconfig/
#创建文件
[root@lvs sysconfig]# touch ipvsadm
#重新启动,启动完成
[root@lvs ~]# systemctl start ipvsadm.service
重新测试
[root@test ~]# for i in {1..10}; do curl 172.25.254.100; done
测试成功
2.LVS-DR模式集群部署
1.实验环境
主机 | IP | VIP | 角色 |
---|---|---|---|
router | NAT:172.25.254.100;仅主机:192.168.0.10 | null | 路由器 |
LVS | 仅主机:192.168.0.200;GW:192.168.0.10 | lo:192.168.0.100 | VS调度器 |
webserver1 | 仅主机:192.168.0.210;GW:192.168.0.10 | lo:192.168.0.100 | 真实服务器 |
webserver2 | 仅主机:192.168.0.220;GW:192.168.0.10 | lo:192.168.0.100 | 真实服务器 |
test | NAT:172.25.254.24 | null | 测试机 |
2.操作实现
- 在设置路由器的网路时只需要设置IP地址就行
(1)首先按照实验环境配置网络(按照上表),并且在route上开启路由内核
#在route上开启路由内核
[root@lvs ~]# vim /etc/sysctl.conf
[root@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@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
(2)设定VIP
#LVS和两台真实主机除了配置仅主机模式的IP外,再进行环回lo上VIP的配置
#lvs
[root@lvs ~]# ip addr add dev lo 192.168.0.100/32
#webserver1
[root@webserver1 ~]# ip addr add dev lo 192.168.0.100/32
#webserver2
[root@webserver2~]# ip addr add dev lo 192.168.0.100/32
然后重启lo网卡
其余IP配置均按表中所述
(3)在webserver1和webserver2中解决响应问题
#webserver1
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
#webserver2
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
(4)在LVS中配置策略
[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.210:80 Route 1 0 5
-> 192.168.0.220:80 Route 1 0 4
3.结果测试
测试机上进行访问
这里我进行了抓包测试
#这里是我的主机的MAC地址
client:00:0c:29:3f:86:59
router-eth0:00:0c:29:d2:44:ee
router-eth1:00:0c:29:d2:44:f8
lvs:00:0c:29:81:d5:18
server1:00:0c:29:4f:cd:d7
server2:00:0c:29:dc:96:2e
结果验证正确(因为DR模式下只有MAC地址会发生变化,所以需要抓包来验证结果,这里抓包的展示只有一个,因为看到这里大家可以自己试一试,自己感受一下,所以就没有全部放出来)
3.防火墙标签解决轮询错误
1.实验环境
- 这个实验环境依然应用DR模式下的实验环境
以http和https为例,当我们在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就出
现了一个轮询错乱的问题
当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上
操作环境
(1)给RS安装mod_ssl软件并重启httpd服务
[root@webserver1 ~]# yum install mod_ssl -y
[root@webserver1 ~]# systemctl restart httpd
[root@webserver2 ~]# yum install mod_ssl -y
[root@webserver2 ~]# systemctl restart httpd
(2)实际问题的策略
(3)问题出现(同时访问会将流量打在同一台主机上)
2.操作实现
问题解决
(1)使用FWM(Firewall Mark)(用于给特定服务打上标记)
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666
#策略
[root@lvs ~]# ipvsadm -A -f 6666 -s rr
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.210 -g
[root@lvs ~]# ipvsadm -a -f 6666 -r 192.168.0.220 -g
3.结果测试
测试结果为同时发出的流量打在不同的服务器上,测试成功
最后分享一个黄昏吧
诸君共勉!