이번달 8일과 9일에 열린 China.NET Conf 2019, 중국 .NET 개발자 컨퍼런스에 참석하고 기술 주제인 《.NET 아키텍처에서의 카오스 엔지니어링 실천 방안》을 발표하여 광범위한 .NET 개발자 커뮤니티에 고가용성 개선 방법을 소개할 기회를 얻었습니다. 컨퍼런스 후 모임에서 천지절 선생님께 각자의 발표 내용을 커뮤니티에 공유할 것을 권유하셨습니다. 따라서 오늘 저의 기술 주제 《.NET 아키텍처에서의 카오스 엔지니어링 실천 방안》을 여러분과 공유하고자 합니다.
이번 발표는 주로 네 부분으로 나뉩니다:
- .NET 분산, 마이크로서비스 아키텍처에서의 고가용성 과제
- 카오스 엔지니어링 소개
- .NET 환경에서의 카오스 엔지니어링 실천 및 성과 공유
- 전망 및 계획
1. .NET 분산, 마이크로서비스 아키텍처에서의 고가용성 과제
현재 저희 기술 아키텍처는 분산형이며 마이크로서비스화되어 있으며, 1000대 이상의 서버가 온라인으로 운영되고 있어 고가용성 보장에 큰 압박이 가해지고 있습니다:
- 시스템은 7*24시간 운영되어야 하며, 다운 타임이 발생하면 전국민의 이동에 직접적인 영향을 미칩니다;
- 시스템 SLA 요구사항은 99.95%로, 연간 다운 타임은 4.38시간만 허용됩니다;
- 서비스 호출 체인이 점점 길어지고 의존성이 복잡해지면서, 특정 부분에서 문제가 발생하면 서비스 쇼크 대규모 다운 타임을 유발할 수 있습니다;
- 온라인에서 발생하는 문제들: 네트워크 지연, 메모리 누수, 스레드 차단, CPU 과부하, 데이터베이스 과부하, 미들웨어 다운 타임 등 난해한 문제들;
- 매일 수십 회의 배포 업데이트로 인해 시스템 고가용성 보장에 큰 부담이 있습니다;
전체 호출 체인 모니터링 도표는 저희 시스템의 복잡성을 보여줍니다:
예를 들어 호스트 CPU 과부하 문제는 온라인에서 자주 발생합니다:
다양한 고가용성 문제를 경험한 후 많은 반성과 요약을 했습니다:
분산형, 마이크로서비스화를 구현한 후, 우리는 시스템의 정상적인 운영을 보장하기 위해 얼마나 확신이 있을까요?
문제가 발생하면 분산 시스템은 매우 "혼란스러워"질 수 있으며, 대규모 다운 타임을 유발할 수도 있습니다.
따라서 온라인 사고 발생 전에 시스템의 취약점과 문제를 사전에 식별하고 시스템의 고유한 카오스를 통제할 필요가 있습니다.
이러한 시스템 고유 카오스를 통제하는 방법과 체계가 바로 오늘 소개할 주인공인 카오스 엔지니어링입니다.
2. 카오스 엔지니어링 소개
1. 카오스 엔지니어링이란 무엇인가요?
<strong>통제된 실험을 통해 시스템 운영 행동을 파악하는 과정을 카오스 엔지니어링이라고 합니다.</strong>
카오스 엔지니어링의 전형적인 실천: Chaos Monkey 시스템 안에서 어지럽게 돌아다니며 문제를 일으키는 원숭이가 시스템을 다운시킬 때까지 계속해서 문제를 일으킵니다.
2. 왜 카오스 엔지니어링이 필요한가요?
카오스 엔지니어링은 전체 시스템의 탄력성을 향상시킬 수 있습니다. 카오스 실험을 통해 시스템의 취약한 측면을 발견하고, 주도적으로 이러한 문제를 발견하여 해결할 수 있습니다.
3. 카오스 엔지니어링을 어떻게 실천하나요?
카오스 엔지니어링의 일반적인 실행 단계:
<strong>1. 시스템이 정상적으로 운영될 때 측정 가능한 지표를 선택하여 기준 "안정 상태"로 설정
2. 카오스 실험을 실험군과 대조군으로 나누어 모두 시스템의 "안정 상태"를 유지
3. 실험군에 서비스 불가능, 미들웨어 다운 등 카오스 이벤트 주입
4. 실험군과 대조군의 "안정 상태" 차이 비교</strong>
만약 카오스 실헉 전후 시스템의 "안정 상태"가 일치한다면, 시스템이 이러한 카오스 이벤트에 대해 탄력적이고 고가용성이라고 볼 수 있습니다. 반대로 시스템의 안정 상태가 깨졌다면, 우리는 시스템의 약점을 찾은 것이며, 이를 가능한 한 해결하여 시스템의 고가용성을 향상시킵니다.
4. 카오스 엔지니어링 실행을 위한 권장 원칙
- 시스템이 안정적으로 운영되는 상태(지표)를 명확히 하세요
- 카오스 이벤트는 현실에서 발생할 수 있는 것(합리적인)이어야 합니다
- 프로덕션 환경에서 카오스 실험 수행: 프로덕션 환경은 시스템의 안정성을 실제로 반영할 수 있습니다
- 지속적 통합: 온라인 애플리케이션이 매일 업데이트되므로 지속적 통합 방식을 통해 문제를 지속적으로 발견하고 해결할 수 있습니다
- 영향 범위 최소화: 온라인에서 카오스 실험을 수행할 때 반드시 통제 가능해야 하며, 카오스 실험의 최소 영향 범위를 설정해야 합니다
여기서 질문이 생길 것입니다: 프로덕션 환경에서 카오스 실험을 할 수 있을까요?
5. 실제 환경에서의 카오스 엔지니어링
프로덕션 환경은 반드시 안정성을 전제로 해야 하므로, 오프라인 연습과 온라인 검증을 결합한 O2O 모델의 카오스 실험이 권장됩니다: 시스템이 대규모 고가용성 개조를 거치기 전에는 먼저 포괄적인 오프라인 연습을 수행하는 것을 권장합니다:
그렇다면, .NET 기술 아키텍처에서 카오스 엔지니어링을 어떻게 구현할까요?
3. .NET 카오스 엔지니어링 실천 및 성과 공유
저희 온라인 시스템은 주로 다음과 같은 .NET 기술 스택과 오픈 소스 기술을 사용합니다:
- ASP.NET MVC
- ASP.NET Core 기반 Web 실행 프레임워크 - WRF
- ASP.NET Web API 기반 분산 서비스 게이트웨이 - SG
- .NET RPC 통신 기술 기반 분산 마이크로서비스 플랫폼 - HSF
- RabbitMQ 및 Kafka 기반 메시지 애플리케이션 센터 - MAC
- iBatis.NET & Entity Framework
- RabbitMQ & RabbitMQ Client for .NET
- Kafka & Confluent.Kafka
- Redis
- Nginx
- …
위와 같은 .NET 기술 아키텍처에서, 우리는 다양한 카오스 엔지니어링 이벤트를 정리했습니다:
많은 카오스 실험을 통해 우리는 점차 시스템 고가용성을 향상시키는 방법론과 체계를 구축했습니다:
.NET 기술 아키텍처에서의 고가용성 개선 - 의존성 관리, 장애 격리
비즈니스 시나리오: 비즈니스 복잡도가 증가함에 따라 서비스 호출 체인이 점점 길어지고 체인 상에 많은 통제 불가능한 요소가 존재합니다:
-
- 네트워크 지연으로 인한 서비스 이상
- Redis, MQ, DB 등 미들웨어 불가능으로 인한 서비스 시간 초과, 이상
- 의존하는 서비스 불가능으로 인한 서비스 호출자 직접 영향
대응 방법: 강약 의존성을 식별하고, 약한 의존성에 대해 격하 처리를 하며, 강한 의존성은 제한적인 격하를 수행
-
- "사용자 인지"가 강한 의존성
- "사용자 미인지"가 약한 의존성
- 장애 발생 시 핵심 비즈니스에 손실이 있는 것이 강한 의존성, 손실이 없는 것이 약한 의존성
.NET 기술 아키텍처에서의 고가용성 개선-**분리/격리
비즈니스 시나리오: 핵심 비즈니스 호출 체인이 매우 길며, 전체 체인에는 주요 프로세스와 보조 프로세스가 포함됩니다 보조 프로세스의 중요도가 낮으므로 보조 프로세스의 불가능으로 인해 주요 프로세스가 영향을 받아서는 안 됩니다.
대응 방법:
**.NET 기술 아키텍처에서의 고가용성 개선-시간 초과 관리
비즈니스 시나리오: 서비스 시간 초과에 대해, 장시간 대기는 사용자 경험에 영향을 미치며, 동시성이 높을 경우 스레드 풀이 과부하될 수 있습니다. 동시에 서비스 연쇄 반응을 유발하여 대규모 서비스 쇼크를 유발할 수 있습니다.
대응 방안: 시간 초과 설정: 서비스가 처음 상장될 때, 부하 테스트 상황에 따라 예상 값을 설정할 수 있습니다; 서비스가 상장된 후 실제 모니터링에 따라 수정하며, 예를 들어 99%의 요청 응답 시간을 시간 초과 시간으로 설정할 수 있습니다. 시간 초과 후 처리 전략: 핵심 서비스가 아니라면 직접 시간 초과로 실패를 반환할 수 있습니다. 핵심 서비스라면 해당 재시도 횟수를 설정할 수 있습니다.
예시: 서비스 시간 초과 시간 설정 HTTP 요청 시간 초과 설정 데이터베이스 연결 시간 초과, SQL 실행 시간 초과 코드 시간 초과 제어(예: Polly의 Timeout 전략)
**.NET 기술 아키텍처에서의 고가용성 개선-재시도 보상
비즈니스 시나리오: 실제 온라인 애플리케이션에서 네트워크 지연, 배포 재시작, 데이터베이스 차단 시간 초과 등의 상황이 발생하면 서비스 호출 실패를 유발할 수 있습니다.
대응 방안: 실패 재시도, 이후 보상을 통해 비즈니스 가용성을 최대한 보장합니다. 재시도 경우: 비즈니스는 멱등성을 보장하고 최종 일관성을 보장해야 합니다.
예시: 서비스 실패 재시도 전략 메시지 전송, 소비 실패 재시도, 보상 코드 수준 실패 재시도 보상(예: Polly의 Retry 전략)
고가용성 개선에는 더 많은 기술이 있지만, 여기서는 상세히 설명하지 않겠습니다.
시스템에 대한 포괄적인 고가용성 개선을 통해 온라인 시스템에 대한 우리의 자신감이 향상되었습니다!
4. 전망 및 계획
2019년, 우리는 카오스 엔지니어링 실천을 시작하여 점차 카오스 엔지니어링의 자체 방법론과 체계를 구축했습니다. 거의 1년간의 카오스 엔지니어링 실천을 통해 카오스 엔지니어링 문화가 점차 개발 팀에 의해 인정받고 있습니다. 현재 카오스 엔지니어링은 점차 온라인 프로덕션 환경으로 확대되고 있습니다(충분한 자신감과 확신에서 비롯됨). 하지만 이는 시작에 불과하며, 미래에는:
- 공식적인 카오스 엔지니어링 팀: 다중 팀 협력을 통해 자원의 지속적인 투보 보장
- 모든 핵심 핵심 애플리케이션 커버리지: 카오스 엔지니어링을 각 제품에 깊이 적용
- O2O 카오스 엔지니어링 실천 지속: 오프라인 연습, 온라인 검증으로 더욱 통제 가능
- 카오스 이벤트 주입 도구: ChaosBlade for .NET, 도구를 통해 카오스 엔지니어링을 더욱 효율적으로
- 지속적인 카오스 실험: 지속적으로 진행하고 지속적으로 개선
목표: 카오스 엔지니어링을 통해 문제를 발견하고 해결하고, 폐쇄 루프를 형성하여 시스템 고가용성을 지속적으로 향상시킵니다.
이상이 China.NET Conf 2019의 기술 주제 내용입니다.