Балансировка баз данных, кастомные протоколы, pure TCP
Балансировка на транспортном уровне для баз данных, кастомных протоколов, pure TCP трафика.
| Характеристика | HTTP Mode (L7) | TCP Mode (L4) |
|---|---|---|
| Анализ протокола | HTTP заголовки, path | Сырой TCP поток |
| Маршрутизация | По URL, headers, cookies | По IP, порту |
| Модификация | Заголовки, URL | Недоступна |
| Health checks | HTTP GET/POST | TCP connect |
| Производительность | Выше overhead | Минимальный overhead |
| Use cases | Веб-серверы, API | БД, Redis, кастомные протоколы |
defaults
mode tcp
timeout connect 5s
timeout client 30m
timeout server 30m
frontend mysql_front
bind *:3306
default_backend mysql_servers
backend mysql_servers
balance leastconn
server db1 192.168.1.10:3306 check
server db2 192.168.1.11:3306 checkОсобенности:
mode tcp — отключает HTTP анализbalance leastconn — для равномерной нагрузкиbackend mysql_servers
mode tcp
balance leastconn
option mysql-check user haproxy
server db1 192.168.1.10:3306 check port 3306
server db2 192.168.1.11:3306 check port 3306MySQL health check:
option mysql-check — использует MySQL protocoluser haproxy — пользователь для проверкиCREATE USER 'haproxy'@'%' IDENTIFIED BY 'healthcheck';
GRANT USAGE ON *.* TO 'haproxy'@'%';
FLUSH PRIVILEGES;Проверка:
mysql -h db1 -u haproxy -phealthcheck -e "SELECT 1"# Write (master)
frontend mysql_write
bind *:3307
default_backend mysql_master
backend mysql_master
mode tcp
balance leastconn
option mysql-check user haproxy
server master 192.168.1.10:3306 check
# Read (replicas)
frontend mysql_read
bind *:3308
default_backend mysql_replicas
backend mysql_replicas
mode tcp
balance leastconn
option mysql-check user haproxy
server replica1 192.168.1.11:3306 check
server replica2 192.168.1.12:3306 checkПриложение:
# Write
write_conn = mysql.connect(host='haproxy', port=3307)
# Read
read_conn = mysql.connect(host='haproxy', port=3308)backend pg_servers
mode tcp
balance leastconn
option pgsql-check user haproxy
server db1 192.168.1.10:5432 check
server db2 192.168.1.11:5432 checkСоздание пользователя:
CREATE USER haproxy WITH PASSWORD 'healthcheck';backend pgbouncer_servers
mode tcp
balance leastconn
# PgBouncer не поддерживает health checks, используем TCP check
server pgb1 192.168.1.10:6432 check
server pgb2 192.168.1.11:6432 checkbackend redis_servers
mode tcp
balance leastconn
option tcp-check
tcp-check send PING\r\n
tcp-check expect string +PONG
server redis1 192.168.1.10:6379 check
server redis2 192.168.1.11:6379 checkTCP health check:
tcp-check send PING\r\n — отправляет PINGtcp-check expect string +PONG — ожидает PONGbackend redis_master
mode tcp
balance leastconn
# Проверка что сервер master
option tcp-check
tcp-check send INFO\ replication\r\n
tcp-check expect string role:master
server redis1 192.168.1.10:6379 check
server redis2 192.168.1.11:6379 checkbackend mongo_servers
mode tcp
balance leastconn
option tcp-check
tcp-check send-binary \x43\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\xd4\x07\x00\x00\x00\x00admin\x2e\x24\x63\x6d\x64\x00\x00\x00\x00\x00\xff\xff\xff\xff\x19\x00\x00\x00\x01\x69\x73\x4d\x61\x73\x74\x65\x72\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
tcp-check expect binary \x01\x00\x00\x00
server mongo1 192.168.1.10:27017 check
server mongo2 192.168.1.11:27017 checkПримечание: Для MongoDB лучше использовать native replica set routing.
frontend grpc_front
bind *:50051
mode tcp
default_backend grpc_servers
backend grpc_servers
mode tcp
balance roundrobin
# gRPC health checking protocol
option tcp-check
tcp-check send-binary \x00\x00\x00\x00\x12\x10\x2f\x67\x72\x70\x63\x2e\x68\x65\x61\x6c\x74\x68\x2e\x48\x65\x61\x6c\x74\x68\x2f\x43\x68\x65\x63\x6b\x00\x00\x00\x00\x00
tcp-check expect binary \x00\x00\x00\x00
server grpc1 192.168.1.10:50051 check
server grpc2 192.168.1.11:50051 checkfrontend smtp_front
bind *:25
mode tcp
default_backend smtp_servers
backend smtp_servers
balance roundrobin
option smtp-check
server smtp1 192.168.1.10:25 check
server smtp2 192.168.1.11:25 checkfrontend smtps_front
bind *:465
mode tcp
default_backend smtps_servers
backend smtps_servers
balance roundrobin
server smtps1 192.168.1.10:465 check ssl verify none
server smtps2 192.168.1.11:465 check ssl verify nonefrontend ssh_front
bind *:22
mode tcp
default_backend ssh_servers
backend ssh_servers
balance leastconn
server ssh1 192.168.1.10:22 check
server ssh2 192.168.1.11:22 checkИспользование:
backend tcp_servers
mode tcp
server server1 192.168.1.10:8080 checkПоведение:
backend custom_servers
mode tcp
option tcp-check
tcp-check send GET /health HTTP/1.0\r\n\r\n
tcp-check expect string 200 OK
server server1 192.168.1.10:8080 checkbackend binary_servers
mode tcp
option tcp-check
tcp-check send-binary \x00\x01\x02\x03
tcp-check expect binary \x04\x05\x06\x07
server server1 192.168.1.10:9000 checkbackend db_servers
mode tcp
balance leastconn
# Лимит на сервер
server db1 192.168.1.10:3306 check maxconn 100
# Лимит на backend
maxconn 500backend db_servers
mode tcp
timeout queue 30s
server db1 192.168.1.10:3306 check maxconn 100
server db2 192.168.1.11:3306 check maxconn 100Поведение:
maxconn — запросы в очередьtimeout queue — время ожидания в очередиbackend backend_servers
mode tcp
send-proxy-v2
server server1 192.168.1.10:8080 check
server server2 192.168.1.11:8080 checkКогда использовать:
frontend tcp_front
bind *:8080 accept-proxy
mode tcp
default_backend backend_serversdefaults
mode tcp
timeout connect 5s
timeout client 30m
timeout server 30m
log global
option tcplog
# MySQL Write
frontend mysql_write
bind *:3307
default_backend mysql_master
backend mysql_master
balance leastconn
option mysql-check user haproxy password healthcheck
server master 192.168.1.10:3306 check inter 5s fall 3 rise 2
# MySQL Read
frontend mysql_read
bind *:3308
default_backend mysql_replicas
backend mysql_replicas
balance leastconn
option mysql-check user haproxy password healthcheck
server replica1 192.168.1.11:3306 check inter 5s fall 3 rise 2
server replica2 192.168.1.12:3306 check inter 5s fall 3 rise 2
# Redis
frontend redis_front
bind *:6379
default_backend redis_servers
backend redis_servers
balance leastconn
option tcp-check
tcp-check send PING\r\n
tcp-check expect string +PONG
server redis1 192.168.1.20:6379 check inter 5s fall 3 rise 2
server redis2 192.168.1.21:6379 check inter 5s fall 3 rise 2
# PostgreSQL
frontend pg_front
bind *:5432
default_backend pg_servers
backend pg_servers
balance leastconn
option pgsql-check user haproxy
server pg1 192.168.1.30:5432 check inter 5s fall 3 rise 2
server pg2 192.168.1.31:5432 check inter 5s fall 3 rise 2# Статус серверов
echo "show servers state" | socat /var/run/haproxy/admin.sock stdio
# Статистика по backend
echo "show stat" | socat /var/run/haproxy/admin.sock stdio# Захват трафика
tcpdump -i any -s 0 -w haproxy-tcp.pcap port 3306
# Анализ в Wireshark
wireshark haproxy-tcp.pcap# Логирование TCP соединений
option tcplog
log-format "%ci:%cp [%tr] %ft %b/%s %Tw/%Tc/%Tr/%Ta/%Tt %ST %B %actconn/%feconn/%beconn/%srv_conn/%retries"balance leastconn для длительных соединенийoption tcp-checkИзучим health checks глубокий: кастомные проверки, agent checks.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.