84
안정적인 서비스 운영 설계 에서 모니터링 까지 cybaek.com 2015.02-rev4

안정적인 서비스 운영 2014.03

Embed Size (px)

DESCRIPTION

2013년 NHN Entertainment 신입사원 교육을 위해서 시작한 강의로 현재는 사내 경력직 대상으로도 진행하는 교육입니다. 교육을 진행하면서 바뀐 내용은 계속 업데이트하고 있습니다. 피드백 환영합니다!

Citation preview

Page 1: 안정적인 서비스 운영   2014.03

안정적인 서비스 운영설계에서 모니터링까지

cybaek.com

2015.02-rev4

Page 2: 안정적인 서비스 운영   2014.03

스케일링

“Replacing all components of a car while driving it at 100mph”

- Instagram

Page 3: 안정적인 서비스 운영   2014.03

서버 한 대에서 시작

웹과 디비를 한 대에서 운영

| 쉽게 시작할 수 있지만,

| 원만한 운영 어려움

웹, 디비

Page 4: 안정적인 서비스 운영   2014.03

두 대의 서버

웹 서버 1대, 디비 서버 1대

| SPOF: 웹, 디비 뭐든 하나만 죽으면

디비

W W W

R R R

R R R

Page 5: 안정적인 서비스 운영   2014.03

세 대의 서버

웹 서버를 2대로 늘려서

디비

W W W

R R R

R R R

Page 6: 안정적인 서비스 운영   2014.03

세 대의 서버

로드밸런싱

| 두 서버에 트래픽을 ‘분배’

웹 웹

분배기

웹 웹

분배기

Page 7: 안정적인 서비스 운영   2014.03

세 대의 서버

고가용성

| 디비 구성의 예

장애 시에 대기 서버를 활용

트래픽을 분배하지는 않음

액티브 스탠바이

클라이언트

액티브 스탠바이

클라이언트

Page 8: 안정적인 서비스 운영   2014.03

세 대의 서버

로드밸런싱과 고가용성

| 가장 흔한 것이 L4

L7 헬스체크

| HAProxy

http://helloworld.naver.com/helloworld/284659

디비

L4

W W W

R R R

R R R

Page 9: 안정적인 서비스 운영   2014.03

세 대의 서버

로드밸런싱과 고가용성

| DNS RR을 이용

디비

DNS

W W W

R R R

R R R

Page 10: 안정적인 서비스 운영   2014.03

세 대의 서버

로드밸런싱과 고가용성

| 세션 공유

로그인 정보 등을 공유해야함

쿠키를 이용할 수도 . 데이터 양에 제한 웹

디비

L4

세션

W W W

R R R

R R R

Page 11: 안정적인 서비스 운영   2014.03

디비

L4

세션

W W W

R R R

R R R

로드밸런싱과 고가용성

| 웹 서버 로컬 디스크에 공유 정보를 저장할 수 없음

구글 앱엔진과 같은 자동 스케일링을 해주는 인프라의 중요 제한 사항

세 대의 서버

Page 12: 안정적인 서비스 운영   2014.03

세 대의 서버

로드밸런싱과 고가용성

| 두 서버간 컨텐트를 공유하려면,

DB

NAS/NFS

memcached, Redis,

nBaseArc

디비

L4

세션

공유 데이터

W W W

R R R

R R R

Page 13: 안정적인 서비스 운영   2014.03

L4에 대해 조금만 더

DSR(Direct Server Return) 모드

| L4가 양방향 프락시라면

모든 웹 서버가 받는 트래픽을 L4가 다 받아야함

디비

L4

세션

공유 데이터

W W W

R R R

R R R

Page 14: 안정적인 서비스 운영   2014.03

디비

L4

세션

공유 데이터

W W W

R R R

R R R

DSR(Direct Server Return) 모드

| 적당한 예

요청 패킷이 적은 케이스 . 일반적인 웹 요청 . 파일 다운로드

L4에 대해 조금만 더

Page 15: 안정적인 서비스 운영   2014.03

디비

L4

세션

공유 데이터

W W W

