2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

26
서버 장애 예방 대응 방법 공유 2014.4.30 프라이머 개발자 모임 애드투페이퍼 이경찬 h t t p : // a d d 2 p a p e r. g i t h u b . i o / http://leekchan.com

description

2014.4.30 프라이머 개발자 모임 서버 장애 예방 및 대응 방법 공유

Transcript of 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

Page 1: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

서버 장애 예방 및 대응 방법 공유 !

2 0 1 4 . 4 . 3 0 프라이머 개발자 모임 !

애드투페이퍼 이경찬

!ht t p : //a d d 2 p a p e r. g i t h u b . i o /

ht t p : // l e e kc h a n . co m

Page 2: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

1) 애드투페이퍼 서비스 간단 소개 !!

Page 3: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

애드투페이퍼는? !

전국 73개 대학교 985개 제휴 PC 대학생 회원 30만명 누적 무료프린팅 2000만장

Page 4: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

애드투페이퍼는? !

전국 73개 대학교 985개 제휴 PC 대학생 회원 30만명 누적 무료프린팅 2000만장

Page 5: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

2013년 1월 모바일앱 출시 !

매일 아침 8:30분 전체 회원에게 2장 충전 알림 푸시 발송 2014년 4월 29일 기준 23,094,992 장 충전 발생

Page 6: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

Stack Overview… !

1. 로드밸런서 2. 어플리케이션 서버 3대 (4vCore 4GB | Ubuntu 11.04 | Gunicorn, Django, Supervisor) 3. DB 2대 (4vCore 4GB | CentOS 5.4 | MySQL Master-Slave Replication 구성) 4. 캐시 + 워커 서버 1대 (4vCore 8GB | Ubuntu 11.04 | Memcached, Celery, Redis, Supervisor) !

!

“매일 아침 8:30에 전체 회원 대상 푸시를 발송하기 때문에 해당 시간에 동시에 다수의 사용자가 접속 —> AP 3대 사용”

Page 7: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

AP

LB

AP AP

MySQL - Master MySQL - S lave

Cache + Worker

Page 8: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

2) 모니터링 방법 소개 !!

Page 9: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

!

서버 상태 모니터링 - Newrelic !

- 서비스 초반에는 Datadog를 사용했지만, 현재는 Newrelic으로 지속적으로 교체중. !

!

Page 10: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

!

어플리케이션 모니터링 - Newrelic !

- 웹서비스 응답 속도 모니터링 및 Transaction 단위 퍼포먼스 측정 가능 !

!

Page 11: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

Newrelic 서비스 사용 시연 !!

Page 12: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

!

Celery, Cron 등 Log 모니터링 및 자동 Alert - Logentries !

- Celery, Cron 등에서 생상되는 Log를 실시간으로 Archiving 하다가 특정 패턴의 문자열 이 발견되면 이메일로 Alert을 준다. - Celery, Cron 이상시 즉시 원인 분석 및 대응 가능. !

!

Page 13: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

Logentries 서비스 사용 시연 !!

Page 14: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

!

웹서비스 상태 모니터링 및 자동 Alert - Pingdom !

- 지정한 IP, Domain, DNS Record 등을 실시간으로 모니터링 해준다. - IP, Domain, DNS 를 모두 모니터링 하면 장애 상황에서 즉시 원인 파악이 가능하다. !

!

Page 15: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

Pingdom 서비스 사용 시연 !!

Page 16: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

3) 장애 유형 및 대응 방법 공유 !!

Page 17: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

!

상황 1. MySQL Master 장애 !

- 예방법이 있을까? - 예방이 안된 상태에서 장애가 났다면어떻게 대응하는게 좋을까? !

AP

LB

AP AP

MySQL - Master MySQL - S lave

Cache + Worker

Page 18: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

!

예방법 - MySQL Master 이중화 !

# 예시 : Galera Cluster for Mysql !

!

!

!

!

!

!

!

!

- 모든 MySQL Node에 write - read 가능. - MySQL node들 앞단에 LB를 놓으면 어플리케이션에서는 LB만 바라보면 된다. !

!

Page 19: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

!

MySQL Master 이중화를 하지 못했는데, 장애가 난다면… !

“MySQL Slave를 Master로 승격시키고 Slave를 새로 붙이는 것이 가장 쉽고 빠르다.” !

# 절차 1. MySQL Slave 서버 접속 후 STOP SLAVE; 쿼리 실행 후 Master로 사용. (바로 서비스 재개 가능) 2. 서비스 중에 MySQL Slave를 Online으로 붙일 수 있다. (Percona XtraBackup 사용) http://www.percona.com/doc/percona-xtrabackup/2.1/howtos/setting_up_replication.html !

