博主自主知识产权《Spring Boot深入浅出系列课程》(16章97节文档) 已经上线,请关注

第一章 HAproxy简介

haproxy 字母哥 0评论

第一章 HAproxy简介

    随着互联网走进千家万户,我们每个人也走进了“万物互联“的时代。从最开始的PC联网到移动端手机联网,再到当今的物联网,我们时刻都在享受着网络带给我们的便利服务。因此,大规模的网络连接、大数据量服务的稳定性可靠性要求,给软件架构师提出了前所未有的挑战。全世界的软件从业人员及厂商,为了给用户提供高效、稳定的服务各尽所能,持续的研发出高性能高可靠的基础架构组件产品。HAproxy作为基础架构组件的翘楚,提供了高可用的负载均衡以及基于TCP和HTTP应用的网络代理。

1.1 HAproxy概述

    HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。基于合理的配置及优化,完全可以实现单机支持数以万计的并发连接。
    HAProxy支持2种主要的代理模式:第一种代理模式是"tcp",即OSI网络模型中的第4层传输层协议;第二种代理模式是“http”,即OSI网络模型中的第7层应用层协议。在tcp模式下,HAProxy知识在客户端和服务器之间双向转发流量。http模式下,HAProxy进行协议分析,能够针对分析结果和用户配置来决定允许、拒绝、交换、增加、修改等工作策略。此外,HAproxy还具备很多特性,支撑它成为一款优秀的负载均衡代理软件。
  1. 支持服务的健康检查,在服务发生故障时自动感知,并且不再向该服务分配网络请求。当服务故障解除恢复时,自动的将该服务再次纳入负载范围。
  2. 支持基于session,cookies的web应用会话保持。这样就保证了分布式应用负载均衡工作模式下,用户状态不丢失。
  3. 支持全透明代理,即haproxy代理服务对用户来说是透明的,用户感知不到它的存在。同样实际的服务也感知不到haproxy的存在。这点是很重要的,服务接受的所有请求实际上都是haproxy转发过来的,如果不支持全透明代理服务就感知不到用户的真实网络ip。
  4. 支持基于ACL配置的流量转发。haproxy可以根据不同的配置规则,灵活的将用户请求连接转发到不同的服务上面。
    比如:基于域名的转发规则、基于URL匹配的转发规则等等。
  5. 支持内网服务ip,可以保护你的服务不被暴露在公网上。并在一定程度上可以防范DDos攻击。
  6. 支持在虚拟主机上安装部署。
  7. 结合Keepalived使用,可以实现双机热备的高可用的架构方案,避免单机故障引起的服务暂停。
  8. 提供基于web浏览器的监控报表,可以实时查看服务的工作状态及流量统计。

1.2 网络代理服务

    网络代理服务的核心功能是在客户端与服务端之间进行流量转发。代理服务从应用场景角度通常分为两类,即转发代理(forward proxy)服务和逆向代理(reverse proxy)服务。
    转发代理服务又通常简称为代理服务。同时为了与逆向代理服务相区别,我们也可以叫它正向代理服务。转发代理服务通常充当网络信息传递的跳板。由于防火墙等的限制,客户端无法直接访问服务端。这时通常会选择一台服务器来做转发代理,该服务器特点是既可以连接客户端,也可以连接服务端。举个例子:我要买某品牌商品,作为消费者我无法直接接触厂商,但是我知道某网络商城可以买到。此例中我就是客户端,服务端就是该品牌厂商,网络商城就是代理。

    逆向代理服务的应用场景是:我是服务提供者,但是基于安全或者负载均衡的需求,我不想让客户直接访问,所以我提供逆向代理服务给客户访问,客户端对于实际的服务提供者是无感知的。举个例子:某公司经常收到员工的快递,快递员经常进入公司直接找收件人,这样给公司管理带来很多不便。于是公司提出要求,公司可以替员工收快递,但收件电话统一填写公司前台电话。这样快递员只和前台打交道,前台可以按照收件人姓名把快递交给员工。此例子中每个员工都是一个服务端,每个快递员都是客户端,公司前台就是逆向代理。

    网络代理从端到端的感知的角度,又分为透明代理和非透明代理。透明代理,通常是说服务端和客户端在通信过程中使用网络代理,但又彼此都感知不到代理的存在。这点在实际应用中很重要,比如:应用服务需要记录客户端实际的访问ip做流量统计,如果使用了逆向代理,而该逆向代理是非透明的。那么最终获得的都是逆向服务所在服务器的ip地址,这与实际需求相悖。所以一个好的逆向代理服务软件是可以实现透明传输的,haproxy就是这样的逆向代理服务软件。