R R R

R R R

DSR(Direct Server Return) 모드

| 적합하지 않은 예

요청 패킷이 많은 케이스 . 파일 업로드와 같은 웹 요청

업로드 할 때는 L4를 거치지 않도록 예외처리 . SMTP

L4에 대해 조금만 더

Page 16: 안정적인 서비스 운영   2014.03

L4에 대해 조금만 더

대용량 파일 업로드

| 두 단계로 나눠 동작

웹 #1 웹 #2

L4

1.GET http://L4-IP/who

2. web-1 public IP

3. POST http://web-1/upload

웹 #3

Page 17: 안정적인 서비스 운영   2014.03

네 대의 서버

디비 서버를 한 대 더

| 마스터/슬레이브

디비마스터

L4

세션

공유 데이터

디비슬레이브

W W W

R R

R

W W W

R

R R

Page 18: 안정적인 서비스 운영   2014.03

디비마스터

L4

세션

공유 데이터

디비슬레이브

W W W

R R

R

W W W

R

R R

쓰기는 마스터에, 읽기는 두 대 모두에서

| 읽기 처리는 두 배로 증가 ;-)

| 써야할 양도 두 배로 증가 :-(

슬레이브 복제 트래픽

네 대의 서버

Page 19: 안정적인 서비스 운영   2014.03

디비를 계속 증설

마스터는 하나, 슬레이브는 +1...

디비마스터

L4

세션

공유 데이터

디비슬레이브

디비슬레이브

W W W

R

R

W W W

R

R

W W W

R

R

Page 20: 안정적인 서비스 운영   2014.03

디비마스터

L4

세션

공유 데이터

디비슬레이브

디비슬레이브

W W W

R

R

W W W

R

R

W W W

R

R

읽기 부하는 분산이 되나

복제 시간은 점점 늘어남

| 복제본이 늘어나 안정적이지만 낭비가 큼

| 복제 지연은 생각보다 심각

데이터 싱크 문제로 인해

정말 읽은 것이 맞는지 재차 확인하는 로직으로, 필요 이상의 조회 부하 발생

디비를 계속 증설

Page 21: 안정적인 서비스 운영   2014.03

클러스터링

| 데이터를 자동으로 분산 저장

| 노드간 재균형 작업

샤딩

| 데이터를 수동으로 분산 저장

| 분할된 데이터는 서로 연관관계가 없음

클러스터링과 샤딩

Page 22: 안정적인 서비스 운영   2014.03

디비마스터

L4

세션

공유 데이터

디비슬레이브

디비슬레이브

W W W

R

R

W W W

R

R

W W W

R

R

데이터를 특정 속성 중심으로 물리적 분할

| 분할된 데이터는 서로 조인을 하거나 참조가 발생해서는 안 됨

| 보통 userId, blogId, boardId 등을 사용

디비 파티셔닝/샤딩

Page 23: 안정적인 서비스 운영   2014.03

디비 파티셔닝/샤딩

데이터를 특정 속성 중심으로 물리적 분할

| 예, 메일

디비

To

cybaek

milk012

cybaek

From

steve

bill

jonny

Subject

아이패드 어때?

주말에 시간 있나요?

[요청] 디자인 좀 봐줘요.

cybaek milk012

웹웹

Page 24: 안정적인 서비스 운영   2014.03

디비 파티셔닝/샤딩

데이터를 특정 속성 중심으로 물리적 분할

| 사용자(군)별로 데이터를 분리

디비

To

cybaek

milk012

cybaek

From

steve

bill

jonny

Subject

아이패드 어때?

주말에 시간 있나요?

[요청] 디자인 좀 봐줘요.

cybaek milk012

웹웹

디비

cybaek milk012

To

cybaek

cybaek

From

steve

jonny

Subject

아이패드 어때?

[요청] 디자인 좀 봐줘요.

To

milk012

From

bill

Subject

주말에 시간 있나요?

웹웹

Page 25: 안정적인 서비스 운영   2014.03

디비 파티셔닝/샤딩

데이터를 특정 속성 중심으로 물리적 분할

| 테이블 분리를 디비 분리까지

디비

cybaek milk012

To

cybaek

cybaek

From

steve

jonny

Subject

아이패드 어때?

[요청] 디자인 좀 봐줘요.

디비

To

milk012

From

bill

Subject

주말에 시간 있나요?

웹 웹

Page 26: 안정적인 서비스 운영   2014.03

디비 파티셔닝/샤딩

데이터를 특정 속성 중심으로 물리적 분할

| 어떤 디비를 봐야할지 판단해야함

사용자별디비 위치

디비

cybaek milk012

To

cybaek

cybaek

From

steve

jonny

Subject

아이패드 어때?

[요청] 디자인 좀 봐줘요.

디비

To

milk012

From

bill

Subject

주말에 시간 있나요?

세웹

Page 27: 안정적인 서비스 운영   2014.03

사용자별디비 위치

디비

cybaek milk012

To

cybaek

cybaek

From

steve

jonny

Subject

아이패드 어때?

[요청] 디자인 좀 봐줘요.

디비

To

milk012

From

bill

Subject

주말에 시간 있나요?

세웹

디비 파티셔닝/샤딩

데이터를 특정 속성 중심으로 물리적 분할

| 어떤 디비를 봐야할지 판단해야함

매핑 디비 서버 . 데이터 이동이 유연하지만, 별도 서버 운영 필요

해쉬 함수 이용 . 별도 서버 없이 찾을 수 있으나, 데이터 분할 시 많은 데

이터를 이동해야할 수 있음

Page 28: 안정적인 서비스 운영   2014.03

셀 아키텍처

데이터를 특정 속성 중심으로 물리적 분할

| 웹과 디비 서버를 함께 사용자(군)별로 분리할 수도

디비

cybaek milk012

To

cybaek

cybaek

From

steve

jonny

Subject

아이패드 어때?

[요청] 디자인 좀 봐줘요.

디비

To

milk012

From

bill

Subject

주말에 시간 있나요?

웹 웹

Page 29: 안정적인 서비스 운영   2014.03

셀 아키텍처

데이터를 특정 속성 중심으로 물리적 분할

| 웹, 디비 서버 이중화

cybaek milk012

세웹

웹웹

웹디비cybaek 웹

디비milk012

Page 30: 안정적인 서비스 운영   2014.03

셀 아키텍처

데이터를 특정 속성 중심으로 물리적 분할

| 사용자(군)별 어느 디비에 있는지 정보 보관

cybaek milk012

세웹

웹웹

웹디비cybaek 웹

디비milk012

cybaek milk012

웹웹

웹웹

웹디비

cybaek 웹디비

milk012

웹사용자별디비 위치

Page 31: 안정적인 서비스 운영   2014.03

셀 아키텍처

데이터를 특정 속성 중심으로 물리적 분할

| 셀(Cell)!

cybaek milk012

웹웹

웹웹

웹디비

cybaek 웹디비

milk012

웹셀 디비

셀 셀

Page 32: 안정적인 서비스 운영   2014.03

셀 아키텍처

디비마스터

L4

세션

공유 데이터

디비슬레이브

디비슬레이브

디비(셀 정보)

#2

#3

#4

#1

W W W

R

R

W W W

R

R

W W W

R

R

W W W

R R R

R R R

W W W

R R R

R R R

W W W

R R R

R R R

Page 33: 안정적인 서비스 운영   2014.03

디비마스터

L4

세션

공유 데이터

디비슬레이브

디비슬레이브

디비(셀 정보)

#2

#3

#4

#1

W W W

R

R

W W W

R

R

W W W

R

R

W W W

R R R

R R R

W W W

R R R

R R R

W W W

R R R

R R R

셀 디비

| 분할된 데이터가 어디에 속하는지 참조

전체 사용자가 공통으로 참조

셀 디비, 로케이션 디비, 유저 디스커버리 서비스 등등의 용어 사용

셀 아키텍처

Page 34: 안정적인 서비스 운영   2014.03

디비마스터

L4

세션

공유 데이터

디비슬레이브

디비슬레이브

디비(셀 정보)

#2

#3

#4

#1

W W W

R

R

W W W

R

R

W W W

R

R

W W W

R R R

R R R

W W W

R R R

R R R

W W W

R R R

R R R

장점

| 셀 단위 스케일링

| 장애를 특정 셀로 고립 가능

| 프론트+백엔드 점진적 배포

일부 웹 서버만 선적용하는 것은 흔하고 쉽지만

디비가 변경되었을 때, 일부 웹 서버만 적용하는 것은 쉽지 않지만, 셀 아키텍처에서는 가능

셀 아키텍처

Page 35: 안정적인 서비스 운영   2014.03

디비마스터

L4

세션

공유 데이터

디비슬레이브

디비슬레이브

디비(셀 정보)

#2

#3

#4

#1

W W W

R

R

W W W

R

R

W W W

R

R

W W W

R R R

R R R

W W W

R R R

R R R

W W W

R R R

R R R

단점

| SPOF: 셀!

가장 심각한 문제

하지만 거의 정적인 데이터

| 많은 장비 필요

| 제공하는 기능에 따라 셀간 데이터를 조합해야할 수도

예, 페이스북의 현 계정 친구 정보를 스트림에 추가

셀 아키텍처

Page 36: 안정적인 서비스 운영   2014.03

디비마스터

L4

세션

공유 데이터

디비슬레이브

디비슬레이브

디비(셀 정보)

#2

#3

#4

#1

W W W

R

R

W W W

R

R

W W W

R

R

W W W

R R R

R R R

W W W

R R R

R R R

W W W

R R R

R R R

워드프레스

| 2^n개의 버켓(샤드)을 마련

가상의 버켓을 미리 많이 만들어 두고, 물리 버켓을 매핑

| 하나의 서버에서 운영하다가 용량이 차면 2대로 분할

또 차면 또 분할

셀 아키텍처

Page 37: 안정적인 서비스 운영   2014.03

디비마스터

L4

세션

공유 데이터

디비슬레이브

디비슬레이브

디비(셀 정보)

#2

#3

#4

#1

W W W

R

R

W W W

R

R

W W W

R

R

W W W

R R R

R R R

W W W

R R R

R R R

W W W

R R R

R R R

메일

| 웹 인터페이스

HTTP 리다이렉트를 이용하여 속한 셀로 전환 가능

| IMAP, POP3

프로토콜상 어느 셀에서나 모든 사용자 서비스 가능해야함

셀 아키텍처

Page 38: 안정적인 서비스 운영   2014.03

디비마스터

L4

세션

공유 데이터

디비슬레이브

디비슬레이브

디비(셀 정보)

#2

#3

#4

#1

W W W

R

R

W W W

R

R

W W W

R

R

W W W

R R R

R R R

W W W

R R R

R R R

W W W

R R R

R R R

몇 개의 셀이 적당

| 최소 2개

50:50? 10:90?! . 50:50 등분하면 점진적 배포를 적극 활용하기 어려움

위험이 있는 배포를 조금 선 배포하지 못하고 절반에 적용하게 됨

. 10:90과 같이 특정 셀을 작게 가져가면 점진적 배포에 유리

| 5개? 10개?

정책!

셀 아키텍처

Page 39: 안정적인 서비스 운영   2014.03

디비마스터

L4

세션

공유 데이터

디비슬레이브

디비슬레이브

디비(셀 정보)

#2

#3

#4

#1

W W W

R

R

W W W

R

R

W W W

R

R

W W W

R R R

R R R

W W W

R R R

R R R

W W W

R R R

R R R

IDC 분할

| 그렇게까지?

| 4개라면 IDC별 2개씩? 혹은 1개, 3개?

역시 정책!

셀 아키텍처

Page 40: 안정적인 서비스 운영   2014.03

디비 샤딩

Service

DB #1 DB #2

1. 기존과 동일하게 서비스에 접속http://mail.com/2. 해당 데이터가 어느 디비에

속해 있는지 질의

3. 속한 디비에 질의

Location Service

DB #1 DB #2

1. 기존과 동일하게 서비스에 접속http://mail.com/2. 해당 데이터가 어느 디비에

속해 있는지 계산

3. 속한 디비에 질의

Page 41: 안정적인 서비스 운영   2014.03

셀 아키텍처

Cell #1

Service

(샤딩한) 디비

Location

Cell #2

Service

(샤딩한) 디비

IntroService

1. 비로그인 상태에서 접속http://mail.com/

2. 로그인 후 접속을 받음

3. 어떤 셀에 속한지 물어봄

5. 해당 셀로 접속http://cell1.mail.com/

4. 어디로 redirect 할지 돌려줌

Page 42: 안정적인 서비스 운영   2014.03

스토리지 스케일링

분산파일시스템

| 복제본 수를 일률적으로 적용할 필요가 없음

요청이 많은 파일은 복제수 늘리고

보존 시한이 얼마 남지 않은 파일은 복제수 줄이고

| 중복 파일 처리

그냥 둘 것인가

줄일 것인가

Page 43: 안정적인 서비스 운영   2014.03

스토리지 스케일링

사용성에 따라

| 단위 디스크 크기와 서버의 디스크 베이 갯수

파일을 쌓아두기만 하는 아카이빙 용도인지 . 용량이 큰 디스크를

거의 전 파일에 거쳐 IO가 발생하는지 .빠른 디스크(혹은 SSD)를 많이 꽂아서

최근 파일만 주로 사용하는지 .최근 파일은 작은 디스크(혹은 SSD)로 구성한 서버를

사용하고 . 시간이 지난 파일은 용량이 큰 서버로 이전

Page 44: 안정적인 서비스 운영   2014.03

장비가 늘면서 생각할 고민들

빠른 배포

| 배포가 번거로운 일이 되면 안됨

페이스북 . BitTorrent 이용 . 사이트 업데이트에 15~30분 소요 .마이너 업데이트는 매일 .메이저 업데이트는 매주 한 번

Page 45: 안정적인 서비스 운영   2014.03

장비가 늘면서 생각할 고민들

빠른 롤백

| 빠른 배포보다 중요!

| 롤백 기준 사전 정의 필수

배포 장애시 우왕좌왕하면 안됨

즉각 해결을 못한다면 미련없이 롤백 .“10분이면 고칠 것 같아요”이런 말 믿지 말 것!

| 배포 전에, 롤백 때 필요한 작업 미리 준비

롤백 결정 후, 이런 저런 스크립트 만들면 때는 늦음

엔터 한 번으로 롤백이 되도록

Page 46: 안정적인 서비스 운영   2014.03

장비가 늘면서 생각할 고민들

설정 관리

| 모든 장비의 설정 내용이 같은가

설정 값을 바꿔가며 테스트 한 다음 그대로 방치하는 경우가 있음

| 배포

바이너리 배포 시 함께?

설정은 따로 리포지토리 관리?

Page 47: 안정적인 서비스 운영   2014.03

이제 속도!

Page 48: 안정적인 서비스 운영   2014.03

속도

두 배 빨라진다면

| 50% 하드웨어로 커버

Page 49: 안정적인 서비스 운영   2014.03

속도 개선

제일 첫 번째 작업은 프로파일링

| 절대로 감에 의존하지 말 것

| 어디가 느린지 파악하는 것이 우선

Page 50: 안정적인 서비스 운영   2014.03

속도 개선

해결책

| 캐쉬: memcached, Redis, nBaseArc …

각 레이어별 적용 가능 . 디비에서, WAS에서, 웹 서버에서 각각 캐쉬 가능

저장 방식 . 사용할 결과를 그대로 저장하거나

빠르나 많은 메모리 . 구조화하여 저장하거나

조금 느리지만 보다 효율적인 메모리 사용

Page 51: 안정적인 서비스 운영   2014.03

속도 개선

해결책

| 캐쉬: 지역성!을 고려해서 설계

시간적 지역성 . 한번 읽은 데이터를 곧 다시 읽을 수 있다. . LRU

공간적 지역성 . 읽은 곳 근처의 데이터를 접근하는 경우가 있다. . 프리페치(prefetch)

Page 52: 안정적인 서비스 운영   2014.03

속도 개선

해결책

| 증설

사용자가 늘었거나, 기능이 추가되어서 정말 증설이 필요할 수도 있음

증설은 죄가 아님

Page 53: 안정적인 서비스 운영   2014.03

속도 개선

해결책

| 정책변경

예, 조회 수가 꼭 정확해야하나? . 공유 저장소(memcached)에 기록하되, 일정 시간마다

디비에 기록 . 디비에 기록하기 전에 저장소가 비정상 종료된다면 일

부 조회수는 유실

이런 것을 정책으로 허용하느냐 마냐에 따라 구조가 달라짐 . 디비 기록 주기가 1분이고, 분당 1,000번 조회를 할 경우, 정책과 약간의 코드만으로 디비 UPDATE를 분당 1,000회에서 단 1회로 줄일 수 있음

Page 54: 안정적인 서비스 운영   2014.03

속도 개선

해결책

| 정책변경

조회 수 캐쉬(Write back)

번호

1023

글쓴이

cybaek

제목

steve가 보고 싶어요…

조회수

56

Key

1023

디비에 기록한 시각

2014/04/30 09:05:34

조회수

56

Value

1023번 글을 읽음

1023 cybaek steve가 보고 싶어요… 561023 2014/04/30 09:05:34 571분 뒤에 다시 읽음지금 - 09:05:34 > 5분 초과?

캐쉬 디비

1023 cybaek steve가 보고 싶어요… 561023 2014/04/30 09:05:34 583분 뒤에 다시 읽음지금 - 09:05:34 > 5분 초과?

1023 cybaek steve가 보고 싶어요… 591023 2014/04/30 09:11:06 592분 뒤에 다시 읽음지금 - 09:05:34 > 5분 초과!

Page 55: 안정적인 서비스 운영   2014.03

속도 개선

해결책

| 정책변경

WWDC, GoogleIO 티켓 구매 .최근 몇 년 초단시간에 매진을 기록 . 하지만 사이트는 먹통 .결국, 추첨해서 티켓 구매 기회를 주는 것으로 변경

Page 56: 안정적인 서비스 운영   2014.03

스토리지 속도

메모리

디스크 개수

| 1T x 1 vs 100G x 10

RAID 컨트롤러

| 정책

배터리 충전 중에는 디스크에 바로 쓰기(Battery Backup Write Cache) . 전원 공급이 갑자기 끊길 때 쓰기 유실을 최소화 하기

위한 드라이버 정책(조정 가능) . 하지만 이로 인해 디비 같은 경우 서비스 품질이 급락

Page 57: 안정적인 서비스 운영   2014.03

품질 관리

웹, WAS

| 각 URI별 응답속도 관리

평균과 표준편차 같이 관리

| 구간별 처리 속도 관리

주요 기능의 경우, URI 하나의 응답 속도를 더 쪼개서 내부 로직별 처리 속도를 기록

Page 58: 안정적인 서비스 운영   2014.03

품질 관리

read list write

search delete

Page 59: 안정적인 서비스 운영   2014.03

운영

서비스 오픈은 끝이 아니라 시작.

- ?

Page 60: 안정적인 서비스 운영   2014.03

메일 발송

생각보다 관리할 것이 많음

| 한 통 발송은 쉽지만,

책 예제 따라하면 됨

| 다량 발송은 손이 많이 감

코드의 문제가 아니라 운영 문제 . KISA 화이트IP 등록 . (업계가 21세기답게 돌아가지는 않음…)

Page 61: 안정적인 서비스 운영   2014.03

자동화

신규 서버 설치

| 장비를 받아, 10분 내에 설치할 수 있도록

| 방화벽 오픈 등이 빠른 대응에 걸림돌

애당초 C클래스 단위로 관리

일상적인 응용 배포

자동 복구

| 장애 시 루틴하게 하는 작업

예, 프로세스 재구동 등을 특정 조건일 때 자동으로 수행하도록

Page 62: 안정적인 서비스 운영   2014.03

배치 작업

필요한 기본 인프라

| 실패시 알림

| 과거 작업 이력 조회

| 여러 서버 묶어서 실행

Page 63: 안정적인 서비스 운영   2014.03

로그 처리

수집

| 주기는?

실시간 . Scribe: https://github.com/facebook/scribe

시간 단위

Page 64: 안정적인 서비스 운영   2014.03

백업

어떤 전략으로

| 주기는?

| 전체? 증분?

어떻게 복구

| 복구에 얼마나 걸리나

| 복구하는 동안 서비스는 유지? 정지? 읽기만?

Page 65: 안정적인 서비스 운영   2014.03

로그 처리

보관

| 얼마나 오랫동안 보관해야하나

정책의 문제

조회

| 얼마나 많은 범위의 데이터를, 얼마나 빠르게

잘 구축하면 고객문의 처리를 비개발자에게 이관 가능

보안

| 개인 정보 저장하지 않도록

Page 66: 안정적인 서비스 운영   2014.03

품질 관리

백엔드 서버간 처리

| 각 서버 구간별 처리 속도 관리

한 요청이 여러 서버를 활용할 때, 각 서버별 응답 속도 관리 . PINPOINT: https://github.com/naver/pinpoint

Page 67: 안정적인 서비스 운영   2014.03

품질 관리

디비

| DBA의 검수 필수

| 동적 쿼리를 없애도록

1개의 동적 쿼리는 생각보다 적은 N개의 정적 쿼리로 변경 가능 .쿼리 관리가 용이해지고 . 각 정적 쿼리마다 힌트를 정확하게 줄 수 있음

| 슬로우 쿼리 자동 검출

Page 68: 안정적인 서비스 운영   2014.03

모니터링

경고와 장애 수준 분리

| 대부분 장애 수준이 되고 나서야 알람을 받음

디스크 사용률 90%일 때 알람 .“이제 장애 납니다”라는 문자 받는 것 .평상 시 사용률 20%를 유지하고 있다면, 90%가 아니라

50% 수준에서 경고 알람을 받아야함

Page 69: 안정적인 서비스 운영   2014.03

모니터링

최저 값 모니터링

| 보통 데몬 개수가 N개를 넘을 때만 알람을 받음

데몬이 죽었다면 알람 안 옴

주기적으로 수치 점검

| 시스템의 기능과 사용자 수는 계속 변함

경고, 장애, 최저 값 세 수치는 주기적으로 리뷰해야함

Page 70: 안정적인 서비스 운영   2014.03

모니터링

테스트 활용하여 기능 체크

| 사용자 인터페이스 레벨의 테스트 모듈을 주기적으로 돌려, 서비스 상태 체크

무의미한 알람 받지 않도록

| 무시해도 되는 알람이라면 받지 않도록 설정

그런 알람 속에 진짜 경고 메시지가 묻힐 수 있음

Page 71: 안정적인 서비스 운영   2014.03

모니터링

연동 서비스/서버 모니터링

| 외부 API를 이용할 경우, 해당 API를 직접 체크

연동 서비스쪽 원인으로 발생한 장애를 빠르게 검출할 수 있음 . 연동 서비스의 응답 속도는 담당 서비스의 품질에도 영향을 줌

내가 직접 관리하는 서비스가 아니라고 방치해서는 안 됨

Page 72: 안정적인 서비스 운영   2014.03

시스템 유틸리티

필수

| vmstat, mpstat, iostat, netstat, free, top, sar, ping

Page 73: 안정적인 서비스 운영   2014.03

HTTP 에러 페이지 설정

50x

| 사용자들은 무의식적으로 새로 고침을 반복

별도 (정적) 서버로 리다이렉트 하도록 설정

Page 74: 안정적인 서비스 운영   2014.03

흔한 장애

로그

| DEBUG 레벨의 로깅

예, 로그를 껐더니 속도가 10배 향상

| 에러 로그를 안 봐서 키우는 장애

에러 로그 크기는 0이 정상

‘괜찮은 에러’는 에러가 아니니 에러 로그에 남기지 말 것

Page 75: 안정적인 서비스 운영   2014.03

흔한 장애

타임아웃

| 디폴트 값 사용 주의

보통 디폴트가 얼마인지도 모르고 사용

보통 10ms로 응답할 때, 응답이 1초 지연되면 동시 접속수는 100배가 됨

| 평균 응답 속도에 상응하는 타임아웃 설정

보통 5ms 이하로 응답할 때, 타임아웃이 2초가 적당?

| 단위 확인 필요

예, ms인 줄 알고 1000이라고 넘겼는데... sec

Page 76: 안정적인 서비스 운영   2014.03

흔한 장애

트래픽

| 한 달 전부터 늘고 있었는데

에러 핸들링

| 소스코드에서 return 값 제대로 확인하지 않고

Page 77: 안정적인 서비스 운영   2014.03

흔한 장애

파일/디스크 관련

| 디스크 가용량이 부족하거나

지우지 않고 쌓인 로그

| inode가 부족하거나

작은 파일을 많이 저장하고 있을 때

| FD_MAX가 작거나

ulimit -n

Page 78: 안정적인 서비스 운영   2014.03

흔한 장애

L4

| L4를 적용했는데도, 정상 동작하지 않는 서버로 계속 요청이 가는 경우

HTTP라면 L7 헬스 체크 적용

Page 79: 안정적인 서비스 운영   2014.03

흔한 장애

디비

| 갑자기 쿼리의 실행 계획이 바뀌어 슬로우 쿼리 발생

쿼리에 힌트를 주어 실행 계획을 고정 . 동적으로 문자열을 만들어 쿼리를 생성할 경우 힌트 주

기가 어려움

동적 쿼리를 다수의 정적 쿼리로!

| 통계 쿼리

캐쉬 메모리가 지역성이 떨어지는 데이터로 채워져 성능 저하 초래

Page 80: 안정적인 서비스 운영   2014.03

대규모 장애 대응

중요 기능 우선

| 서비스 기능을 중요도로 정렬 .게시판: 읽기 > 쓰기 > 검색 .메일: 수신/읽기 > 목록 > ... > 쓰기 > ... > 검색 > 색인 .검색: 통합검색 > ... > ... > 색인

| 장애 시 중요 기능을 보호하는 대응

우선 순위 떨어지는 기능을 포기하여 상위 기능을 개선 . 미들웨어에서 호출 컴포넌트 정보를 받아, 비중요 컴포넌트로 부터의 호출을 실패 처리

Page 81: 안정적인 서비스 운영   2014.03

대규모 장애 대응

기타

| 캐쉬 만료 기간 연장

캐쉬를 2분간 보관한다면 임시로 10분 등으로 연장 .백엔드 호출이 그만큼 줄어들게 됨

| 색인 갱신 중단

색인 작업은 전반적인 데이터 패치를 수반

이를 잠시 멈춰, 내부 트래픽과 미들웨어 호출량을 줄일 수 있음

| 서비스 마다 특성이 있음

고민! 고민! 고민!

Page 82: 안정적인 서비스 운영   2014.03

장애 대응

전파

| 메일링 리스트를 이용하여 유관자에게 전파

처리

| Case By Case

에러 로그

롤백이 가능하면 롤백 우선

에러의 원인이 내 서비스가 아닌 연관 API 서버에 있을 수도

Page 83: 안정적인 서비스 운영   2014.03

장애 후 대응

회고

| 해당 장애를 사용자가 인지하기 전에 미리 알 수는 없었는지

미리 알 수 있는 방법을 찾아내면 모니터링 항목으로 등록

| 장애 원인을 아는데 왜 오래 걸렸는지, 자동으로 알 수는 없었는지

자동으로 알 수 있게 됐다면 스크립트화 . 해당 스크립트 묶음을 장애 시 활용하면 원인 진단을 빠르게 할 수 있음

Page 84: 안정적인 서비스 운영   2014.03

http://www.slideshare.net/cybaek/201403