안녕하세요. 오늘은 '사이트 신뢰성 엔지니어링' 이란 책을 읽으며 '구글의 포스트모텀'이란 문화를 소개 시켜드리려 합니다.

포스트모텀이란 ?

포스트모텀은 장애 발생 후에 이를 분석하고 개선점을 도출하는 과정으로, 일종의 회고문서와 유사한 개념입니다.

이 과정을 통해 향후 비슷한 문제의 재발을 예방하고 시스템을 강화하는데 도움이 됩니다.

포스트모텀을 진행할 경우, 일반적으로 구글 SRE 팀에서는 다음과 같은 사항을 문서로 기록합니다:

  1. 장애의 발생 기록(타임라인)과 그 영향: 장애가 발생한 시점부터 해결될 때까지의 시간 경과를 기록하고, 이로 인한 영향을 정확히 파악합니다. 이는 장애가 시스템 전반에 미친 영향을 이해하는 데 중요하죠.
  2. 장애를 완화하거나 해결하기 위한 수행한 작업: 장애를 해결하기 위해 수행한 모든 조치를 기록합니다. 이는 향후 유사한 문제에 대처할 때 참고 자료로 활용될 수 있습니다. ( 실제로 효과를 톡톡히 보고 있습니다 )
  3. 장애의 근본 원인과 근본 원인을 찾아가는 과정: 장애의 진짜 원인을 찾는 것이 중요합니다. 이를 통해 단순히 증상만 해결하는 것이 아니라, 시스템의 근본적인 문제를 해결할 수 있습니다.
  4. 재발 방지를 위한 후속 조치: 유사한 문제가 재발하지 않도록 예방하는 조치를 마련합니다. 이는 시스템의 안정성을 높이고, 사용자 경험을 향상시키는데 중요한 역할을 합니다.

 

이러한 포스트모텀 문서는 기록하는 것만으로 그치는 것이 아닌, 장애가 발생하게 된 원인에 대해 이해하며, 장애를 해결하기 위해 

취한 조치들이 향후 또다른 장애의 재발을 막는데도 유용하게 쓰기 위함입니다.

 

또한 , 시스템의 취약점을 고칠 수 있는 기회임과 동시에 더 견고하게 만드는 기회라고도 볼 수 있습니다. ( 시스템의 어느 부분을 어떻게 개선할 수 있는지에 대한 결과를 도출하면 더욱 좋겠죠 )

 

마냥 좋아보이는 문화이긴 하지만 주의할 점으로는, 문서를 작성함과 동시에 누군가의 실수도 드러날 수 있기 마련입니다. 그러나, 이것은 비난의 목적으로는 작성하지 말아야 합니다.

 누군가를 지적하거나 비난하는 분위기는 자칫 장애나 이슈를 숨기려는 문화를 만들 위험이 있으며, 이는 곧 속한 조직이나 회사에 더 큰 위험을 야기할 수도 있습니다.

 

그렇다면 포스트모텀은 어떤것을 어떻게 작성해야 좋을까요 ? 구글의 SRE팀에선 직접 정의한 템플릿을 사용하고 있습니다.

 

날짜: [포스트모텀 작성일]

작성자: [작성자 이름 혹은 팀 이름]

상태: [완료, 추가 조치 진행 중 등]

요약: [장애 발생에 대한 간략한 설명]

영향: [장애로 인한 영향에 대한 설명]

근본 원인: [장애의 근본적인 원인에 대한 분석]

발생 원인: [장애가 발생한 구체적인 원인]

해결책: [장애를 해결하기 위해 시행한 조치]

장애 탐지: [장애가 탐지되었던 방법 및 과정]

추가 조치: [장애 이후에 시행한 추가 조치]

회고:
- 잘 진행한 부분: [포스트모텀 과정에서 잘 수행된 부분에 대한 긍정적인 평가]
- 미흡했던 부분: [포스트모텀 과정에서 개선이 필요한 부분에 대한 비판적인 평가]

시간대별 조치사항: [장애 발생 시 시간대별로 취한 조치들에 대한 상세 기록]

