Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Production кейсы
production_cases

Production кейсы

Миграции без простоя, blue-green деплой, canary релизы

Production кейсы HAProxy

Миграции без простоя, blue-green деплой, canary релизы, rollback.

#Миграции без простоя

#Миграция SSL сертификатов

# 1. Подготовка нового сертификата cp new-cert.pem /etc/haproxy/certs/site.pem.new # 2. Проверка сертификата openssl x509 -in /etc/haproxy/certs/site.pem.new -text -noout # 3. Копирование с атомарной заменой mv /etc/haproxy/certs/site.pem.new /etc/haproxy/certs/site.pem # 4. Reload HAProxy (zero-downtime) systemctl reload haproxy # 5. Проверка curl -v https://example.com/ | grep "subject"

Важно:

  • cert + key в одном PEM файле
  • Проверка синтаксиса перед reload
  • Rollback: mv old.pem site.pem && reload

#Миграция на новые backend серверы

# Старая конфигурация backend web_servers server web1 192.168.1.10:8080 check server web2 192.168.1.11:8080 check # Новая конфигурация (постепенная) backend web_servers # Старые серверы с уменьшенным весом server web1 192.168.1.10:8080 check weight 50 server web2 192.168.1.11:8080 check weight 50 # Новые серверы server web3 192.168.1.20:8080 check weight 50 server web4 192.168.1.21:8080 check weight 50

Процесс:

  1. Добавить новые серверы с weight 50
  2. Мониторить ошибки: echo "show stat" | socat ...
  3. Увеличить weight новых до 100
  4. Уменьшить weight старых до 0
  5. Удалить старые серверы

#Миграция портов

# 1. Оба порта активны frontend http_old bind *:80 default_backend web_servers frontend http_new bind *:8080 default_backend web_servers # 2. Мониторинг трафика на новом порту # 3. Redirect со старого на новый frontend http_old bind *:80 redirect scheme http port 8080 code 301 # 4. После миграции — только новый порт frontend http_new bind *:80 # Вернуться на стандартный порт default_backend web_servers

#Blue-Green Deployment

#Архитектура

                    ┌─────────────┐
                    │   HAProxy   │
                    └──────┬──────┘
                           │
         ┌─────────────────┴─────────────────┐
         │                                   │
         ▼                                   ▼
┌─────────────────┐              ┌─────────────────┐
│  Blue (active)  │              │  Green (idle)   │
│  192.168.1.10   │              │  192.168.1.20   │
│  192.168.1.11   │              │  192.168.1.21   │
└─────────────────┘              └─────────────────┘

#Конфигурация

backend web_blue server blue1 192.168.1.10:8080 check server blue2 192.168.1.11:8080 check backend web_green server green1 192.168.1.20:8080 check server green2 192.168.1.21:8080 check # Активная среда frontend https_front bind *:443 use_backend web_blue if { var(active_env) -m str blue } use_backend web_green if { var(active_env) -m str green } default_backend web_blue

#Переключение через Stats Socket

# Проверка текущей среды echo "show var active_env" | socat /var/run/haproxy/admin.sock stdio # Переключение на green echo "set var active_env green" | socat /var/run/haproxy/admin.sock stdio # Или через ACL файл # /etc/haproxy/active_env.txt: green echo "green" > /etc/haproxy/active_env.txt echo "add acl /etc/haproxy/active_env.txt green" | socat /var/run/haproxy/admin.sock stdio

#Автоматизация переключения

#!/bin/bash # blue-green-switch.sh ENV=$1 # blue или green if [ "$ENV" != "blue" ] && [ "$ENV" != "green" ]; then echo "Usage: $0 blue|green" exit 1 fi # Проверка здоровья новой среды if ! curl -f http://${ENV}1:8080/health; then echo "New environment is not healthy!" exit 1 fi # Переключение echo "set var active_env $ENV" | socat /var/run/haproxy/admin.sock stdio # Проверка echo "Switched to $ENV environment"

Использование:

# Деплой на green ./deploy-to-green.sh # Проверка green curl https://example.com/health # Переключение на green ./blue-green-switch.sh green # Rollback при проблемах ./blue-green-switch.sh blue

#Canary Deployment

#Canary по весу

backend api_servers # Stable версия (90% трафика) server api_stable1 192.168.1.10:8080 check weight 90 # Canary версия (10% трафика) server api_canary1 192.168.1.20:8080 check weight 10

#Canary по пользователям

backend api_servers # ACL для canary пользователей acl is_canary_user hdr(X-User-ID) -f /etc/haproxy/canary_users.txt # Canary версия server api_canary1 192.168.1.20:8080 check server api_canary2 192.168.1.21:8080 check # Stable версия server api_stable1 192.168.1.10:8080 check server api_stable2 192.168.1.11:8080 check # Маршрутизация use_backend api_canary if is_canary_user default_backend api_stable

#Canary по заголовку

frontend api_front bind *:80 # Canary для internal тестирования acl is_internal src 10.0.0.0/8 acl wants_canary hdr(X-Canary) -m str true use_backend api_canary if is_internal wants_canary default_backend api_stable

#Постепенное увеличение canary

#!/bin/bash # canary-rollout.sh STAGES=(10 25 50 75 100) for WEIGHT in "${STAGES[@]}"; do echo "Setting canary weight to $WEIGHT%" # Установка веса через stats socket echo "set server api_servers/api_canary1 weight $WEIGHT" | \ socat /var/run/haproxy/admin.sock stdio echo "set server api_servers/api_canary2 weight $WEIGHT" | \ socat /var/run/haproxy/admin.sock stdio # Мониторинг ошибок echo "Waiting 5 minutes for monitoring..." sleep 300 # Проверка error rate ERROR_RATE=$(curl -s http://haproxy:8404/metrics | \ grep haproxy_server_responses_total{code="5"} | \ grep canary | awk '{sum+=$2} END {print sum}') if [ "$ERROR_RATE" -gt 100 ]; then echo "High error rate on canary! Rolling back..." echo "set server api_servers/api_canary1 weight 0" | \ socat /var/run/haproxy/admin.sock stdio exit 1 fi done echo "Canary rollout complete!"