!

!

Page 20: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

!

상황 2. 갑자기 외부 서비스 연동이 제대로 동작하지 않는다. (Facebook API, 문자 서비스 API 등) !

- 해당 서비스에 장애가 생긴 것일까? -> 해당 서비스 장애가 빈번하다면 백업 API를 사용하여 대비한다. (문자 발송 API 등) -> 애드투페이퍼 서비스에서는 문자 발송 업체를 2곳 사용중이다. 첫번째 발송 업체의 API 를 먼저 호출하고 (Timeout 1초), Timeout이 나거나 실패 응답이 왔을시에는 백업 발송 업체의 API를 호출. -> 기존에는 회원가입 인증 문자 관련 전화 CS가 종종 있었지만 이중 화후 발생하지 않음. !

- 해당 서비스에 이상이 없는데 갑자기 코드가 동작하지 않는다면? -> DNS 서버를 체크하자! -> DNS 서버를 따로 지정해놓지 않은 경우 갑자기 Host를 찾지 못하는 경우가 생긴다.

Page 21: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

!

상황 3. 갑자기 MySQL 서버가 응답하지 않는다. !

- 로그 서버 등 대량의 데이터를 저장하는 서버에서 binlog 저장 주기가 길 경우 하드디스크가 binlog로 꽉 차서 MySQL이 정상동작 하지 않는 상황이 생길 수 있다.- Newrelic 등 모니터링 서비스를 이용하여 상시 모니터링 하고 자동으로 Alert을 받을 수 있도록 설정하는 것이 좋다. - 모니터링 서비스가 없는 상태에서 장애가 발생한 서버에 접속했을 때는 “df -h” 명령을 먼저 사용하여 디스크 용량 상태를 먼저 확인하는 것이 유용하다.

Page 22: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

!

상황 4. 서비스가 갑자기 접속이 되지 않는다. !

- 앞서 공유한 pingdom 등의 웹서비스 모니터링 서비스를 이용하여 모니터링 할 경우, 웹서버, DNS 서버 등 여러 장애 포인트 중 어떤 부분이 문제인지 빠르게 확인할 수 있다. !

- 국내 유명 DNS 서비스들도 가끔 DDoS 로 인해 응답 불능 상태에 빠지는 경우가 있다. -> 되도록이면 AWS Route 53 등 안정적인 DNS 서비스를 사용하는 것을 권장. !

- 국내 DNS 서비스의 경우에는 DDoS 방어 등을 목적으로 해외 트래픽을 차단하는 경우가 있어 해외 대상 서비스를 하는 경우 국내 DNS를 사용하면 해외에서 접속이 되지 않는 경우 가 생길 수 있다.

Page 23: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

!

상황 5. MySQL Slave 서버의 Replication이 멈췄을때. !

# 절차 1. Slave 서버에서 “SHOW SLAVE STATUS;” 쿼리를 실행하여 Last_Error를 확인한다.

Page 24: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

!

2-1. 만약 무시해도 되는 오류라면 “STOP SLAVE;” 쿼리 실행 후 “SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;” 쿼리를 통해 skip할 쿼리 개수를 지정후 “START SLAVE;” 쿼리를 통해 replication을 재시작 한다. !

2-2. 무시할 수 없는 오류라면 앞서 언급한 XtraBackup을 통해 Slave를 다시 생성한다.

!

!

Page 25: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

!

상황 6. 반드시 데이터 분석용 쿼리는 Slave 서버에만 보내도록 한다. !

- 실수로 작성한 쿼리가 Master에서 실행될 경우 심각한 장애를 초래할 수 있다. !

- 직접 MySQL 접속 권한을 주는 대신 “내부 관리자용 웹 어플리케이션”에서 쿼리를 실행하도록 하면 코드 상에서 사전 검증이 가능하다. - 모든 쿼리는 Transaction 상에서 동작하도록 하고, 실행 완료 후 반드시 Rollback 한다. - 쿼리 안에 DDL이 포함되어 있으면 실행을 거부한다. - 유저 정보 table 등 개인 정보 유출 우려가 있는 table명이 쿼리 상에 포함되어 있으면실행을 거부한다. - 반드시 Timeout을 지정하여 실수로 실행한 쿼리가 무한정 실행되는 것을 방지한다.

!

Page 26: 2014.4.30 프라이머 개발자 모임 - 서버 장애 예방 및 대응 방법 공유

감사합니다. !!