추가 정보 및 참고: [필요한 경우 추가적인 정보나 참고 자료에 대한 기재]

 

이미 이러한 문화를 잘 갖추고 계시거나, 이와 비슷한 형식의 문서를 자연스럽게 작성하고 계실지도 모릅니다. ( 저 또한 그랬습니다 허허허 )

 

저 또한 사내에서 장애에 대한 문서가 위와 거의 유사한 형식으로 관리 되고 있었고, 위급 상황일 때도 해당 문서가 아주 많은 도움이 되었습니다.

 

그러다 우연히 책을 읽으며 유사한 내용을 보니 반갑기도 하고 , 뿌듯하기도 하네요 

 

그래서 좀 더 이런 좋은 문화를 널리 퍼뜨렸으면 하는 마음에 이렇게 글로 녹여내게 되었습니다. 

 

긴 글 읽어주셔서 감사합니다.

 

 

 

 

 

 

 

 

 

 

'이것저것' 카테고리의 다른 글

DevOps 면접 질문 및 (내) 답변  (0) 2023.07.29

1. 클라우드 컴퓨팅이란 무엇인가?

구성 가능한 컴퓨팅 자원(예: 컴퓨터 네트워크, 데이터 베이스, 서버, 스토리지, 애플리케이션, 서비스)에 대해 어디서나 접근 할 수 있는, 주문형 접근(on-demand availability of computer system resources)을 가능케하는 모델이며 최소한의 관리 노력으로 빠르게 예비 및 릴리스를 가능케 한다.

 

2. 스케일 아웃(Scale-out)과 스케일 업(Scale-up)의 차이를 설명하라.

인프라 업그레이드를 위한 두 가지 방안으로,

스케일 업은 기존 서버의 자원 및 성능을 보다 업그레이드 하는 것을 의미한다.

단 적인 예로, 자원 및 성능 증강을 목적으로 서버의 디스크를 직접 구매해 추가하거나 , 동일한 방법으로 CPU나 메모리를 추가로 장착해 업그레이드 시킨다.

 

스케일 아웃

기존 서버만으로 요청이나 성능의 한계가 도달했을 때, 서버를 더 증설해 처리할 수 있는 양을 더 늘리거나,

한 서버에 무리가 가지 않도록 부하를 분담 할 수 있다.

 

EC2 에서는 Auto Scaling 그룹이 있으며 ECS 클러스터 생성시 지정해줄 수도 있다. (최소 갯수, 최대 갯수 지정 가능)

스케일 아웃 기준은 로드밸런서 부하량, CPU 사용량, 메모리 사용량 등이 있으며 필요에 따라 선택할 수 있다.

3. MSA(Micro Service Architecture)의 개념을 설명하라.

마이크로서비스란 작고, 독립적으로 배포 가능한 각각의 기능을 수행하는 서비스이다.

마이크로서비스로 독립적으로 실행되는 각 서비스들은 서로의 서비스에 영향을 끼치지 않으며,

각각 배포 및 관리가 가능하고, 각각 다른 기술 스택(개발 언어, 데이터베이스 등)이 사용 가능하다.

리눅스 컨테이너 기술이 핵심이다.

 

4. MSA의 장점은 무엇인가? 기존 방식에 비해 어떤 Benefit을 가져올 수 있는가? 그리고 그에 따른 단점이나 리스크가 있는가?

각각 독립적으로 실행되는 서비스를 통해, 하나의 서비스가 장애를 일으켜도 SPoF(단일 장애점)을 회피 할 수 있고,

동일한 서비스를 컨테이너화하여 여러 환경에 배포 및 운영을 하며 고가용성을 유지 할 수 있다는 장점이 있다.

또한 서비스 별로 필요한 기술 스택을 달리 할 수 있다.

 

대표적인 단점으로는 수많은 마이크로 서비스를 관리할 수 있는 운영 도구가 있다지만, 실제로 서비스 간 통신이라던지 실제 요구 사항에 맞는 서비스를 분할하며 아키텍쳐를 설계한다는 게 단점인 것 같다. 또한 서비스 아키텍처에 대해 러닝커브가 높고 많아지면 많아질수록 전체 서비스에 대한 복잡도가 올라갈 수 있다.

 

