LVS和Nginx及HAProxy的工作原理你了解吗

当前大多数的互联网系统都使用了服务器集群技术,集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是web应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器集群等等。
在实际应用中,在web服务器集群之前总会有一台负载均衡服务器,负载均衡设备的任务就是作为web服务器流量的入口,挑选最合适的一台web服务器,将客户端的请求转发给它处理,实现客户端到真实服务端的透明转发。
最近几年很火的「云计算」以及分布式架构,本质上也是将后端服务器作为计算资源、存储资源,由某台管理服务器封装成一个服务对外提供,客户端不需要关心真正提供服务的是哪台机器,在它看来,就好像它面对的是一台拥有近乎无限能力的服务器,而本质上,真正提供服务的,是后端的集群。
lvs、nginx、haproxy是目前使用最广泛的三种软件负载均衡软件。
一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术。具体的应用需求还得具体分析,如果是中小型的web应用,比如日pv小于1000万,用nginx就完全可以了;如果机器不少,可以用dns轮询,lvs所耗费的机器还是比较多的;大型网站或重要的服务,且服务器比较多时,可以考虑用lvs。
目前关于网站架构一般比较合理流行的架构方案:web前端采用nginx/haproxy+keepalived作负载均衡器;后端采用mysql数据库一主多从和读写分离,采用lvs+keepalived的架构。
lvs
lvs是linuxvirtualserver的简称,也就是linux虚拟服务器。现在lvs已经是linux标准内核的一部分,从linux2.4内核以后,已经完全内置了lvs的各个功能模块,无需给内核打任何补丁,可以直接使用lvs提供的各种功能。
lvs自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。
lvs 的体系结构
lvs架设的服务器集群系统有三个部分组成:
(1) 最前端的负载均衡层,用 load balancer 表示
(2) 中间的服务器集群层,用 server array 表示
(3) 最底端的数据共享存储层,用 shared storage 表示
lvs 负载均衡机制
lvs不像haproxy等七层软负载面向的是http包,所以七层负载可以做的url解析等工作,lvs无法完成。
lvs是四层负载均衡,也就是说建立在osi模型的第四层——传输层之上,传输层上有我们熟悉的tcp/udp,lvs支持tcp/udp的负载均衡。因为lvs是四层负载均衡,因此它相对于其它高层负载均衡的解决办法,比如dns域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。
所谓四层负载均衡,也就是主要通过报文中的目标地址和端口。七层负载均衡,也称为“内容交换”,也就是主要通过报文中的真正有意义的应用层内容。
lvs的转发主要通过修改ip地址(nat模式,分为源地址修改snat和目标地址修改dnat)、修改目标mac(dr模式)来实现。
nat模式:网络地址转换
nat(networkaddresstranslation)是一种外网和内网地址映射的技术。
nat模式下,网络数据报的进出都要经过lvs的处理。lvs需要作为rs(真实服务器)的网关。
当包到达lvs时,lvs做目标地址转换(dnat),将目标ip改为rs的ip。rs接收到包以后,仿佛是客户端直接发给它的一样。rs处理完,返回响应时,源ip是rsip,目标ip是客户端的ip。这时rs的包通过网关(lvs)中转,lvs会做源地址转换(snat),将包的源地址改为vip,这样,这个包对客户端看起来就仿佛是lvs直接返回给它的。
dr模式:直接路由
dr模式下需要lvs和rs集群绑定同一个vip(rs通过将vip绑定在loopback实现),但与nat的不同点在于:请求由lvs接受,由真实提供服务的服务器(realserver,rs)直接返回给用户,返回的时候不经过lvs。
详细来看,一个请求过来时,lvs只需要将网络帧的mac地址修改为某一台rs的mac,该包就会被转发到相应的rs处理,注意此时的源ip和目标ip都没变,lvs只是做了一下移花接木。rs收到lvs转发来的包时,链路层发现mac是自己的,到上面的网络层,发现ip也是自己的,于是这个包被合法地接受,rs感知不到前面有lvs的存在。而当rs返回响应时,只要直接向源ip(即用户的ip)返回即可,不再经过lvs。
dr负载均衡模式数据分发过程中不修改ip地址,只修改mac地址,由于实际处理请求的真实物理ip地址和数据请求目的ip地址一致,所以不需要通过负载均衡服务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。因此,dr模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡手段。
lvs 的优点
抗负载能力强、是工作在传输层上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低。
配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。
工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案,如lvs+keepalived。
无流量,lvs只分发请求,而流量并不从它本身出去,这点保证了均衡器io的性能不会受到大流量的影响。
应用范围比较广,因为lvs工作在传输层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、在线聊天室等等。
lvs 的缺点
软件本身不支持正则表达式处理,不能做动静分离;而现在许多网站在这方面都有较强的需求,这个是nginx、haproxy+keepalived的优势所在。
如果是网站应用比较庞大的话,lvs/dr+keepalived实施起来就比较复杂了,相对而言,nginx/haproxy+keepalived就简单多了。
nginx
nginx是一个强大的web服务器软件,用于处理高并发的http请求和作为反向代理服务器做负载均衡。具有高性能、轻量级、内存消耗少,强大的负载均衡能力等优势。
nignx 的架构设计
相对于传统基于进程或线程的模型(apache就采用这种模型)在处理并发连接时会为每一个连接建立一个单独的进程或线程,且在网络或者输入/输出操作时阻塞。这将导致内存和cpu的大量消耗,因为新起一个单独的进程或线程需要准备新的运行时环境,包括堆和栈内存的分配,以及新的执行上下文,当然,这些也会导致多余的cpu开销。最终,会由于过多的上下文切换而导致服务器性能变差。
反过来,nginx的架构设计是采用模块化的、基于事件驱动、异步、单线程且非阻塞。
nginx大量使用多路复用和事件通知,nginx启动以后,会在系统中以daemon的方式在后台运行,其中包括一个master进程,n(n>=1)个worker进程。所有的进程都是单线程(即只有一个主线程)的,且进程间通信主要使用共享内存的方式。
其中,master进程用于接收来自外界的信号,并给worker进程发送信号,同时监控worker进程的工作状态。worker进程则是外部请求真正的处理者,每个worker请求相互独立且平等的竞争来自客户端的请求。请求只能在一个worker进程中被处理,且一个worker进程只有一个主线程,所以同时只能处理一个请求。(原理同netty很像)
nginx 负载均衡
nginx负载均衡主要是对七层网络通信模型中的第七层应用层上的http、https进行支持。
nginx是以反向代理的方式进行负载均衡的。反向代理(reverseproxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
nginx实现负载均衡的分配策略有很多,nginx的upstream目前支持以下几种方式:
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
weight:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
url_hash(第三方):按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
nginx 的优点
跨平台:nginx可以在大多数unixlikeos编译运行,而且也有windows的移植版本
配置异常简单:非常容易上手。配置风格跟程序开发一样,神一般的配置
非阻塞、高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数
事件驱动:通信机制采用epoll模型,支持更大的并发连接
master/worker结构:一个master进程,生成一个或多个worker进程
内存消耗小:处理大并发的请求内存消耗非常小。在3万并发连接下,开启的10个nginx进程才消耗150m内存(15m*10=150m)
内置的健康检查功能:如果nginx代理的后端的某台web服务器宕机了,不会影响前端访问
节省带宽:支持gzip压缩,可以添加浏览器本地缓存的header头
稳定性高:用于反向代理,宕机的概率微乎其微
nginx 的缺点
nginx 仅能支 持http、https 和 email 协议,这样就在适用范围上面小些,这个是它的缺点
对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。不支持session的直接保持,但能通过ip_hash来解决
haproxy
haproxy支持两种代理模式tcp(四层)和http(七层),也是支持虚拟主机的。
haproxy的优点能够补充nginx的一些缺点,比如支持session的保持,cookie的引导;同时支持通过获取指定的url来检测后端服务器的状态。
haproxy跟lvs类似,本身就只是一款负载均衡软件;单纯从效率上来讲haproxy会比nginx有更出色的负载均衡速度,在并发处理上也是优于nginx的。
haproxy支持tcp协议的负载均衡转发,可以对mysql读进行负载均衡,对后端的mysql节点进行检测和负载均衡,大家可以用lvs+keepalived对mysql主从做负载均衡。
haproxy负载均衡策略非常多:round-robin(轮循)、weight-round-robin(带权轮循)、source(原地址保持)、ri(请求url)、rdp-cookie(根据cookie)。

油田注水系统中TD2000变频器的应用研究
如何知道电动牙的防水性或密封性是否达到要求
通过减法和非减法抖动减少量化失真
吉时利DAQ6510示波器让测量更广泛、采集数据更快速
台湾创光电2018年第一季度净利润29.4亿新台币 同比下滑75.2%
LVS和Nginx及HAProxy的工作原理你了解吗
频谱检测的方法和原理详细介绍
【新品发布】教育领域新成果,P &T AI计算机视觉开发套件
电脑c盘满了怎么清理
聚焦“两会”:了我们看看科技大佬们身上都带有哪些关键词
人工智能与传统产业的加速融合
海兴电力通过Arm Pelion物联网平台拓展新兴市场
解析RISC-V正面临的挑战
走秀网CEO被抓的背后,是电商行业打假的开始?杨幂无辜躺枪
采用可编程放大器在USB接口数据采集系统中的应用
电池修复技术-电瓶深度放电到底是好还是不好?
工控机显示屏同步双显介绍
江苏电网首次对特高压换流站设备进行全站停电检修
家用无线路由器选购实用指南
美政府表示再次延长华为临时许可证到5月15日