一、HAProxy简介HAProxy是一个开源的、高性能的、基于TCP和HTTP应用的负载均衡软件，借助HAProxy可快速、可靠地提供基于TCP和HTTP应用的负载均衡解决方案二、HAProxy优点1) 可靠性和稳定性非常好，可以与硬件的F5相媲美2) 最高可以同时维护40000--50000个并发连接，单位时间内处理的最大请求数为20000个，最大数据处理能力可达10Gbps3) 支持多于8种负载均衡算法 ，同时也支持session保持4) 支持虚拟主机功能5) 从HAProxy 1.3版本后开始支持连接拒绝、全透明代理等功能6) HAProxy拥有一个功能强大的服务器状态监控页面7) HAProxy拥有功能强大的ACL支持三、HAProxy配置文件详解根据功能用途不同，其配置文件主要由五个部分组成，分别为global部分，defaults部分，frontend部分，backend部分，listen部分1)global部分用于设置全局配置参数，属于进程级的配置，通常与操作系统配置相关2) defaults部分默认参数的配置部分。在些部分设置的参数，默认会自动引用到下面的frontend, backend和listen部分3) frontend部分用于设置接收用户请求的前端虚拟节点。frontend可以根据ACL规则直接指定要使用的后端backend4) backend部分用于设置集群后端服务集群的配置，也就是用来添加一组真实服务器，以处理前端用户的请求5) listen部分此部分是frontend和backend部分的结合体配置项说明1)global部分global log 127.0.0.1 local1 info maxconn 4096 user nobody group nobody daemon nbproc 1 pidfile /usr/local/haproxy/logs/haproxy.pid log全局的日志配置，local0是日志设备，info表示日志级别。其中日志级别有err, warning, info, debug 4种。这个配置表示使用127.0.0.1上的rsyslog服务中的local0日志设备，记录日志等级为infomaxconn设置每个HAProxy进程可接受的最大并发连接数nbproc设置HAProxy启动时可创建的进程数，此参数要求将HAProxy运行模式设置为daemon，默认只启动一个进程；建议该值设置时小于CPU核数daemon设置HAProxy进程进入后台运行，这是推荐的运行模式user/group设置启动HAProxy进程的用户和组pidfile指定HAProxy进程ID的存放位置2) defaults部分defaults mode http retires 3 timeout connect 10s timeout client 20s timeout server 30s timeout check 5smode设置HAProxy实例默认的运行模式，有tcp, http, health三个可选值tcp模式：在此模式下，客户端和服务器端间将建立一个全双工的连接，不会对七层报文做任何检查，为默认的模式；经常用于SSL, SSH, SMTP等应用http模式在此模式下，客户端请求在转发至后端服务器前将会被深度分析，所有不与RFC格式兼容的请求都会被拒绝health模式目前已经被废除retires设置连接后端服务器的失败重试次数，如果连接失败的次数超过该数值，HAProxy会将对应的后端服务器标记为不可用timeout connect设置成功连接到一台服务器的最长等待时间，默认单位是毫秒，但也可以使用其他时间单位作后缀timeout client设置连接客户端发送数据时最长等待时间，默认单位是毫秒，但也可以使用其他时间单位作后缀timeout server设置服务器端回应客户端数据发送的最长等待时间，默认单位是毫秒，但也可以使用其他时间单位作后缀timeout check设置对后端服务器的检测超时时间，默认单位是毫秒，但也可以使用其他时间单位作后缀3) frontend部分frontend www bind *:80 mode http option httplog option forwardfor option httpclose log global default_backend htmpool通过frontend关键字定义了一个名为"www"的前端虚拟节点bind此选项用于定义一个或者几个监听的套接字，只能在frontend和listen中定义格式如下：bind [ :[port_range]] [interface]option httplog默认情况下，HAProxy日志是不记录HTTP请求的，此选项的作用是启用日志记录HTTP请求option forwardfor此选项的作用是保证后端服务器可记录客户端真实的IPoption httpclose此选项表示客户端和服务端完成一次连接请求后，HAProxy将主动关闭此TCP连接。这是对性能非常有帮助的一个参数log global表示使用global段中定义的日志格式default_backend htmpool此选项用于指定后端默认的服务器池4) backend部分backend htmpool mode http option redispatch option abortonclose balance roundrobin cookie SERVERID option httpchk GET /index.php server web1 10.1.1.1:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3 server web2 10.1.1.2:80 cookie server2 weight 6 check inter 2000 rise 2 fall 3backend用于定义一个名称为htmpool的后端服务器组，根据需要可以定义多个option redispatch此参数用于cookie保持的环境中。在默认情况下，HAProxy会将其请求的后端服务器的serverID插入cookie中，以保证会话的session持久性。而如果后端服务器出现故障，客户端的cookie是不会刷新的，这就会造成无法访问。此时，如果设置了此参数，就会将客户的请求强制定向到另外一台健康的后端服务器上，以保证服务正常option abortonclose此参数可以在服务器负载很高的情况下，自动结束当前队列中处理时间比较长的连接balance roundrobin指定负载均衡算法HAProxy支持的负载均衡算法：roundrobin基于权重进行轮叫调度的算法static-rr基于权重进行轮叫调度的算法，不过此算法为静态算法，在运行时调整其服务器权重不会生效source基于请求源IP的算法。此算法先对请求的源IP进行HASH运算，然后将结果与后端服务器的权重总数相除后转发至某台匹配的后端服务器。这种方式可以使同一个客户端IP的请求始终转发到某特定的后端服务器leastconn此算法会将新的连接请求转发到具有最少连接数目的后端服务器。在会话时间较长的场景中推荐使用此算法 ，例如数据库负载均衡uri此算法会对部分或整个URI进行HASH运算，再经过与服务器的总权重相除，最后转发到某台匹配的后端服务器上uri_param此算法会根据URL路径中的参数进行转发，这样可保证在后端真实服务器数据不变时，同一个用户的请求始终分发到同一台机器上hdr此算法根据HTTP头进行转发，如果指定的HTTP头名称不存在，则使用roundrobin算法 进行策略转发cookie SERVERID表示允许向cookie插入SERVERID，每台服务器的SERVERID可在下面的server关键字中使用cookie关键字定义option httpchk此选项表示启用HTTP的服务状态检测功能格式如下：option httpchk <method> <uri> <version>method表示HTTP请求的方式，常用的有OPTIONS,HEAD, GET几种方式。一般的健康检查可以采用HEAD方式进行，而不是采用GET方式，这是因为HEAD方式没有数据返回，仅检查响应报文的状态码是不是200.因此相对于GET, HEAD的方式更简单、更快uri表示要检测的URL地址version指定心跳检测时的HTTP的版本号server web1 10.1.1.1:80 cookie server1 weight 6 check inter 2000 rise 2 fall 3server用于定义多台后端真实服务器，不能用于frontend和listen段格式如下：server <name> :[port] [param*]name为后端真实服务器指定一个内部名称，随便定义一个即可address:port指定后端服务器的IP地址及端口param*参数常用的参数：check 表示启用对此后端服务器执行健康状态检查inter 设置健康状态检查的时间间隔，单位是毫秒rise 检查多少次认为服务器可用fall 检查多少次认为服务器不可用weight 设置服务器的权重，默认为1， 最大为256。 设置为0表示不参与负载均衡backup 设置备份服务器，用于所有后端服务器全部不可用时cookie 为指定的后端服务器设置cookie值，此处指定的值将在请求入站时被检查，第一次为此值挑选的后端服务器将在后续的请求中一直被选中，其目的在于实现持久连接的功能5) listen部分listen admin_status bind 0.0.0.0:9188 mode http log 127.0.0.1 local0 err stats refresh 30s stats uri /haproxy-status stats realm Welcome login stats auth admin:admin stats hide-version stats admin if TRUElisten部分用于配置HAProxy监控页面相关的参数stats refresh 30s设置HAProxy监控统计页面自动刷新的时间stats uri /haproxy-status设置HAProxy监控页面访问的URI路径stats realm Welcome login设置登录监控页面时，密码框上的提示信息stats auth admin:admin设置登录监控页面的用户名，密码。用户密码用冒号隔开，可以设置多个，每行一个stats hide-version设置在监控页面上隐藏HAProxy的版本号status admin if TRUE设置此选项，可在监控页面上启用、禁用后端服务器，仅在1.4.9版本以后生效
当前大多数的互联网系统都使用了服务器集群技术，集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务，这些集群可以是 Web应用服务器集群，也可以是数据库服务器集群，还可以是分布式缓存服务器集群等等。在实际应用中，在 Web 服务器集群之前总会有一台负载均衡服务器，负载均衡设备的任务就是作为 Web 服务器流量的入口，挑选最合适的一台 Web 服务器，将客户端的请求转发给它处理，实现客户端到真实服务端的透明转发。最近几年很火的「云计算」以及分布式架构，本质上也是将后端服务器作为计算资源、存储资源，由某台管理服务器封装成一个服务对外提供，客户端不需要关心真正提供服务的是哪台机器，在它看来，就好像它面对的是一台拥有近乎无限能力的服务器，而本质上，真正提供服务的，是后端的集群。LVS、Nginx、HAProxy 是目前使用最广泛的三种软件负载均衡软件。一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术。具体的应用需求还得具体分析，如果是中小型的 Web 应用，比如日 PV 小于1000万，用 Nginx 就完全可以了；如果机器不少，可以用 DNS 轮询，LVS 所耗费的机器还是比较多的；大型网站或重要的服务，且服务器比较多时，可以考虑用 LVS。目前关于网站架构一般比较合理流行的架构方案：Web 前端采用 Nginx/HAProxy+Keepalived 作负载均衡器；后端采用 MySQ L数据库一主多从和读写分离，采用 LVS+Keepalived 的架构。LVSLVS 是 Linux Virtual Server 的简称，也就是 Linux 虚拟服务器。现在 LVS 已经是 Linux 标准内核的一部分，从 Linux2.4 内核以后，已经完全内置了 LVS 的各个功能模块，无需给内核打任何补丁，可以直接使用 LVS 提供的各种功能。LVS 自从1998年开始，发展到现在已经是一个比较成熟的技术项目了。1 LVS的体系结构LVS 架设的服务器集群系统有三个部分组成：(1) 最前端的负载均衡层，用 Load Balancer 表示。(2) 中间的服务器集群层，用 Server Array 表示。(3) 最底端的数据共享存储层，用 Shared Storage 表示。2 LVS 负载均衡机制LVS 不像 HAProxy 等七层软负载面向的是 HTTP 包，所以七层负载可以做的 URL 解析等工作，LVS 无法完成。LVS 是四层负载均衡，也就是说建立在 OSI 模型的第四层——传输层之上，传输层上有我们熟悉的 TCP/UDP，LVS 支持 TCP/UDP 的负载均衡。因为 LVS 是四层负载均衡，因此它相对于其它高层负载均衡的解决办法，比如 DNS 域名轮流解析、应用层负载的调度、客户端的调度等，它的效率是非常高的。所谓四层负载均衡 ，也就是主要通过报文中的目标地址和端口。七层负载均衡 ，也称为“内容交换”，也就是主要通过报文中的真正有意义的应用层内容。LVS 的转发主要通过修改 IP 地址（NAT 模式，分为源地址修改 SNAT 和目标地址修改 DNAT）、修改目标 MAC（DR 模式）来实现。3 NAT 模式：网络地址转换NAT（Network Address Translation）是一种外网和内网地址映射的技术。NAT 模式下，网络数据报的进出都要经过 LVS 的处理。LVS 需要作为 RS（真实服务器）的网关。当包到达 LVS 时，LVS 做目标地址转换（DNAT），将目标 IP 改为 RS 的 IP。RS 接收到包以后，仿佛是客户端直接发给它的一样。RS 处理完，返回响应时，源 IP 是 RS IP，目标 IP 是客户端的 IP。这时 RS 的包通过网关（LVS）中转，LVS 会做源地址转换（SNAT），将包的源地址改为 VIP，这样，这个包对客户端看起来就仿佛是 LVS 直接返回给它的。4 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 模式具有较好的性能，也是目前大型网站使用最广泛的一种负载均衡手段。5 LVS的优点抗负载能力强、是工作在传输层上仅作分发之用，没有流量的产生，这个特点也决定了它在负载均衡软件里的性能最强的，对内存和 cpu 资源消耗比较低。配置性比较低，这是一个缺点也是一个优点，因为没有可太多配置的东西，所以并不需要太多接触，大大减少了人为出错的几率。工作稳定，因为其本身抗负载能力很强，自身有完整的双机热备方案，如 LVS+Keepalived。无流量，LVS 只分发请求，而流量并不从它本身出去，这点保证了均衡器 IO 的性能不会受到大流量的影响。应用范围比较广，因为 LVS 工作在传输层，所以它几乎可以对所有应用做负载均衡，包括 http、数据库、在线聊天室等等。6 LVS的缺点软件本身不支持正则表达式处理，不能做动静分离；而现在许多网站在这方面都有较强的需求，这个是 Nginx、HAProxy+Keepalived 的优势所在。如果是网站应用比较庞大的话，LVS/DR+Keepalived 实施起来就比较复杂了，相对而言，Nginx/HAProxy+Keepalived就简单多了。NginxNginx 是一个强大的 Web 服务器软件，用于处理高并发的 HTTP 请求和作为反向代理服务器做负载均衡。具有高性能、轻量级、内存消耗少，强大的负载均衡能力等优势。1 Nignx 的架构设计相对于传统基于进程或线程的模型（Apache就采用这种模型）在处理并发连接时会为每一个连接建立一个单独的进程或线程，且在网络或者输入/输出操作时阻塞。这将导致内存和 CPU 的大量消耗，因为新起一个单独的进程或线程需要准备新的运行时环境，包括堆和栈内存的分配，以及新的执行上下文，当然，这些也会导致多余的 CPU 开销。最终，会由于过多的上下文切换而导致服务器性能变差。反过来，Nginx 的架构设计是采用模块化的、基于事件驱动、异步、单线程且非阻塞。Nginx 大量使用多路复用和事件通知，Nginx 启动以后，会在系统中以 daemon 的方式在后台运行，其中包括一个 master 进程，n(n>=1) 个 worker 进程。所有的进程都是单线程（即只有一个主线程）的，且进程间通信主要使用共享内存的方式。其中，master 进程用于接收来自外界的信号，并给 worker 进程发送信号，同时监控 worker 进程的工作状态。worker 进程则是外部请求真正的处理者，每个 worker 请求相互独立且平等的竞争来自客户端的请求。请求只能在一个 worker 进程中被处理，且一个 worker 进程只有一个主线程，所以同时只能处理一个请求。（原理同 Netty 很像）2 Nginx 负载均衡Nginx 负载均衡主要是对七层网络通信模型中的第七层应用层上的 http、https 进行支持。Nginx 是以反向代理的方式进行负载均衡的。反向代理（Reverse Proxy）方式是指以代理服务器来接受 Internet 上的连接请求，然后将请求转发给内部网络上的服务器，并将从服务器上得到的结果返回给 Internet 上请求连接的客户端，此时代理服务器对外就表现为一个服务器。Nginx 实现负载均衡的分配策略有很多，Nginx 的 upstream 目前支持以下几种方式：轮询（默认）：每个请求按时间顺序逐一分配到不同的后端服务器，如果后端服务器 down 掉，能自动剔除。weight：指定轮询几率，weight 和访问比率成正比，用于后端服务器性能不均的情况。ip_hash：每个请求按访问 ip 的 hash 结果分配，这样每个访客固定访问一个后端服务器，可以解决 session 的问题。fair（第三方）：按后端服务器的响应时间来分配请求，响应时间短的优先分配。url_hash（第三方）：按访问 url 的 hash 结果来分配请求，使每个 url定向到同一个后端服务器，后端服务器为缓存时比较有效。3 Nginx 的优点跨平台：Nginx 可以在大多数 Unix like OS编译运行，而且也有 Windows 的移植版本配置异常简单：非常容易上手。配置风格跟程序开发一样，神一般的配置非阻塞、高并发连接：官方测试能够支撑5万并发连接，在实际生产环境中跑到2～3万并发连接数事件驱动：通信机制采用 epoll 模型，支持更大的并发连接Master/Worker 结构：一个 master 进程，生成一个或多个 worker 进程内存消耗小：处理大并发的请求内存消耗非常小。在3万并发连接下，开启的10个 Nginx 进程才消耗150M 内存（15M*10=150M）内置的健康检查功能：如果 Nginx 代理的后端的某台 Web 服务器宕机了，不会影响前端访问节省带宽：支持 GZIP 压缩，可以添加浏览器本地缓存的 Header 头稳定性高：用于反向代理，宕机的概率微乎其微4 Nginx 的缺点Nginx 仅能支 持http、https 和 Email 协议，这样就在适用范围上面小些，这个是它的缺点。对后端服务器的健康检查，只支持通过端口来检测，不支持通过 url来检测。不支持 Session 的直接保持，但能通过 ip_hash 来解决。HAProxyHAProxy 支持两种代理模式 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）。出自：京东运维[player id='712292593' type='collect' autoplay='true'/]