5. 컨테이너란 무엇인지 설명하라.

소프트웨어 서비스를 실행하는 데 있어 , 필요한 특정 버전의 프로그래밍 언어 런타임 및 라이브러리와 같은 종속성과 애플리케이션 코드를 함께 포함하는 경량 패키지라고 할 수 있다.

 

운영체제 수준에서 호스트 OS의 커널을 통해 CPU, 메모리, 스토리지, 네트워크 리소스를 호스트 환경의 프로세스와 동일하게 취급당하며

또한 실행 환경에서 애플리케이션을 추상화 할 수 있는 논리 패키징 메커니즘을 제공한다.

 

6. 컨테이너를 위한 운영 환경에는 어떠한 것들이 있는가? 가장 많이 사용되는 것은 무엇인가?

대표적인 컨테이너 오케스트레이션 도구로는 도커 스웜, 쿠버네티스 , 도커 컴포즈가 있으며, 가장 많이 사용되는 것은 쿠버네티스라 할 수 있다.

7. 쿠버네티스가 가장 선호되는 이유가 무엇이라고 생각하는가?

아무래도 쿠버네티스는 주요 클라우드 서비스에서 매니지드 서비스 형태로 제공되는 게 큰 이유인 것 같다.

명령행 도구로 명령을 입력하기만 해도 여러 대의 노드를 갖춘 쿠버네티스 클러스터를 즉석에서 생성할 수 있기 때문이고, 또한 노드 역할을 하는 가상 머신의 관리까지 맡아준다. 또한 쿠버네티스에선 스웜과 달리 세세하게 설정할 수 있는 기능이 많기 때문이기도 하다. 예를 들어 블루-그린 배포나 자동 스케일링, 역할 기반 접근 제어 같은 기능을 쿠버네티스에 쉽게 적용이 가능하다.

8. 쿠버네티스 클러스터의 기본 아키텍처에 대해 설명하라.

마스터 노드와 워커 노드로 구성되며 마스터 노드는 배포할 서비스 스케줄링, 워커 노드 갯수 관리, API 엔드 포인트 제공 등을 담당하며,

워커 노드는 여러 개의 파드로 구성되며 각 파드는 여러 서버로 구성될 수 있고 각각 여러 컨테이너들을 함께 실행이 가능하다.

9. 모니터링 툴을 사용해본 적이 있는가? 있다면 그에 관해 설명하라.

오픈소스 APM으로 핀포인트를 사용해본 경험이 있다. 핀포인트는 애플리케이션의 코드에 직접 수정을 하지 않고, BCI ( Byte Code Instrumentation ) in Java로 클래스 로드 시점에 애플리케이션 코드를 가로채 성능 정보와 분산 트랜잭션 추적에 필요한 코드를 주입하는 것이었다. 그렇게 추적된 트랜잭션은 요청이 들어올 시 실시간으로 확인이 가능하며, 특정한 시간대에 모든 요청들의 샘플링도 할 수 있을 뿐더러,  콜스택을 자세하게 볼 수 있는것이 흥미로웠다.

10. 쿠버네티스에서 Auto Scaling의 원리에 대해 설명하라.

애플리케이션의 부하나 트래픽 증가에 따라 인스턴스 수를 동적으로 조절한다. 쿠버네티스는 주어진 조건으로 각 파드의 리소스 사용량을 모니터링하고 필요한 경우 파드의 복제본 수를 조절한다. 예를 들어 CPU 사용률이 높아지면 쿠버네티스 컨트롤 플레인은 파드의 복제본 수를 늘려서 자동으로 부하를 분산시켜준다. 이때 , 새로운 파드를 생성하거나 기존 파드를 삭제 할 수도 있다.

컨트롤 플레인이 스케일링 결정을 내린 후, 각 연결된 워커노드에 파드의 크기를 조절하는 작업을 수행한다.

 

 

질문 출처 : https://artist-developer.tistory.com/15

'이것저것' 카테고리의 다른 글

구글의 포스트 모텀 문화  (0) 2024.05.14

+ Recent posts