HAProxy必知必会
什么是HAProxy
HAProxy是一款提供高可用性、负载均衡以及基于TCP和HTTP应用的高性能代理。典型的用于作为MySQL的负载均衡,还可以用于保持Seesion会话的Http应用,甚至还可以用于自定义的API网关。
实现原理
前端 (frontend)
用于定义需要监听的sockets(套接字)以及接受客户端的连接。
控制列表(ACL Access Control Lists)
通过acl定义frontend的请求如何转发给后端的服务器。
后端(backend)
用于定义一组服务器,代理将客户端的请求转发到这些服务器。
健康检查
HAProxy可以定时对后端的服务器进行健康状态检查。
高可用性
HAProxy通过多种策略算法对后端服务进行负载均衡,保证后端服务的高可用性。常见的策略有:
- roundrobin 轮询算法,可以支持权重,支持运行时调整权重。
- static-rr 基于权重的轮询,不支持运行时调整权重。
- leastconn 适用于长连接的会话,将新情求转发至后端连接数最少的服务。
- first 顺序算法,按照服务器id最少的负载,最大连接已满,就请求至下一个服务,必须设置maxconn参数,否则无效。
- source 将请求的原地址进行hash运算,根据后端服务权重转发指定的服务器。常用与五cookie功能的基于TCP协议的负载均衡。
- uri 对问号之前的uri进行hash路由,加上服务器权重,使得同一个uri总是路由到相同的服务器。仅仅用于Http后端服务场景。
- uri_param 根据Http GET请求的参数,即问号之后的参数,加上服务器权重进行路由。设置了check_post参数才会检查post请求。
- hdr
查找Http Header
请求头信息并路由。相当于ACL的hdr函数,请求头不区分大小写。 - random 通过一致性hash函数随机到一台服务器,可以同时采用服务器权重。常用于大量后端服务或者添加删除频繁的场景。hash-balance-factor参数可进一步提升在响应时间经常变化场景下的公平性。
- rdp-cookie(name) 根据cookie(name)进行哈希,适用于持久化请求,将同一个用户或者同一个session路由到同一台服务器。如果没有cookie,默认采用roundrobin。服务器权重在此场景不起作用。
但HAProxy服务自身的可用性是如何保证的呢?你想想,这么请求都是通过HAProxy负责转发,万一HAProxy挂掉了呢?所以针对HAProxy本身,也是有高可用的需求。常用的方案是使用Keeplived实现。首先设置内网VIP(Virtual IP/Floating IP),提供对外的服务,Keeplived服务对每一个master和slave进行心跳检测,发现master挂掉了话,会通过ARP协议更新VIP对应的MAC地址。这里有一张图,可以很清晰的了解整个过程。
高性能
HAProxy是一个单线程,事件驱动,基于优先级调度的高速IO层的非阻塞引擎。它从设计之初就考虑到了数据转发,其架构进行了优化,使其用尽可能少的操作可以快速移动数据。它实现了一个分层模型,在每一个级别提供旁路机制,确保数据除非必要,否则不需要转发到更高的级别。最后发现处理时间的花费,大约85%在内核,15%在HAProxy。
常用配置
代理服务名称的正则表达式为[a-zA-Z0-9-_.:]
为什么选择HAProxy
还有一些其他的选择,比如:
- Nginx : 实际上Nginx已经成为第二个事实上标准的Http服务器。
- LVS 是工作在Linux内核的第四层网络上,基于包的负载均衡服务。
- Varnish是一个智能缓存反向代理,可能是最好的Web应用加速器。
将这些常用的服务进行对比,看看为什么没有选择它们。
特点 | Nginx | LVS | Varnish | HAProxy | 备注 |
---|---|---|---|---|---|
10K Problem | ✓ | ✓ | ✓ | ✓ | 1w并发 |
TCP load balancer/TCP Proxy | ✗ | ✓ | ✗ | ✓ | |
UDP load balancer | ✗ | ✓ | ✗ | ✗ | |
Http load balancer | ✓ | ✗ | ✓ | ✓ | |
Https load balancer | ✓ | ✗ | ✗ | ✓ | |
Http Server/Web Server | ✓ | ✗ | ✗ | ✗ | |
Cache Server/Cache Proxy | ✗ | ✗ | ✓ | ✗ | 缓存代理 |
Http Reverse Proxy/Gateway | ✓ | ✗ | ✗ | ✓ | 反向代理 |
Sticky Sessions | ✗ | — | — | ✓ | 会话保持 |
load balancing algorithms | 4 | — | — | 9 | 负载均衡策略 |
health check | ✗ | ✗ | ✓ | ✓ | 健康检查 |
Http Proxy | — | — | — | — | 正向代理 Squid |
HAProxy最佳实践
官方发布了PPT介绍HAProxy主要功能,非常清楚的介绍了HAProxy最佳实践。
参考链接
- HAProxy用法详解 全网最详细中文文档
- 谈一谈使用 HAProxy 构建 API 网关服务的思路
- haproxy configuation balance
- haproxy intro
- Introduction to HAProxy ACLs
- Quick introduction to load balancing and load balancers
- How To Configure MySQL Group Replication on Ubuntu 16.04
- How To Use HAProxy As A Layer 4 Load Balancer for WordPress Application Servers on Ubuntu 14.04
- An Introduction to HAProxy and Load Balancing Concepts
- 虚拟IP和IP漂移
- Floating IP Resources
- How To Set Up Highly Available Web Servers with Keepalived and Floating IPs on Ubuntu 14.04
- HAProxy和负载均衡概念介绍
- Haproxy best practice
- HAProxy 最佳实践笔记
- 使用 Haproxy + Keepalived 构建基于 Docker 的高可用负载均衡服务(一)
- How to configure floating IP on Ubuntu