1.3 软件架构的演变

    互联网发展进化的历史,从技术上角度说,就是软件技术及架构发展的历史。这个要详细说起来可以写一部历史长篇小说,此处我们仅从服务负载的角度简单谈一谈这个问题。

    很多企业开发的第一个应用从架构上讲都是简单纯粹的,即:一个整体软件应用 + 单实例RDBMS + 本地的文件存储。随着用户的不算增加,流量的不断增大,这种架构不再满足用户所需的高效与稳定。于是,软件开发者们思考如何改进软件架构设计。总结起来,主要是以下几个方面:
  1. 整体软件应用改进为分布式软件应用和分布式软件服务
  2. 单实例RDBMS改进为读写分离数据库架构,分布式数据库架构,nosql数据库架构等,以及它们之间的混合数据库
  3. 分布式的大数据的分析处理,如:hadoop,spark
  4. 可缓冲分布式消息队列,如:kafka,RocketMQ
  5. 使用缓存组件改善应用性能,如:redis,memcached
    大部分的企业会从以上几个方面着手优化应用的性能,但不仅仅局限于此。此处我们仅从服务负载的角度,来说明haproxy(负载均衡逆向代理)在网络中的位置和它所起到的作用。
    

    从上图中可以看到架构方案优化之后,由原有的一个应用服务扩展为多个应用服务组成的分布式服务架构。用户在访问服务的时候,不是直接请求实际提供服务的应用,而是通过逆向代理进行了负载。这样做的好处是实现了高可用,某一应用服务异常的时候,逆向代理自动将其下线处理,其他的应用服务仍然可以正常工作,不影响用户体验。而且实现了负载均衡,流量分摊,避免单机流量过大导致的服务缓慢等问题。此处,有经验的开发者会提出一个问题:逆向代理本身宕掉了怎么办?实际上我们还有方案来保证逆向代理本身的高可用,后文中在详细说明。
    
    上图中数据库架构方案实现主从复制、读写分离和数据分库,这也是应用性能优化的常用方法。图中展示的是一主多从的架构设计,主库负载写操作,从库负载读操作,同时主库向从库同步数据。数据分库目的是将2类逻辑上相对独立的业务数据分库存放,来缓解数据库压力。如:某网站娱乐模块,母婴模块的数据分库存储。读写分离的目的则更为简单纯粹,就是将读写压力从单机数据库模式下转变为集群模式,从而分摊压力。每个从数据库都是主数据库的物理备份,因此应用访问从数据库进行读操作的时候,也需要考虑负载均衡,如图"四层逆向代理"。
    
    当然,haproxy作为一款优秀的负载均衡的代理软件,不仅能对web应用代理,还能做数据库代理。此外,haproxy也可以实现邮件的代理等等。
    

1.2 白话分布式架构

   大家可以看到,上一小节改进方案中提到了分布式。那什么是分布式的软件架构呢?通俗的说就是:“一个好汉三个帮”,你一个人负载不了的任务,就交给多个人帮你去负载,这样效率就提高了。但是分布式软件架构往往涉及几个主要的问题:
  1. 如何做好状态保持与协调。即:对于分布式架构,用户的每一次访问可能对应不同的后台服务,那么如何做到状态不丢失,并且多服务之间协调?举个例子,作为用户你到某个工厂,第一次是找A木匠做家具并告诉他尺寸等信息,你再一次去的时候遇到的是木匠B。此时你并不希望再一次和木匠B说明你的需求,并且希望木匠B能准确的知道家具是给你做的,而不是其他什么人。这就需要工厂管理者做好沟通协调工作。
  2. 如何做好任务分配(负载均衡)。即:对于分布式架构,我们希望流量负载均衡或者负载倾向于性能更高的服务。举例:从管理的角度,我们希望木匠A、木匠B工作量基本相当。或者我们希望能者多劳,但不能出现一个累死,一个闲死的情况。
  3. 如何做好任务健康检查及异常处理。即:从分布式架构的角度,我们希望多服务同时运行,并且能够及时发现某个服务的问题,及时的下线并及时的处理异常。举例:当木匠A生病的时候,管理者希望木匠A马上去治病,并不希望他带病工作作出不好的产品,影响用户体验。当木匠A病好了的时候,管理者希望你立刻工作,不要借故偷懒。
    您应该已经猜到了,HAproxy可以一定程度上担当例子中的“工厂管理者”。它本身不做任何生产具体工作,它可以承担网络层面上的任务状态保持与协调、分配、检查异常和上线恢复的工作。概括说,一是网络代理,二是负载均衡,三是健康检查。
    

1.5三种主流负载均衡软件比较

    负载均衡器可以是硬件的,也可以是软件的。常见的硬件负载均衡器,比如:F5和Array,它们的优点是高性能,并且有专业的团队维护,缺点就是费用较为昂贵。而负载均衡软件的最大优点就是免费,按照haproxy官方文档提供的数据,在3.7GHz的酷睿i7处理器,双端口10千兆网卡,Linux3.10内核的服务器上,最多每秒可以支撑83000个TCP连接。所以对于绝大多数的应用场景软件负载均衡器已经可以完全满足性能要求。
    比较常用的软件负载均衡器有:Nginx,LVS,Haproxy等。通常目前比较流行的负载均衡架构方案,haproxy/nginx + Keepalived实现web应用的负载均衡器,后端采用LVS + Keepalived来实现数据库集群负载均衡。
指标 haproxy NGINX LVS
网络7层负载支持 支持 支持 工作在4层网络协议上,所以也可以支持第7层负载,但功能支持较弱
网络4层负载支持 支持 不支持 支持
性能
健康检查与自动恢复 支持多种形式的健康检查 只支持通过端口来检测,不支持通过url来检测 不支持
web应用状态保持 支持较好 只支持ip hash模式,相对于haproxy的致命缺点
动静态文件分离 支持 支持 不支持
维护复杂度
配置灵活性
测试方便度
    同时,nginx还可以作为web应用容器来使用,从功能丰富性上可以说这是nginx的优点。从软件工作的专业性的角度来说,也可以说这是nginx的缺点。
喜欢 (6)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址