北青永恒 - Haproxy
type: channel
link: http://kococ.cn/tag/Haproxy/
items: HAProxy介绍及配置文件详解
items: 你真的掌握 LVS、Nginx 及 HAProxy 的工作原理吗？

HAProxy介绍及配置文件详解
type: item
date: 2021-01-27T16:54:21+08:00
description: 一、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默认情况下，HAPro…

你真的掌握 LVS、Nginx 及 HAProxy 的工作原理吗？
type: item
date: 2019-07-14T09:51:00+08:00
description: 当前大多数的互联网系统都使用了服务器集群技术，集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务，这些集群可以是 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）返回…