LVS是Linux上一种负载均衡的软件
集群定义
集群是一组互联的计算机。集群像一个大型独立的服务器,集群配置用于提高可用性和可伸缩性
LB(Load Balancing)
利用负载均衡算法处理计算能力(增加处理能力),有一定高可用能力,但不是高可用集群,是以提高服务的并发处理能力为根本着眼点
HA(High Availability)
高可用集群(增加服务可用性)
高可用集群,是以提升服务的始终在线能力为着眼点,不会因为宕机而导致服务不能用。
衡量可用性:在线时间/(在线时间+故障处理时间)
99%:一年有三天不在线
99.9%:一年有0.3天不在线
99.99%:一年有0.03天不在线
99.999%:一年有0.003天不在线
HPC
HPC:High performance,高性能计算集群,计算海量数据,解决复杂问题
平时所说的超级计算机就是高性能计算集群,查看每秒钟浮点运算的能力
运用到的名词:
向量机:尽可能向上进行扩展,如果CPU过多,在架构上纵然会有问题的
并行处理集群:包括两部分
1、分布式文件系统;
2、将大任务切割为小任务,分别进行处理的机制
例如hadoop就是并行处理集群
负载均衡器(Load Balancer)、服务器群组(Server Aarry)、共享存储(Shared Storage)
负载均衡层:
整个集群服务最前端设备,它有一个或多个调度器(Director Server)组成,LVS软件运行在调度服务器上。
调度服务器的功能:
将用户的请求,根据调度算法进行IP分流,将数据包发送到后端应用服务器上(Real Server),如果调度服务器安装了监控模块Ldirectord,那么调度服务器会将出现故障的应用服务器标记为不可用,知道此应用服务器恢复正常。
服务器群组层:
这是由一个或者多个应用程序服务器(Real Server)组成,并且每个应用服务器提供相同的服务,调度服务器会将用户的请求定向到具体的应用服务器上,然后由后端的应用服务器响应客户端。
共享存储层:
功能只要是保证服务器群组中的应用服务器提供数据的一致性。
共享存储的实现方式:
磁盘阵列、集群文件系统(OCFS2)
LVS是linux系统上的一种机制,类似于iptables,其相关属性也是通过(ipvsadm)与iptables命令类似的方式定义的,
LVS是工作于linux系统内核空间,通过内核来提供工作,其工作空间在iptables的INPUT链上,当客户端请求到达INPUT链上以后,通过LVS规则的验证,如果是内��请求,发送至用户空间,如果发现是集群,将此请求发送至POSTROUTING链,并交给后端应用程序服务器来响应用户的请求。
注意:上面所提到LVS其实是工作在iptables的INPUT和postrouting链上的,所以在此系统上iptables和LVS不能同时存在。
ipvsadm:用于管理集群服务的命令行工具,工作于Linux系统中的用户空间
ipvs:为lvs提供服务的内核模块,工作于内核空间 (相对于是框架,通过ipvsadm添加规则,来实现ipvs功能)
注:在linux内核2.4.23之前的内核中模块默认是不存在的,需要自己手动打补丁,然后把此模块编译进内核才可以使用此功能
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标IP地址改为了后端服务器的RIP地址并将报文根据算法发送出去。
③.报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。
④.然后lvs将此报文的源地址修改为本机并发送给客户端。
注意在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端
工作原理
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。
③.RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。
特点
1,集群节点和director必须在一个物理网络内
2,RIP可以使用公网地址或私有地址
3,director仅处理入站请求,director服务器的压力比较小
4,集群节点网关不指向director,故出站不经过director
5,不支持端口映射
6,大多数操作系统可以作为realserver,要支持隔离arp广播
ARP问题
通常,DR模式需要在Real-server上配置VIP,配置的方式为:
/sbin/ifconfig lo:0 inet VIP netmask 255.255.255.255
i) 原因在于,当LVS把client的包转发给Real-server时,因为包的目的IP地址是VIP,那么如果Real-server收到这个包后,发现包的目的IP不是自己的系统IP,那么就会认为这个包不是发给自己的,就会丢弃这个包,所以需要将这个IP地址绑到网卡上;当发送应答包给client时,Real-server就会把包的源和目的地址调换,直接回复给client。
ii) 关于ARP广播:
上面绑定VIP的掩码是”255.255.255.255″,说明广播地址是其本身,那么他就不会将ARP发送到实际的自己该属于的广播域了,这样防止 与LVS上VIP冲突,而导致IP冲突。
另外在Linux的Real-server上,需要设置ARP的sysctl选项:
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
③.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。
Fixed Scheduling Method 静态调服方法
(1) .RR 轮询
Round-Robin:调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
(2) .WRR 加权轮询
调度器通过"加权轮叫"调度算法,根据真实服务器的不同处理能力.来调度访问请求。这样可以保证处理能力强的服务器,处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
(3).DH 目标地址hash
"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
(4).LC 最少连接
调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。
Dynamic Scheduling Method 动态调服方法
(5).WLC 加权最少连接
在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
(6). LBLC 基于本地的最少连接
“基于局部性的最少链接” 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器 是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务 器,将请求发送到该服务器。
(7). LBLCR 带复制的基于本地的最少连接
"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务 器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一 台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的 程度。
pvsadm: 管理集群服务的命令行工具,而ipvs系统内核中的一个模块
ipvsadm命令的基本使用:
1 -A:在内核的虚拟服务器列表中添加一条VIP记录
2 -E:修改内核虚拟服务器列表中的一条VIP记录
3 -D:删除内核虚拟服务器列表中的一条VIP记录
4 -C:清空内核虚拟服务器列表中的所有VIP记录
5 -S:保存虚拟服务器规则
6 -R:恢复虚拟服务器策略规则
7 -a:在内核虚拟服务器列表中添加一个应用服务器的地址。
8 -e:修改一个虚拟服务器列表中的一条应用服务器地址记录
9 -d:删除一个虚拟服务器列表中的一条应用服务器地址记录
10 -L/-l: 查看内核虚拟服务器列表
11 -Z:将内核中的虚拟服务器计数清为0
12 -t service-address:指定虚拟服务器使用TCP服务
13 -u service-address:指定虚拟服务器使用UDP服务
14 -s scheduler:指定调度算法:
15 -p timeout:在应用服务器上的持续服务时间,单位为秒
16 -r service-address:指定应用服务器的地址
17 -g:指定LVS工作模式为直接路由(DR-defalut)
18 -I:指定LVS工作模式为隧道模式(Ip Tunnel)
19 -m:指定LVS工作模式为地址转换模式(NAT)
20 -w:设定应用服务器的权值
4台干净主机,分别作为客户端 LVS WEB1 WEB2;
关闭防火墙 selinux
需要给第3 4 台主机提前安装好httpd 并启动
client: VMENT 0 192.168.8.120
LVS : VMENT 0 192.168.8.121
VMENT 2 192.168.98.128
WEB1: VMENT 2 192.168.98.129 提前安装httpd
WEB2: VMENT 2 192.168.98.130
第3 4台主机
WEB1:
echo web1 > /var/www/html/index.html
route add -net 192.168.8.0/24 gw 192.168.98.128
#VM 0 网段所有主机唯一出口VM 2网卡
#24 子网掩码的255.255.255.255的十进制
#配置真实服务器网络出口
#-net 外部网络
#gw 网关,网络唯一出口
WEB2:
echo web2 > /var/www/html/index.html
route add -net 192.168.8.0/24 gw 192.168.98.128
第二台主机
LVS-NET配置路由功能和负载策略
echo 1 > /proc/sys/net/ipv4/ip_forward 启用路由功能
yum -y install ipvsadm 安装LVS软件
ipvsadm -A -t 192.168.8.121 -s rr
#-A 添加一个VIP
#-t TCP协议
#-s schedule 调度
#rr 轮训策略类型
ipvsadm -a -t 192.168.8.121:80 -r 192.168.98.129:80 -m
ipvsadm -a -t 192.168.8.121:80 -r 192.168.98.130:80 -m
第一台主机
client测试
elinks --dump http://192.168.8.121 每ping一次 web1 与 web2 之间循环;这里访问的是LVS vment 0网段
LVS-DR 服务器上
[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.238.142 netmask 255.255.255.0 broadcast 192.168.238.255
[root@localhost ~]# ifconfig ens33:0 192.168.238.141 broadcast 192.168.238.255 netmask 255.255.255.0 up
# 192.168.238.141 虚拟子网络,随便配但是必须处于同一网段
[root@localhost ~]# ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.238.142/24 brd 192.168.238.255 scope global noprefixroute dynamic ens33
inet 192.168.238.141/24 brd 192.168.238.255 scope global secondary ens33:0
[root@localhost ~]# route add -host 192.168.238.141 dev ens33:0 VIP与CIP配置在同一网卡上
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 开启路由功能
net.ipv4.conf.all.send_redirects = 0 禁止转发重定向
net.ipv4.conf.ens33.send_redirects = 0 禁止ens33转发重定向
net.ipv4.conf.default.send_redirects = 0 禁止默认转发重定向
[root@localhost ~]# yum install ipvsadm -y
[root@localhost ~]# ipvsadm -A -t 192.168.238.141:80 -s rr
[root@localhost ~]# ipvsadm -A -t 192.168.2^C.141:80 -s r
[root@localhost ~]# ipvsadm -a -t 192.168.238.141:80 -r 192.168.238.138:80 -g
[root@localhost ~]# ipvsadm -a -t 192.168.238.141:80 -r 192.168.238.140:80 -g
[root@localhost ~]# ipvsadm-save > /etc/sysconfig/ipvsadm LVS保存配置让永久生效
[root@localhost ~]# systemctl enable ipvsadm
Created symlink from /etc/systemd/system/multi-user.target.wants/ipvsadm.service to /usr/lib/systemd/system/ipvsadm.service
=======================================================================================================================
两个WEB上部署服务
WEB1/Web2: 192.168.238.138
yum -y install nginx
修改主页
vim /usr/share/nginx/html/index.html
systemctl start nginx
systemctl enable nginx
给两个web服务器的lo网卡设置子网掩码为32位vip
rs1: ifconfig lo:0 192.168.238.141/32
rs2: ifconfig lo:0 192.168.238.141/32
echo >1 /proc/sys/net/ipv4/conf/all/arp_ignore
echo >2 /proc/sys/net/ipv4/conf/all/arp_announce
arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式0
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询
arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
关于对arp_announce 理解的一点补充
=======================================================================================================================Client:
elinks --dump http://192.168.238.141 一直回车
=======================================================================================================================
LVS-DR服务器查看
[root@localhost ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:54 FIN_WAIT 192.168.238.129:56914 192.168.238.141:80 192.168.238.143:80
TCP 01:53 FIN_WAIT 192.168.238.129:56906 192.168.238.141:80 192.168.238.143:80
TCP 01:52 FIN_WAIT 192.168.238.129:56900 192.168.238.141:80 192.168.238.140:80
TCP 01:54 FIN_WAIT 192.168.238.129:56918 192.168.238.141:80 192.168.238.143:80
TCP 01:56 FIN_WAIT 192.168.238.129:56932 192.168.238.141:80 192.168.238.140:80
LVS命令管理
====管理虚拟服务器=====
添加一个虚拟服务器192.168.1.100:80,使用轮询算法
ipvsadm -A -t 192.168.1.10:80 -s rr
修改虚拟服务的算法为加权轮询
ipvsadm -E -t 192.168.1.100:80 -s wrr
删除虚拟服务
ipvsadm -D -t 192.168.1.100:80
=========管理真实服务================
添加一个真实服务器192.168.238.128 使用DR模式,权重2
ipvsadm -a -t 192.168.1.100:80 -r 192.168.238.128 -g -w 2
增加真实服务器的权重
ipvsadm -a -t 192.168.1.100:80 -r 192.168.238.128 -g -w 5
修改真实服务器的权重
ipvsadm -e -t 192.168.1.100:80 -r 192.168.238.128 -g -w 2
删除真实服务器
ipvsadm -d -t 192.168.1.100:80 -r 192.168.238.128
===================查看统计===================================
查看当前配置的虚拟服务器和各个RS的权重
ipvsadm -Ln
查看当前ipvs模块中记录的连接(可用于观察转发情况)
ipvsadm -lnc
查看ipvs模块的转发情况统计
ipvsadm -Ln --stats --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.238.139:80 54 391 0 32019 0 虚拟IP
-> 192.168.238.140:80 27 188 0 13807 0 web1
-> 192.168.238.143:80 27 203 0 18212 0 web2