사이트 신뢰성 엔지니어링

created : Sun, 16 Oct 2022 17:00:35 +0900
modified : Sun, 03 Dec 2023 22:26:48 +0900
sre

1. 소개

서비스 관리에 대한 구글의 해법: 사이트 신뢰성 엔지니어링

SRE의 신조

지속적으로 엔지니어링에 집중한다.

서비스의 안정성을 유지하면서 변화를 최대한 수용한다.

모니터링

긴급 대응

변화 관리

수요 예측과 수용 계획

프로비저닝

효율성과 성능

2. SRE 관점에서 바라본 구글의 프로덕션 환경

하드웨어

하드웨어를 조율하는 시스템 소프트웨어

머신 관리하기

저장소

네트워킹

기타 시스템 소프트웨어

잠금 서비스

모니터링과 알림

소프트웨어 인프라스트럭처

개발 환경

II. 원리와 원칙들

3. 위험 요소 수용하기

위험 요소 관리하기

서비스 위험 측정하기

서비스의 위험 수용도

소비자 대상 서비스의 위험 수용도 정의하기

인프라스트럭처 서비스의 위험 수용도 정의하기

에러 예산 활용해보기

에러 예산 산정하기

장점

핵심 인사이트

4. 서비스 수준 목표

서비스 수준 관련 용어

지표 설정

척도 수집하기

합산하기

척도의 표준화

목표 설정에 대한 실습

목표 설정하기

목표치 선택하기

측정하기

SLO는 기대치를 설정하는 것

5. 삽질은 이제 그만

삽질의 정의

삽질이 줄어들면 좋은 이유

엔지니어링에 해당하는 업무

삽질은 무조건 나쁜 것일까?

6. 분산 시스템 모니터링

정의

왜 모니터링해야 하는가?

모니터링에 대한 적절한 기대치 설정하기

증상과 원인

블랙박스와 화이트 박스

네가지 결정적인 지표

마지막 요청(혹은 실행과 성능)에 대한 고려

적당한 측정 방법 선택하기

더욱 단순하게가 아니라 최대한 단순하게

지금까지 살펴본 원리들을 결합하기

장기적 모니터링

7. 구글의 발전된 자동화

자동화의 가치

구글 SRE의 가치

스스로를 이롭게 하라: 몽땅 자동화하자!

신의 한 수: 클러스터 턴업의 자동화

신뢰성은 근본적인 기능이다

8. 릴리즈 엔지니어링

릴리즈 엔지니어의 역할

릴리즈 엔지니어링의 철학

지속적 빌드와 배포

설정 관리 기법

릴리즈 엔지니어링을 처음부터 도입하라

9. 간결함

시스템의 안정성 vs. 신속함

지루함의 미덕

내 코드는 절대 포기하지 않을꺼야!

부정적 영향을 미치는 코드의 지표

최소한의 API

모듈화

릴리즈의 간소화

III. 사례

10. 시계열 데이터에 대한 실용적인 알림

시계열 데이터를 위한 저장소

모니터링 토폴로지의 샤딩

블랙박스 모니터링

설정의 유지보수

11. 비상대기

비상 대기 엔지니어의 삶

비상 대기 업무의 균형 맞추기

품질 균형

보상

안전에 대해 고려하기

부적절한 운영 부하에서 벗어나기

12. 효과적인 장애 조치

이론

실전

부정적인 결과의 마법

처방

조금 더 수월하게 장애를 조치하기

13. 긴급 대응

지난일로부터 배우기. 그리고 반복하지 않기

14. 장애 관리하기

미흡한 장애 처리

장애 관리 절차의 기본 요소들

언제 장애를 선언할 것인가?

요약

15. 포스트모텀 문화: 실패로부터 배우기

16. 시스템 중단 추적하기

17. 신뢰성을 위한 테스트

전통적인 테스트

프로덕션 테스트

테스트 및 빌드 환경 구성하기

대규모 환경에서의 테스트

재해 테스트

지금 필요한것은 스피드

프로덕션 환경에 배포하기

테스트는 얼마든지 실패할 수 있다.

통합

프로덕션 환경 조사하기

18. SRE 조직의 소프트웨어 엔지니어링

SRE 조직의 소프트웨어 엔지니어링 역량이 중요한 이유

전통적인 수용량 계획

  1. 수요 예측의 수집
  2. 빌드 및 할당 계획의 수립
  3. 리뷰 및 계획의 승인
  4. 배포 및 자원 설정

의도 기반 수용량 계획

의도를 파악하기 위한 선행 작업

인식의 제고 및 도입의 촉진

SRE 조직에서 소프트웨어 엔지니어링을 육성하는 방법

목표 이루기

19. 프론트엔드의 로드밸런싱

모든 일을 힘으로만 해결할 수는 없는 법

DNS 를 이용한 로드밸런싱

