Что такое HAProxy, event-driven архитектура, место в современной инфраструктуре
HAProxy обрабатывает миллиарды запросов ежедневно на таких платформах как GitHub, Twitter, Instagram. Понимание его архитектуры — ключ к эффективному использованию.
HAProxy (High Availability Proxy) — это открытый балансировщик нагрузки и прокси-сервер для TCP и HTTP приложений, разработанный Вилли Тарраном (Willy Tarreau) в 2000 году.
Ключевые особенности:
┌─────────────┐
Клиенты ───────►│ HAProxy │
└─────────────┘
│
┌─────────────────┼─────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Web 1 │ │ Web 2 │ │ Web 3 │
└──────────┘ └──────────┘ └──────────┘
HAProxy решает задачи:
HAProxy использует event-driven модель — это фундаментальное отличие от многопоточных серверов вроде Apache (prefork).
Традиционный многопоточный подход:
┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐
│ Поток 1│ │ Поток 2│ │ Поток 3│ │ Поток N│
│ sleep │ │ sleep │ │ work │ │ sleep │
└────────┘ └────────┘ └────────┘ └────────┘
▼ ▼ ▼ ▼
блокировка блокировка работа блокировка
Event-driven подход HAProxy:
┌────────────────────────────────────────────────┐
│ Один поток │
│ ┌────────┐ ┌────────┐ ┌────────┐ ┌──────┐ │
│ │ Сокет A│ │ Сокет B│ │ Сокет C│ │СокетD│ │
│ │ read │ │ write │ │ idle │ │close │ │
│ └────────┘ └────────┘ └────────┘ └──────┘ │
└────────────────────────────────────────────────┘
Принцип работы:
| Характеристика | Многопоточный | Event-driven (HAProxy) |
|---|---|---|
| Потребление памяти | 1-8 МБ на поток | ~10 КБ на соединение |
| Переключение контекста | Частое, дорогое | Минимальное |
| Масштабирование | Ограничено числом ядер | Десятки тысяч соединений в одном потоке |
| Latency | Варьируется из-за GC/планировщика | Предсказуемая, низкая |
┌─────────────────────────────────────────────────────────┐
│ HAProxy Process │
├─────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Master │ │ Worker │ │ Agent │ │
│ │ Process │ │ Processes │ │ (health) │ │
│ │ (config) │ │ (traffic) │ │ checks │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────────┤
│ ┌─────────────────────────────────────────────────┐ │
│ │ Event Loop (epoll) │ │
│ │ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │ │
│ │ │Front 1│ │Front 2│ │Back 1 │ │Back 2 │ ... │ │
│ │ └───────┘ └───────┘ └───────┘ └───────┘ │ │
│ └─────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Stick Tables │ │ Cache │ │ Log Buffer │ │
│ │ (rate limit)│ │ (optional) │ │ (rsyslog) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────┘
defaults
mode http
frontend http_front
bind *:80
# Доступ к HTTP полям: path, headers, cookies
acl is_api path_beg /api
use_backend api_servers if is_apiВозможности:
defaults
mode tcp
backend db_cluster
balance leastconn
server db1 192.168.1.10:3306 check
server db2 192.168.1.11:3306 checkПрименение:
Бенчмарки (реальные кейсы):
| Компания | Трафик | Конфигурация |
|---|---|---|
| GitHub | 10+ млрд запросов/день | Кластер HAProxy |
| Миллионы RPS | HAProxy + custom | |
| Высоконагруженный API | HAProxy на edge |
Факторы производительности:
| Характеристика | HAProxy | Nginx | Envoy |
|---|---|---|---|
| Производительность HTTP | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| Производительность TCP | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| Конфигурация | Файл | Файл + Lua | API + xDS |
| Динамическое обновление | Dataplane API | Lua, NJS | Native API |
| Kubernetes native | Ingress | Ingress | Native (data plane) |
| Learning curve | Средняя | Низкая | Высокая |
✅ Выбирайте HAProxy если:
❌ Рассмотрите альтернативы если:
В следующей теме установим HAProxy и запустим первый конфиг для балансировки HTTP трафика.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.