#A/B Testing

#Конфигурация A/B теста

backend ab_test # Вариант A (control) server variant_a 192.168.1.10:8080 check weight 50 # Вариант B (test) server variant_b 192.168.1.20:8080 check weight 50 frontend https_front bind *:443 # Sticky session для консистентности stick-table type ip size 100k expire 24h store server_id stick on src stick store-request src default_backend ab_test

#A/B по гео

backend ab_test server variant_a 192.168.1.10:8080 check server variant_b 192.168.1.20:8080 check frontend https_front bind *:443 # Гео-сегментация acl is_us src -m geoip -f /usr/share/GeoIP/GeoIP.dat US acl is_eu src -m geoip -f /usr/share/GeoIP/GeoIP.dat EU use_backend variant_a if is_us use_backend variant_b if is_eu default_backend ab_test

#Rollback стратегии

#Быстрый rollback

# 1. Откат веса canary на 0 echo "set server api_servers/api_canary1 weight 0" | \ socat /var/run/haproxy/admin.sock stdio # 2. Переключение на stable backend echo "set server api_servers/api_stable1 weight 100" | \ socat /var/run/haproxy/admin.sock stdio # 3. Проверка curl https://example.com/health

#Rollback конфигурации

#!/bin/bash # rollback.sh # Резервная копия текущей конфигурации cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.backup.$(date +%Y%m%d_%H%M%S) # Восстановление предыдущей версии cp /etc/haproxy/haproxy.cfg.previous /etc/haproxy/haproxy.cfg # Проверка haproxy -c -f /etc/haproxy/haproxy.cfg # Reload systemctl reload haproxy echo "Rollback complete"

#Git-based rollback

# Версионирование конфигурации cd /etc/haproxy git init git add haproxy.cfg git commit -m "Initial config" # Перед каждым изменением git add haproxy.cfg git commit -m "Before canary deployment" # Rollback через git git checkout HEAD~1 -- haproxy.cfg haproxy -c -f /etc/haproxy/haproxy.cfg systemctl reload haproxy

#Full Example: Production Deployment

#CI/CD Pipeline

# .gitlab-ci.yml stages: - deploy_canary - monitor - rollout - finalize deploy_canary: stage: deploy_canary script: # Деплой canary версии kubectl apply -f k8s/canary/ # Добавление в HAProxy ansible-playbook add_canary.yml -e "weight=10" monitor: stage: monitor script: # Мониторинг 10 минут python monitor_metrics.py --duration=600 # Проверка error rate < 1% python check_error_rate.py --threshold=1 rollout: stage: rollout script: # Постепенное увеличение веса ansible-playbook rollout.yml -e "stages=25,50,75,100" finalize: stage: finalize script: # Обновление stable версии kubectl set image deployment/api api=new-version # Удаление canary kubectl delete -f k8s/canary/

#Ansible Playbook

# add_canary.yml - hosts: haproxy tasks: - name: Add canary server lineinfile: path: /etc/haproxy/haproxy.cfg line: " server api_canary1 {{ canary_ip }}:8080 check weight {{ weight }}" insertafter: "backend api_servers" - name: Validate configuration command: haproxy -c -f /etc/haproxy/haproxy.cfg - name: Reload HAProxy systemd: name: haproxy state: reloaded

#Monitoring деплоя

#Ключевые метрики

# Error rate rate(haproxy_server_responses_total{code=~"5.."}[5m]) / rate(haproxy_server_responses_total[5m]) * 100 # Response time p95 histogram_quantile(0.95, rate(haproxy_server_response_time_seconds_bucket[5m])) # Request rate rate(haproxy_server_responses_total[5m]) # Active connections haproxy_server_current_sessions

#Alerting

# deployment-alerts.yml groups: - name: deployment rules: - alert: CanaryHighErrorRate expr: | rate(haproxy_server_responses_total{server=~".*canary.*",code=~"5.."}[5m]) / rate(haproxy_server_responses_total{server=~".*canary.*"}[5m]) * 100 > 5 for: 5m labels: severity: critical annotations: summary: "Canary error rate > 5%" - alert: CanaryHighLatency expr: | histogram_quantile(0.95, rate(haproxy_server_response_time_seconds_bucket{server=~".*canary.*"}[5m])) > 1 for: 5m labels: severity: warning annotations: summary: "Canary p95 latency > 1s"

#Best Practices

#Деплой

# ✅ Хорошо # - Canary 10% → monitor → 25% → 50% → 75% → 100% # - Автоматический rollback при error rate > 5% # - Health checks перед переключением # ❌ Плохо # - Мгновенное переключение 0% → 100% # - Нет мониторинга во время деплоя # - Нет плана rollback

#Миграции

# ✅ Хорошо # - Атомарные операции (mv, symlink) # - Проверка перед применением # - Backup конфигурации # ❌ Плохо # - Редактирование конфига напрямую # - Нет проверки синтаксиса # - Нет backup

#Rollback

# ✅ Хорошо # - Автоматический rollback по метрикам # - Кнопка rollback в CI/CD # - Тестированный план rollback # ❌ Плохо # - Ручной rollback по инструкциям # - Нет тестирования rollback процедуры

Далее: Архитектурные паттерны