가상 IP 주소를 이용한 로드밸런싱

20. 데이터센터의 로드밸런싱

이상적인 사례

양호하지 않은 태스크 구별하기: 흐름 제어와 레임덕

양호하지 않은 태스크를 식별하는 간단한 방법: 흐름 제어

양호하지 않은 태스크를 식별하는 확실한 방법: 레임덕 상태

서브셋을 이용한 연결 풀 제한하기

적절한 서브셋 선택하기

서브셋 선택 알고리즘: 랜덤 서브셋

로드밸런싱 정책

21. 과부하 처리하기

초당 쿼리 수의 함정

사용자별 제한

클라이언트 측에서의 사용량 제한

중요도

활용도에 대한 신호들

과부하 오류 처리하기

재시도 여부 결정하기

연결에 대한 부하

22. 연속적 장애 다루기

연속적 장애의 원인과 그 대책

서버 과부화

자원의 부족

서비스 이용 불가

서버 과부하 방지하기

큐 관리하기

부하 제한과 적절한 퇴보

재시도

지연응답과 마감기한

느긋한 시작과 콜드 캐싱

항상 스택의 아래쪽을 살펴보자

연속적 장애의 발생 요인

연속적 장애 테스트하기

사용량이 높은 클라이언트 테스트하기

상대적으로 덜 중요한 백엔드 테스트

연속적 장애를 처리하기 위한 즉각적인 대처

23. 치명적인 상태 관리하기: 신뢰성을 위한 분산에 대한 합의

합의는 왜 필요할까: 분산 시스템 감 협업의 실패

분산에 대한 합의가 동작하는 방식

분산 합의를 위한 시스템 아키텍처 패턴

신뢰할 수 있는 복제된 상태 머신

분산 합의의 성능

읽기 작업 부하의 확장

과반수 임대

분산 합의 성능과 네트워크 지연응답

성능에 대한 고려: Fast Paxos

안정적 리더
일괄처리
디스크 접근

분산 합의 기반 시스템의 배포

복제 서버의 수

복제 서버의 위치

수용량과 로드밸런싱

분산합의 시스템 모니터링

24. 크론을 이용한 분산된 주기적 스케줄링

크론

신뢰성 관점에서의 크론

크론 작업과 멱등성

대용량 시스템 내에서의 크론

인프라스트럭처의 확장

요구사항의 확장

구글에서 구현한 크론 서비스

크론 작업의 상태 주적하기

25. 데이터 처리 파이프라인

파이프라인 디자인 패턴의 기원

단순한 파이프라인 패턴을 적용한 빅데이터의 기본적인 효과

정기적 파이프라인 패턴의 과제

작업의 불균형 분산으로 인해 발생하는 문제

분산 환경에서 정기적 파이프라인의 단점

정기적 파이프라인의 문제점 모니터링하기

‘천둥 소리’ 문제

모이어 부하 패턴

구글 워크플로우

모델-뷰-컨트롤러 패턴에 응용

비지니스의 지속성 보장하기

Chatper 26. 데이터 무결성: 내가 기록한 그대로 읽을수 있어야한다.

데이터 무결성의 중요한 조건

최상의 데이터 무결성을 위한 전략의 수집

백업과 보관

클라우드 환경에 대한 거시적 요구사항

데이터 무결성과 가용성을 유지하기 위한 구글 SRE의 목표

데이터 무결성은 의미이며, 데이터 가용성은 목표이다.

백업 시스템보다 복구 시스템을 제공하자

데이터 유실을 유발하는 장애의 종류들

더 깊고 폭넓은 데이터 무결성 관리의 어려움

구글이 데이터 무결성의 문제를 해결하는 방법

데이터 무결성 장애가 발생할 수 있는 24가지 조합

첫 번째 계층: 소프트 삭제

두 번째 계층: 백업 및 그와 관련된 복구 방법들

가장 중요한 단계: 복제

1T vs. 비교: ‘단순히’ 더 큰 백업만을 의미하지 않는다.

세 번째 계층: 조기 발견

대역 외 데이터 검증

데이터 복구의 동작 여부 확인하기

데이터 무결성과 관련된 SRE의 일반 원리들

초심자의 마음가짐

신뢰하되 검증하라

희망은 전략이 아니다

다중 방어 조치

결론

27. 대용량 환경에서의 신뢰할 수 있는 제품 출시

출시 조율 엔지니어링

제품 출시에 대한 LCE팀의 역할

출시 절차 마련하기

출시 확인목록

집중과 간소화 진행하기

예상치 못한 제품의 출시

출시 확인목록 개발하기

아키텍처와 의존성

통합

수용량 계획

장애 모드

클라이언트 동작

절차와 자동화

배포 절차

외부 의존성

발표 계획

안정적인 출시를 위한 기법들

점진적이고 단계적인 출시

기능 플래그 프레임워크