LB:Load Balancing,负载均衡(增加处理能力),有一定高可用能力,但不是高可用集群,是以提高服务的并发处理能力为根本着眼点
软件负载均衡设备
硬件负载均衡设备
LVS:(四层路由设备),是由中国人章文松研发的(阿里巴巴的副总裁)根据用户请求的IP与端口号,实现将用户的请求分发至不同的主机
HAproxy:haproxy:主要功能是针对http协议实现负载均衡,也可以实现tcp(mysql,smtp)等协议的负载均衡
NGINX:nginx:是由俄罗斯人开发的,主要功能是针对http,smtp,pop3,imap等协议实现负载均衡,只负责解析有限的七层协议
F5:BIG IP
Citrix,Netscaler
A10
深信服
HA:High Availability,高可用集群(增加服务可用性)
高可用集群,是以提升服务的始终在线能力为着眼点,不会因为宕机而导致服务不能用。
衡量可用性:在线时间/(在线时间+故障处理时间)
99%:一年有三天不在线
99.9%:一年有0.3天不在线
99.99%:一年有0.03天不在线
99.999%:一年有0.003天不在线
图示:
keepalived
(Load Balance)负载均衡,当然这是一个简单的概括,比如,我有10台机器都提供web服务,那么我如何均衡的利用这10台机器呢,让这10台机器保证高性能、高可用、高并发就是负载均衡要考虑和要做的事情。
实现负载均衡一般可以使用顺序、比重、流量、服务类别等进行分配,负载均衡的部署方式也分为路由和服务直接返回模式
http重定向负载均衡
DNS负载均衡
反向代理负载均衡
IP负载均衡
数据链路层负载均衡
F5硬件负载均衡
原理:
下载网站用的较多,其实也算一种负载均衡,工作在应用层的业务代码中
原理:根据用户的http请求计算出一个真实的web服务器地址,并将该web服务器地址写入http重定向响应中返回给客户浏览器,由浏览器重新进行访问。
图示
优点:比较简单
缺点:客户浏览器需要多次请求服务器才能完成一次访问,性能较差。
http重定向服务器自身的处理能力可能成为瓶颈。
使用http302响应重定向,有可能使搜索引擎判断为SEO作弊,降低搜索排名。
DNS负载提供域名到IP解析的过程,我们实例查看百度的域名解析其实是一对多的,
这时候DNS服务器也就充当了负载均衡,很多域名运营商提供的智能dns以及多线解析都是利用了DNS负载均衡的技术,开源的BIND就可提供电信联通多线解析等强大的技术。
原理:在DNS服务器上配置多个域名对应IP的记录。例如一个域名www.baidu.com对应一组web服务器IP地址,域名解析时经过DNS服务器的算法将一个域名请求分配到合适的真实服务器上。
图示
优点:将负载均衡的工作交给了DNS,省却了网站管理维护负载均衡服务器的麻烦,同时许多DNS还支持基于地理位置的域名解析,将域名解析成距离用户地理最近的一个服务器地址,加快访问速度吗,改善性能。
缺点:目前的DNS解析是多级解析,每一级DNS都可能化缓存记录A,当摸一服务器下线后,该服务器对应的DNS记录A可能仍然存在,导致分配到该服务器的用户访问失败。
DNS负载均衡的控制权在域名服务商手里,网站可能无法做出过多的改善和管理。
不能够按服务器的处理能力来分配负载。DNS负载均衡采用的是简单的轮询算法,不能区分服务器之间的差异,不能反映服务器当前运行状态,所以其的负载均衡效果并不是太好。
可能会造成额外的网络问题。为了使本DNS服务器和其他DNS服务器及时交互,保证DNS数据及时更新,使地址能随机分配,一般都要将DNS的刷新时间设置的较小,但太小将会使DNS流量大增造成额外的网络问题。
squid,nginx
原理:反向代理处于web服务器这边,反向代理服务器提供负载均衡的功能,同时管理一组web服务器,它根据负载均衡算法将请求的浏览器访问转发到不同的web服务器处理,处理结果经过反向服务器返回给浏览器。
例如:浏览器访问请求的地址是反向代理服务器的地址114.100.80.10,反向代理服务器收到请求,经过负载均衡算法后得到一个真实物理地址10.0.0.3,并将请求结果发给真实服务器,真实服务器处理完后通过反向代理服务器返回给请求用户。
图示
优点:部署简单,处于http协议层面。
缺点:使用了反向代理服务器后,web 服务器地址不能直接暴露在外,因此web服务器不需要使用外部IP地址,而反向代理服务作为沟通桥梁就需要配置双网卡、外部内部两套IP地址。
在网络层和传输层(IP和端口)通过修改目标地址进行负载均衡。
用户访问请求到达负载均衡服务器,负载均衡服务器在操作系统内核进程获取网络数据包,根据算法得到一台真实服务器地址,然后将用户请求的目标地址修改成该真实服务器地址,数据处理完后返回给负载均衡服务器,负载均衡服务器收到响应后将自身的地址修改成原用户访问地址后再讲数据返回回去。类似于反向服务器负载均衡。
图示
优点:在响应请求时速度较反向服务器负载均衡要快。
缺点:如法处理更高级的请求
原理:
在数据链路层修改Mac地址进行负载均衡。
负载均衡服务器的IP和它所管理的web 服务群的虚拟IP一致;
负载均衡数据分发过程中不修改访问地址的IP地址,而是修改Mac地址;
通过这两点达到不修改数据包的原地址和目标地址就可以进行正常的访问。
图示
优点:不需要负载均衡服务器进行IP地址的转换。数据响应时,不需要经过负载均衡服务器。
缺点:负载均衡服务器的网卡带宽要求较高。
所谓四层就是基于IP+端口的负载均衡,主要代表有lvs。
七层负载也称内容交换,就是基于URL等应用层信息的负载均衡,主要代表有nginx。
图示
负载均衡也叫代理,是代理的一种。
代理分为正向代理和反向代理
LVS是Linux Virtual Server,Linux虚拟服务器
是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一
LVS工作在一台server上提供Directory(负载均衡器)的功能,本身并不提供服务,只是把特定的请求转发给对应的real server(真正提供服务的主机),从而实现集群环境中的负载均衡。
框架
两层:
LB-server负载均衡器
realy-server真实服务器
NAT转发模式
DR直接路由模式
TUN-IP隧道模式
FULL-NAT
Network Address Translation,网络地址转换
图示:
CIP:客户端IP地址/发起方/源IP地址
VIP:虚拟IP/lvs集群IP
RIP:真实服务器IP/WEB集群IP/web服务器
- ①客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。
- ②负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标IP地址改为了后端服务器的RIP地址并将报文根据算法发送出去。
- ③报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。
- ④然后lvs将此报文的源地址修改为本机并发送给客户端。
注意:在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端
优缺点
优点:
网络隔离更安全
节约IP地址
缺点:
director很可能成为系统性能瓶颈,所有的请求director都需要处理应答
- ①.客户端将请求发往前端的负载均衡器,请求报文源地址是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广播
图示:
- ①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
- ②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
- ③.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。
优缺点:
优点:
负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
缺点:
隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。
四台全新cent os7系统的虚拟机,关闭防火墙和selinux,一台为client,一台为LVS,一台web1,一台为web2
打开VMware,编辑–>虚拟网络编辑器,添加vmnet2网卡
为客户端client,设置网卡vmnet0
IP:192.168.2.76
LVS添加两块网卡,一个网卡为vmnet0,一个网卡为vmnet2
IP:192.168.2.75 和 192.168.65.129
web1和web2设置vmnet2网卡
web1IP:192.168.65.128
web2IP:192.168.65.130
由于vmnet2网卡没有网络,先切换vmnet8网卡,在web1和web2上安装httpd服务,在切换到vmnet2网卡做实验
设置网卡的目的,client和LVS可以通信,LVS和web1,web2可以通信,client不可以和web1,web2通信
web1服务器操作
#安装httpd服务
[root@localhost ~]# yum -y install httpd
#启动httpd服务
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
#放置测试页面
[root@localhost ~]# echo web1 > /var/www/html/index.html
#配置路由
[root@localhost ~]# route add -net 192.168.2.0/24 gw 192.168.65.129
#参数解释:
-net:后面写client的网段,最终client要访问web1,模拟外网
gw :网关,网络的唯一出口,写LVS的IP,最终web1出去的时候走LVS
web2服务器操作
#安装httpd服务
[root@localhost ~]# yum -y install httpd
#启动httpd服务
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
#放置测试页面
[root@localhost ~]# echo web2 > /var/www/html/index.html
#配置路由
[root@localhost ~]# route add -net 192.168.2.0/24 gw 192.168.65.129
-net:后面写client的网段,最终client要访问web2,模拟外网
gw :网关,网络的唯一出口,写LVS的IP,最终web2出去的时候走LVS
LVS服务器操作
#启动路由功能
[root@192 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
#安装LVS
[root@192 ~]# yum install -y ipvsadm
#设置策略
[root@192 ~]# ipvsadm -A -t 192.168.2.75:80 -s rr
#参数解释:
-A :对外的虚拟服务器,添加一个VIP,也就是LVS的vmnet0网卡的IP
-t :TCP协议
-s : schedule调度
rr : 轮训策略类型
#设置web1的
[root@192 ~]# ipvsadm -a -t 192.168.2.75:80 -r 192.168.65.128:80 -m
#参数解释:
-a:对内的真实服务器,LVS的vmnet0网卡的IP
-r:真实服务器,也就是web1,这里写web1的IP
-m:nat 模式工作
#设置web2,同上,IP改为web2的即可
[root@192 ~]# ipvsadm -a -t 192.168.2.75:80 -r 192.168.65.130:80 -m
#访问LVS服务器,输入LVS的vmnet网卡的IP,访问四次,每次的访问的结果都不一样
[root@192 ~]# elinks --dump http://192.168.2.75
web2
[root@192 ~]# elinks --dump http://192.168.2.75
web1
[root@192 ~]# elinks --dump http://192.168.2.75
web2
[root@192 ~]# elinks --dump http://192.168.2.75
web1
#参数解释:
--dump:不打开会话模式,只查看内容
准备四台全新的cent os7虚拟机,一台为client,一台为LVS-DR,一台为web1,一台为web2,四台全部在同一网段,关闭防火墙和selinux
主机名称 | 真实IP | 虚拟IP |
---|---|---|
client | 192.168.200.140 | 无 |
LVS-DR | 192.168.200.158 | 192.168.200.88 |
web1 | 192.168.200.159 | 192.168.200.88 |
web2 | 192.168.200.150 | 192.168.200.88 |
虚拟IP的设计,遵循本网段未使用的IP即可
1.添加VIP
[root@192 ~]# ifconfig ens32:0 192.168.200.88 broadcast 192.168.200.255 netmask 255.255.255.0 up
#参数解释:
ens32:0:ens32的子接口,这里设置的是虚拟IP
broadcast:广播地址255
netmask:子网掩码
up:启动
配置完成后查看IP,此时会有两个IP
2.添加路由
[root@192 ~]# route add -host 192.168.200.88 dev ens32:0
3.设置路由转发
[root@192 ~]# vim /etc/sysctl.conf
#添加以下内容
net.ipv4.ip_forward = 1 #开启路由功能
net.ipv4.conf.all.send_redirects = 0 #禁止转发重定向报文
net.ipv4.conf.ens32.send_redirects = 0 #禁止ens32转发重定向报文
net.ipv4.conf.default.send_redirects = 0 #禁止转发默认重定向报文
1.设置LVS规则
[root@192 ~]# yum -y install ipvsadm
#ipvsadm: internet protocol virtual server admin 互联网 协议 虚拟 服务器 管理器
#清除所有的配置
[root@192 ~]# ipvsadm -C
#添加VIP规则
[root@192 ~]# ipvsadm -A -t 192.168.200.88:80 -s rr
[root@192 ~]# ipvsadm -a -t 192.168.200.88:80 -r 192.168.200.150:80 -g
[root@192 ~]# ipvsadm -a -t 192.168.200.88:80 -r 192.168.200.159:80 -g
#参数解释:
-A :添加virtual server,也就是刚才设置的虚拟IP
-t 指定使用tcp协议
-s 指定调度策略/负载算法为rr
-a 添加realserver,添加虚拟IP
-r 指定realserver是谁,添加web1IP和web2IP
-g :Gateway,DR(默认使用的类型)
2.LVS让配置永久生效
[root@192 ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@192 ~]# systemctl enable ipvsadm.service
Created symlink from /etc/systemd/system/multi-user.target.wants/ipvsadm.service to /usr/lib/systemd/system/ipvsadm.service.
1,在web1和web2上做一样的操作
#安装web服务
[root@192 ~]# yum -y install httpd
#放置主页内容,两个web服务器的页面都设置一样
[root@192 ~]# echo web > /var/www/html/index.html
#启动两台的服务
[root@192 ~]# systemctl start httpd
2.给两个web服务器的lo网卡设置子网掩码为32位vip
#web1
[root@192 ~]# ifconfig lo:0 192.168.200.88/32
#web2
[root@192 ~]# ifconfig lo:0 192.168.200.88/32
3.给两个web服务器设置内核参数
#web1,忽略arp响应 ,不允许收
[root@192 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#为了让vip发包出去,但允许发
[root@192 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
#web2
[root@192 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@192 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
在client用elinks访问,访问的IP要搞清楚,是虚拟IP
[root@192 ~]# elinks --dump http://192.168.200.88
web
[root@192 ~]# elinks --dump http://192.168.200.88
web
[root@192 ~]# elinks --dump http://192.168.200.88
web
[root@192 ~]# elinks --dump http://192.168.200.88
web
[root@192 ~]# elinks --dump http://192.168.200.88
web
[root@192 ~]# elinks --dump http://192.168.200.88
web
[root@192 ~]# elinks --dump http://192.168.200.88
web
[root@192 ~]# elinks --dump http://192.168.200.88
web
[root@192 ~]# elinks --dump http://192.168.200.88
web
在LVS-DR端查看
#查看当前ipvs模块中记录的连接(可用于观察转发情况)
[root@192 ~]# ipvsadm -Lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:53 FIN_WAIT 192.168.200.140:40238 192.168.200.88:80 192.168.200.159:80
TCP 01:54 FIN_WAIT 192.168.200.140:40242 192.168.200.88:80 192.168.200.159:80
TCP 01:49 FIN_WAIT 192.168.200.140:40226 192.168.200.88:80 192.168.200.159:80
TCP 01:51 FIN_WAIT 192.168.200.140:40230 192.168.200.88:80 192.168.200.159:80
TCP 01:48 FIN_WAIT 192.168.200.140:40224 192.168.200.88:80 192.168.200.150:80
TCP 01:50 FIN_WAIT 192.168.200.140:40228 192.168.200.88:80 192.168.200.150:80
TCP 01:51 FIN_WAIT 192.168.200.140:40232 192.168.200.88:80 192.168.200.150:80
TCP 01:53 FIN_WAIT 192.168.200.140:40240 192.168.200.88:80 192.168.200.150:80
TCP 01:52 FIN_WAIT 192.168.200.140:40236 192.168.200.88:80 192.168.200.150:80
# 查看当前配置的虚拟服务访服务
[root@192 ~]# 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.200.88:80 rr
-> 192.168.200.150:80 Route 1 0 0
-> 192.168.200.159:80 Route 1 0 0