Миграции без простоя, blue-green деплой, canary релизы
Миграции без простоя, blue-green деплой, canary релизы, rollback.
# 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"Важно:
mv old.pem site.pem && reload# Старая конфигурация
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Процесс:
echo "show stat" | socat ...# 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 ┌─────────────┐
│ 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# Проверка текущей среды
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 bluebackend 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 10backend 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_stablefrontend 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#!/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!"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_testbackend 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# 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#!/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"# Версионирование конфигурации
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# .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/# 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# 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# 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"# ✅ Хорошо
# - Canary 10% → monitor → 25% → 50% → 75% → 100%
# - Автоматический rollback при error rate > 5%
# - Health checks перед переключением
# ❌ Плохо
# - Мгновенное переключение 0% → 100%
# - Нет мониторинга во время деплоя
# - Нет плана rollback# ✅ Хорошо
# - Атомарные операции (mv, symlink)
# - Проверка перед применением
# - Backup конфигурации
# ❌ Плохо
# - Редактирование конфига напрямую
# - Нет проверки синтаксиса
# - Нет backup# ✅ Хорошо
# - Автоматический rollback по метрикам
# - Кнопка rollback в CI/CD
# - Тестированный план rollback
# ❌ Плохо
# - Ручной rollback по инструкциям
# - Нет тестирования rollback процедурыИзучим архитектурные паттерны: multi-tier, service mesh, edge routing.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.