一、LVS
1、lvs集群
lvs(linux virtual server ):阿里的章文嵩发起的开源项目,linux的内核层面实现负载均衡的软件。
主要作用:将多个后端服务器组成一个高可用,高性能的服务器集群,通过负载均衡的算法将客户端的请求分发到后端的服务器上,来实现高可用和负载均衡。
2、集群
集群:为了解决某个特定的问题,将多台计算机组合起来形成的单个系统。
1、系统的拓展方式
垂直扩展:向上扩展,增强,性能更强的计算机,瓶颈,计算机本身设备的限制,硬件本身的性能瓶颈。
水平扩展:向外扩展,增加设备,并行的运行多个服务,依靠网络解决内部通信的问题,cluster集群。
2、集群的类型:三种类型
LB:load balance 负载均衡集群,多个主机组成,每个主机只承担一部分的访问请求。
HA:high availiablity 高可用,这设计系统时,采取一定的措施确保系统当中某一组件或者部分出现故障,整个系统依然能够正常的运行,为了维护整个系统的可用性,可靠性,容错性。
HPC:high-performance computing 高性能 对响应时间,处理能力要求更高。
3、系统可靠性指标
MTBF:Mean time Between Failure 平均无故障时间
MTTR:Mean Time Resotration repair 平均故障恢复时间
A= MTBF/(MTBF+MTTR)
A指标的范围在0-1之间,A指标就是系统可用性的度量,0表示系统越不可以,1表示系统越可用。
A指标要无限接近于1(99.99%)
90%-95% 不合格 98-99% 接受范围内
都是以小时为单位:1年365天=8760小时
4、停机时间
计划内时间,计划内的时间可以不计,但是现在也算在内
计划外时间就是故障时间,从故障发生到故障解决的总时间,计划外时间是我们必须关注的一个指标
当天事必须当天解决-----------没有解决之间人是不可以离开的------------解决完之后必须生成报告,备案以及日报,周边,月报,年报等。
3、lvs适应场景
小集群不需要使用lvs,大集群适应lvs
1、lvs集群中的术语
vs vittual server lvs 服务的逻辑名称,也就是我们外部访问lvs集群时使用的ip地址和端口
DS director server lvs集群中的主服务器,也是调度器(nginx的代理服务器)是集群的核心,调度器就是用来接受客户端的请求转发到后端的服务器。
RS real server lvs集群中的真实服务器,后端服务器,用来接收DS转发来的请求,并且响应结果。
CIP Client ip 客户端的地址,发起请求的客户端地址。
VIP virtual ip lvs 集群使用的ip地址,对外提供集群访问的虚拟ip地址。
DIP dirextor ip 调度器在集群当中的地址,用于和RS通信。
RIP real ip 后端服务器在集群当中的ip地址。
2、lvs的工作方式
NAT模式 :响应要有调度器响应给客户端
DR模式 :直接路由模式 真实服务器直接响应给客户端
TUN: 隧道模式
常用的模式:NAT和DR模式
二、NAT模式
1、nat模式
nat模式是常用的lvs的模式之一。
在nat模式下,lvs会将来自客户端的请求报文中的目标ip地址和端口修改为lvs内部的ip地址和端口,然后把请求转发到后端服务器。
响应之后,响应结果返回客户端的过程中,响应报文经过lvs的处理,把目标ip和端口修改成客户端的ip地址和端口。
好处在于对客户端来说,请求的目标地址始终不变,客户端的配置不需要做特殊修改,只是调度器在对ip和端口进行转换,后端的服务器也不需要修改任何配置。
缺点:性能损失,请求和响应都需要调度器做地址转换,影响性能,net模式只能有一个调度,调度器故障,整个集群就不能正常工作。
2、地址转换
内网-----外网 转换的是源ip地址 snat
外网-----内网 转换的是目的ip dnat
1、客户端发起请求,访问的是vip地址,到达调度器
2、调度器接收到请求之后,根据负载均衡算法选一个后端服务器
3、把请求的地址转换成可以直接和内部RS通信的ip地址(源地址转换)
4、后端服务器处理请求
5、目的地址转换,转换成vip地址
6、调度器的vip响应给客户端。
3、lvs的工具
ipvsadm工具,用来配置和管理lvs集群的工具
-A 添加虚拟服务器 vip
-D 删除虚拟服务器地址
-s 指定负载均衡的调度算法
4、算法
rr默认轮询
wrr加权轮询
最小连接lc
加权最小连接 wlc
5、选项
-a 添加真实服务器
-d 删除真实服务器
-t 指定vip地址和端口
-r 指定rip真实服务器的地址和端口
-m 使用nat模式
-g 使用DR模式
-i 使用隧道模式
-w 设置权重
-p 60 设置连接保持时间
-l 列表查看
-n 数字化展示
6、实验
备配置
nginx1 RS1
nginx2 RS2
test1 调度器 ens33 ens36
test2 客户端
实现使用客户端访问真实服务器RS1,RS2
1、实验原理图
2、相关配置
nginx1配置
nginx1的网卡设置
访问nginx1页面
nginx2配置
访问nginx2页面
test2-1 调度器 配置
modprobe ip_vs //手动加载 ip_vs 模块 cat /proc/net/ip_vs //查看当前系统中ip_vs模块的版本信息
[root@localhost ~]# yum -y install ipvsadm* -y #更新ip_vs模块的版本信息
新增一个网卡并修改对应的配置
ens33网卡配置
ens36网卡配置
地址转换:从内到外将源地址地址转换,转换成vip地址
使用iptables查看nat是否已存在策略
[root@localhost network-scripts]# iptables -t nat -vnL #-t 指定表
添加策略
[root@localhost network-scripts]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ens36 -j SNAT --to 12.0.0.1 #-t指定表 #-A 添加链 #-s指定源地址 #-o指定设备 #-j 控制类型 #--to 转换
配置ipvsadm
由于/etc/sysconfig/ipvsadm目录配置最开始为空,因为不能直接进行重启操作,需要先设置并将生成的文件保存到此目录下
[root@localhost opt]# ipvsadm -C #清空原有的策略 [root@localhost opt]# ipvsadm -A -t 12.0.0.1:80 -s rr #指定好vip地址和端口 #-A添加虚拟服务器 vip #-t 添加指定的vip地址 #-s 添加指定算法 #rr 默认轮询算法
也可以添加其他策略
[root@localhost opt]# ipvsadm -A -t 12.0.0.1:80 -s wrr #创建加权伦询 [root@localhost opt]# ipvsadm -a -t 12.0.0.1:80 -r 192.168.10.41:80 -m -w 2 #加权 [root@localhost opt]# ipvsadm -a -t 12.0.0.1:80 -r 192.168.10.42:80 -m -w 3 #加权 [root@localhost opt]# ipvsadm -ln
选添加vip,虚拟服务器的ip和端口,然后再添加真实服务器
#vip转发到那个真实服务器 [root@localhost opt]# ipvsadm -a -t 12.0.0.1:80 -r 192.168.10.41:80 -m [root@localhost opt]# ipvsadm -a -t 12.0.0.1:80 -r 192.168.10.42:80 -m #-a添加真实服务器 #-t指定vip地址 #-r指定真实服务器的地址和端口 #-m指定模式为nat模式
查看
[root@localhost opt]# ipvsadm -ln
保存
[root@localhost opt]# ipvsadm-save >/etc/sysconfig/ipvsadm
重启的时候可能会出现bug,策略可能会被情况,重启之后,重新查看一下策略
[root@localhost opt]# systemctl restart ipvsadm.service [root@localhost opt]# ipvsadm -ln
出现bug,vip地址与一开始配置不一样,只能进行删除,不可修改
删除策略,并查看
[root@localhost opt]# ipvsadm -D -t 127.0.0.1:80 #-D删除 #-t指定vip(与bug一致的内容) [root@localhost opt]# ipvsadm -ln
由于两个真实服务器从属于虚拟服务器下面,因此删除虚拟服务器,两个虚拟服务器也会被删除
重新添加,并重启
保留策略,删除单个节点服务器
例如:删除192.168.10.42:80服务器
[root@localhost opt]# ipvsadm -d -r 192.168.10.42:80 -t 12.0.0.1:80
开启路由转发功能
[root@localhost opt]# vim /etc/sysctl.conf -------------------------------------------- net.ipv4.ip_forward=1 wq [root@localhost opt]# sysctl -p #生效
用本机进行测试,实现轮询功能
接下来进入客户端test2-2的配置
test2-2的网卡设置
使用客户端test2-2访问test2-1调度器,并在两个nginx后台服务器上动态的查看nginx的访问日志
tail -f /usr/local/nginx/logs/access.log #动态查看
查看访问日志记录的仍是真实的客户端ip地址
三、DR模式
DR模式(直接路由模式)
1、特点
调度器在整个lvs集群当中是最重要的,在net模式下,即负责接受请求,同时根据负载均衡的算法转发流量,响应发送给客户端
DR模式下调度器依然负责接收请求,同时也根据负载均衡算法转发流量到RS,响应直接由RS响应给客户端。
直接路由Direct Routing 是一种二层转发模式。二层转发的是数据帧,根据源mac地址和目的mac地址进行转发。不会修改数据包源ip和目的ip,根据数据包的mac地址进行转发。
DR模式下,lvs也是维护一个虚拟的ip地址,所有的请求都是发送到这个vip,既然是走二层转发,当客户端的请求到底调度器之后,根据负载均衡的算法选择一个RS,修改vip服务器的目的mac变成RS的MAC地址,RS处理完请求之后,根据报文当中客户端的源mac地址直接把响应发送到客户端即可,不需要走调度器,调度器的压力相对较小。
2、前提条件
1、调度器的ip地址和RS的ip要在同一网段,数据才能进行二层转发。
2、RS是一个公网地址,互联网可以直接访问RS的地址。(基本不用)
3、DR模式是走内核转发,内核来判断数据包的地址,根据RS的地址把数据包重新封装,修改MAC地址。
4、调度器的地址只可以作为集群访问的入口,不能作为网关
5、所有的RS 上的lo(本地回环地址)都要配置vip地址
3、lvs和nginx做负载均衡的区别
lvs是四层转发 内核态 ip+端口 四层代理
nginx 四层代理也可以七层代理
lvs(DR模式) +nginx+tomcat
lvs实现四层转发+nginx实现7层转发(动态)
访问lvs的vip地址可以实现动静分里
4、实验
nginx1 RS1 192.168.10.41
nginx2 RS 2 192.168.10.42
vip 192.168.10.100
test2-1 调度器 192.168.10. 20
test2-2 客户端 192.168.10.30
1、原理图
2、相关配置
test2-1调度器的配置
[root@localhost ~]# modprobe ip_vs #加载内核 [root@localhost ~]# yum -y install ipvsadm* #更新ip_vs模块的版本信息
创建vip地址
[root@localhost ~]# cd /etc/sysconfig/network-scripts/ 通过编辑配置文件的方式 [root@localhost network-scripts]# vim ifcfg-ens33:0 ----------------------------------------------------- DEVICE=ens33:0 ONBOOT=yes IPADDR=192.168.10.100 NETMASK=255.255.255.255 ~ wq #临时启动 [root@localhost network-scripts]# ifup ifcfg-ens33:0
修改调度器的响应参数
[root@localhost network-scripts]# vim /etc/sysctl.conf ------------------------------------------------------- net.ipv4.ip_forward=0 #关闭数据包转发功能 net.ipv4.conf.all.send_redirects=0 #禁止系统发生icmp重定向的消息 net.ipv4.conf.default.send_redirects=0 #禁止默认网络接口发送icmp重定向的消息 net.ipv4.conf.ens33.send_redirects=0 #针对ens33设备。禁止发生icmp重定向消息 ~ wq [root@localhost network-scripts]# sysctl -p #配置立即生效
分配策略
清空策略并查看 [root@localhost network-scripts]# ipvsadm -C [root@localhost network-scripts]# ipvsadm -ln Try `ipvsadm -h' or 'ipvsadm --help' for more information. 指定负载的vip和策略 [root@localhost network-scripts]# ipvsadm -A -t 192.168.10.100:80 -s rr 添加真实服务器 [root@localhost network-scripts]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.41:80 -g [root@localhost network-scripts]# ipvsadm -a -t 192.168.10.100:80 -r 192.168.10.42:80 -g
重启查看是否会出现bug
[root@localhost network-scripts]# systemctl restart ipvsadm [root@localhost network-scripts]# ipvsadm -ln
nginx1添加回环地址
[root@localhost html]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0 [root@localhost network-scripts]# vim ifcfg-lo:0 ------------------------------------------------ DEVICE=lo:0 IPADDR=192.168.10.100 NETMASK=255.255.255.255 # If you're having problems with gated making 127.0.0.0/8 a martian, # you can change this to something else (255.255.255.255, for example) ONBOOT=yes wq [root@localhost network-scripts]# ifup ifcfg-lo:0 #重启端口
添加lo接口作为vip
[root@localhost network-scripts]# route add -host 192.168.10.100 dev lo:0 #设置ip地址为192.168.10.100的只添加到回环接口,作为lvs的vip,通过路由的模式转发到RS #能让vip识别到真实的服务器
调整真实服务器的内核响应
[root@localhost network-scripts]# vim /etc/sysctl.conf ------------------------------------------------------- net.ipv4.conf.lo.arp_ignore=1 #设置回环接口忽略来自任何接口的ARP请求 net.ipv4.conf.lo.arp_announce=2 #设置回环地址仅仅公告本地的ip地址,但不响应ARP请求 net.ipv4.conf.all.arp_ignore=1 #设置所有接口忽略来自任何接口的ARP请求 net.ipv4.conf.all.arp_announce=2 #设置所有接口仅仅公告本地的ip地址,但是不响应ARP请求 wq
查看
访问nginx1
nginx2添加回环地址
[root@localhost html]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0 [root@localhost network-scripts]# vim ifcfg-lo:0 ------------------------------------------------ DEVICE=lo:0 IPADDR=192.168.10.100 NETMASK=255.255.255.255 # If you're having problems with gated making 127.0.0.0/8 a martian, # you can change this to something else (255.255.255.255, for example) ONBOOT=yes wq [root@localhost network-scripts]# ifup ifcfg-lo:0 #重启端口
查看
添加lo接口作为vip
[root@localhost network-scripts]# route add -host 192.168.10.100 dev lo:0 #设置ip地址为192.168.10.100的只添加到回环接口,作为lvs的vip,通过路由的模式转发到RS #能让vip识别到真实的服务器
调整真实服务器的内核响应
[root@localhost network-scripts]# vim /etc/sysctl.conf ------------------------------------------------------- net.ipv4.conf.lo.arp_ignore=1 #设置回环接口忽略来自任何接口的ARP请求 net.ipv4.conf.lo.arp_announce=2 #设置回环地址仅仅公告本地的ip地址,但不响应ARP请求 net.ipv4.conf.all.arp_ignore=1 #设置所有接口忽略来自任何接口的ARP请求 net.ipv4.conf.all.arp_announce=2 #设置所有接口仅仅公告本地的ip地址,但是不响应ARP请求 wq
访问nginx2
使用客户端test2-2 (192.168.10.30)访问192.168.10.100实现伦询
四、总结
lvs的三种工作模式
NAT | DR | TUN | |
优点 | 地址转换,配置简单 | 性能最好 | AWN,可以实现较远距离的数据包传送 |
缺点 | 性能瓶颈 | 不支持跨网段 | 专用的通道,必须开通vpn(花钱) |
RS的要求 | 无限制 | 必须要禁止非物理接口的ARP响应 | 支持隧道模式 |
RS的数量 | 10-20台 | 100台 | 100台 |