롤백 전략 및 원자 방출
롤백 전략 및 원자 방출
1) 빠른 롤백이 필요한 이유
우수한 테스트 범위에도 불구하고 음식은 오류가 없음을 보장하지 않습니다. 롤백은 SLO/비즈니스 메트릭 또는 입사 신호를 통해 시스템을 이전 정상 상태로 제어하는 것입니다. 목표:- MTTR을 몇 분으로 줄입니다.
- 영향 반경 (최소 영향 사용자/트랜잭션) 을 제한합니다.
- 데이터 무결성 및 계약 호환성을 유지하십시
키: 롤백이 미니 프로젝트가 아닌 사소한 작업이므로 릴리스를 빌드하십시오.
2) "원자 방출" 의 개념
원자 방출-지속적인 부작용없이 단일 원자 작업으로 새 버전/동작을 포함하고 취소 할 수있는 경우.
원자 성분:- 불변의 아티팩트 (부호있는 이미지/패키지).
- Versioned configs (수동 편집이 아닌 프로모션 버전).
- "포함" (라우팅/플래그) 에서 "전달" 을 분리합니다.
- 호환 가능한 데이터 스키마 (두 버전 모두 동시에 살 수 있음).
- 롤백 런북: 하나의 명확한 단계 (선택기/무게/깃발 변경) + 확인.
3) 롤백 기계 재고
3. 1 교통 계층 (가장 빠른)
Blue-Green: 대상 그룹 선택기를 안정적인 버전으로 전환하십시오.
카나리아: 무게가 0% 로 낮아지고 진행이 동결됩니다.
게이트웨이/NGINX/서비스 메시: 이전 가중치/경로로 돌아갑니다.
3. 2 컨베이어 레벨
Helm/Argo 롤아웃: 이전 개정판의 '중단/롤백'.
GitOps: 저장소를 표시하기 위해 MR/커밋을 되돌립니다 (컨트롤러는 나머지를 수행합니다).
3. 3 부록/기능
기능 플래그/킬 스위치: 위험한 경로를 즉시 끄십시오.
구성 요소 토글: 이전 설정 샷으로 돌아갑니다.
3. 4 데이터
롤 포워드 마이그레이션 (선호) + 호환성.
PITR (Point-In-Time Recovery) 및 사고 백업.
가역적 인 행동에 대한 보상 (Saga) 및 demempotency.
4) "확장 → 마이그레이션 → 계약" 패턴
롤백을 안전하게하려면 데이터 스키마를 사용하면 이전 버전과 새 버전을 공동으로 사용할 수 있어야합니다.
1. 확장 - 이전 논리를 깨뜨리지 않고 새 필드/인덱스 (무효화) 를 추가합니다.
2. 마이 그레이트-이중 쓰기/읽기, 백 필, 배경 작업
3. 계약-100% 종료 및 지속 된 창 후에 이전 필드/코드를 삭제합니다.
5) SLO 게이팅 및 자동 롤백
각 릴리스 단계의 입구는 측정 항목에 의해 "보호" 되어야합니다.
기술 SLO: p95/p99 대기 시간, 5xx 속도, 채도 (CPU/메모리), 오류 예산 연소.
사업 지표: 예금/현금 인출, 지불 거부, 사기 비율, KYC 오류.
- 5xx> 0. 5% 10 분 → 롤백.
- 기준선 → 의 p95 TP> 20% 는 + 분석을 보유합니다.
- PSP 오류> 0. 3 p.p. → 롤백 + 스위칭 결제 경로.
6) 예: Kubernetes/Helm/Argo/NGINX
6. 1 청록색 (K8 서비스 선택기)
yaml
Service points to "blue"; switch to green - change selector apiVersion: v1 kind: Service metadata: {name: app-svc}
spec:
selector: { app: app, version: blue }
ports: [{ port: 80, targetPort: 8080 }]
롤백 = 선택기를 '파란색' (원자, 재 조립 없음) 으로 되돌립니다.
6. 2 카나리아 (Istio VirtualService
yaml http:
- route:
- destination: { host: app, subset: stable } # 100 weight: 100
- destination: { host: app, subset: canary } # 0 weight: 0
롤백 = 무게 카나리아 → 0, 안정 → 100.
6. 3 아르고 롤 아웃-중단
yaml kubectl argo rollouts abort app # stop and return to stableService
6. 4 Helm-개정판으로의 롤백
bash helm history app -n prod helm rollback app 17 -n prod # revert to revision 17
6. 5 NGINX-업스트림 무게
nginx upstream app {
server blue:8080 weight=100;
server green: 8080 weight = 0; # rollback - return 100/0
}
7) "낙하산" 으로서의 기능 플래그 및 킬 스위치
고위험 흐름 (예금/지불/보너스) 에 대한 킬 스위치-필수.
끈적 끈적함: 해시 키를 통해 사용자에게 "변형" 을 할당-예측 가능한 비교.
실패: 플래그 서버를 사용할 수없는 경우 기본값으로 안전합니다.
ts const enabled = flags. bool("new_cashout_flow", false);
if (! enabled) return classicFlow () ;//instant rollback - disable the return newFlow () flag;
8) API 및 이벤트 계약: "롤백을 끊지" 않는 방법
Versioning 계약 (OpenAPI/gRPC/Avro): 새 버전은 필드를 추가하고 이전 버전의 의미를 변경하지 않습니다.
이벤트 버전: '유형 = v2', 소비자는 알 수없는 필드를 무시해야합니다.
전화 번호 + 이데올로기: 이벤트의 반복은 안전하며 소비자는 유쾌합니다.
9) 오프셋 거래 (사가)
"하드" 상태 롤백 (돈 남음, 편지 발송) 이없는 경우 보상을 사용하십시오
게시 된 상각-보상: 반품, 반전, 수정 기록.
성공하기 전에 보상 운영 및 복귀 저널에 기록.
각 작업에 대한 이데올로기 키.
json
{
"sagaId": "b7d2...",
"action": "withdraw. execute",
"idempotencyKey": "user123:withdraw:7845",
"compensation": "withdraw. refund"
}
10) 구성 및 비밀: 버전으로 롤백
버전 아티팩트 (세머/커밋 샤) 로 저장합니다.
Rolback = "손으로 고치십시오" 가 아니라 이전 버전 (GitOps return) 으로 설정을 되돌립니다.
비밀-저장을 통한 비밀 (KMS/Vault); 회전 및 버전 지정이 릴리스에 포함됩니다.
11) 롤백 런북 (최소)
1. 일시 정지 진행 (카나리아/롤아웃).
2. 트래픽 반환 (가중치/선택기).
3. SLO/비즈니스 메트릭 검사는 기준선으로 돌아 왔습니다.
4. 배경 작업의 안정화 (필요한 경우 마이그레이션 중지/백 필).
5. 사고 및 사후 사실: 아티팩트 (로그/트레일/메트릭), 가설, 수정.
6. 청소: 플래그 닫기, 왼쪽 코드 제거, 작업 일정 반환.
12) 자동 보호 정책
이미지에 대한 '최신' 및 변경 가능한 태그를 금지합니다.
입학 통제: 서명 된 아티팩트 만.
CI 게이트: SAST/SCA/정책 점검은 승진을 위해 녹색이어야합니다.
동결 창: 위험 기간 동안 릴리스/가중치> X% 가 없습니다.
13) 빈번한 반 패턴
긴 잠금/다운 타임 인 호환성 대신 DDL베이스를 "롤백" 합니다.
demempotency 및 back-fill이없는 즉각적인 헤드 투 헤드 마이그레이션.
"배달" 과 "포함" 을 혼합하면 트래픽을 빠르게 반환 할 수있는 방법이 없습니다.
감사없이 생산 설정에서 수동 편집.
결제/출력에 대한 킬 스위치가 없습니다.
prod의 아티팩트를 다시 작성하십시오 ("빌드 한 번-많이 실행" 위반).
작동하지 않는 단일 롤백 버튼/런북이 없습니다.
14) 구현 점검표 (0-45 일)
0-10 일
주요 서비스에 Blue-Green/Canary를 포함 시키십시오.
'최신' 거부, 이미지 서명 및 Helm/Argo 기록 활성화.
SLO 보드 (대기 시간, 5xx, 주요 비즈니스 신호) 를 연결합니다.
11-25 일
위험 흐름에 대한 킬 스위치를 구현하십시오.
확장 마이그레이션 계약 + demempotency로 데이터베이스 마이그레이션을 변환합니
SLO (Argo Analysistemple/alerts) 로 자동 정지/롤백을 추가하십시오.
26-45 일
Versioning configs (GitOps), MR 역전을 통한 롤백.
런북을 "게임 데이" (사고 및 롤백 시뮬레이션) 로 실행하십시오.
하향 롤백이 불가능한 경우 Saga 보상을 입력하십시오.
15) 성숙도 지표
롤백 MTTR: 대상 <5 분.
롤백 = 경로/플래그 스위치 (재구성 없음)> 90% 인 릴리스의%.
확장 마이그레이션 계약 마이그레이션의 비율> 90%.
플래그가> 95% 인 킬 스위치 서비스 적용
호환되지 않는 체계/계약으로 인한 사고 수 → 0.
16) 응용 프로그램: 미니 템플릿
아르고 분석 템플릿 5xx 중지
yaml apiVersion: argoproj. io/v1alpha1 kind: AnalysisTemplate metadata: { name: guard-5xx }
spec:
metrics:
- name: http_5xx_rate interval: 1m successCondition: result < 0. 005 provider:
prometheus:
address: http://prometheus. monitoring:9090 query:
sum(rate(http_requests_total{app="app",status=~"5.."}[5m])) /
sum(rate(http_requests_total{app="app"}[5m]))
Kubernetes: 배포의 빠른 롤백
bash kubectl rollout undo deploy/app -n prod
헬름: 원자 방출
bash helm upgrade --install app chart/ \
--atomic \
--timeout 5m \
--set image. tag=v1. 9. 3
NGINX: 카나리아 크레인
nginx map $cookie_canary $weight {
default 0;
"~ on" 10; # enable 10% by cookie
}
17) 결론
신뢰할 수있는 롤백은 "화재 버튼" 이 아니라 불변의 아티팩트, 전달 및 포함 분리, 호환 가능한 데이터 체계, 기능 플래그 및 SLO 게이팅과 같은 아키텍처의 속성입니다. 빌드 원자 릴리스, 런북 연습 및 보안 게이트 자동화-모든 릴리스는 비즈니스 및 사용자에게 고통없이 몇 분 안에 가역적입니다.