5. 2013년 1월 모바일앱 출시
!
매일 아침 8:30분 전체 회원에게 2장 충전 알림 푸시 발송
2014년 4월 29일 기준 23,094,992 장 충전 발생
6. 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대 사용”
12. !
Celery, Cron 등 Log 모니터링 및 자동 Alert - Logentries
!
- Celery, Cron 등에서 생상되는 Log를 실시간으로 Archiving 하다가 특정 패턴의 문자열
이 발견되면 이메일로 Alert을 준다.
- Celery, Cron 이상시 즉시 원인 분석 및 대응 가능.
!
!
17. !
상황 1. MySQL Master 장애
!
- 예방법이 있을까?
- 예방이 안된 상태에서 장애가 났다면
어떻게 대응하는게 좋을까?
!
AP
LB
AP AP
MySQL - Master MySQL - Slave
Cache + Worker
18. !
예방법 - MySQL Master 이중화
!
# 예시 : Galera Cluster for Mysql
!
!
!
!
!
!
!
!
!
- 모든 MySQL Node에 write - read 가능.
- MySQL node들 앞단에 LB를 놓으면 어플리케이션에서는 LB만 바라보면 된다.
!
19. !
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
!
!
!
20. !
상황 2. 갑자기 외부 서비스 연동이 제대로 동작하지 않는다.
(Facebook API, 문자 서비스 API 등)
!
- 해당 서비스에 장애가 생긴 것일까?
-> 해당 서비스 장애가 빈번하다면 백업 API를 사용하여 대비한다. (문자 발송 API 등)
-> 애드투페이퍼 서비스에서는 문자 발송 업체를 2곳 사용중이다. 첫번째 발송 업체의 API
를 먼저 호출하고 (Timeout 1초), Timeout이 나거나 실패 응답이 왔을시에는 백업 발송
업체의 API를 호출. -> 기존에는 회원가입 인증 문자 관련 전화 CS가 종종 있었지만 이중
화후 발생하지 않음.
!
- 해당 서비스에 이상이 없는데 갑자기 코드가 동작하지 않는다면?
-> DNS 서버를 체크하자!
-> DNS 서버를 따로 지정해놓지 않은 경우 갑자기 Host를 찾지 못하는 경우가 생긴다.
21. !
상황 3. 갑자기 MySQL 서버가 응답하지 않는다.
!
- 로그 서버 등 대량의 데이터를 저장하는 서버에서 binlog 저장 주기가 길 경우 하드디스크가
binlog로 꽉 차서 MySQL이 정상동작 하지 않는 상황이 생길 수 있다.
- Newrelic 등 모니터링 서비스를 이용하여 상시 모니터링 하고 자동으로 Alert을 받을 수
있도록 설정하는 것이 좋다.
- 모니터링 서비스가 없는 상태에서 장애가 발생한 서버에 접속했을 때는 “df -h” 명령을 먼저
사용하여 디스크 용량 상태를 먼저 확인하는 것이 유용하다.
22. !
상황 4. 서비스가 갑자기 접속이 되지 않는다.
!
- 앞서 공유한 pingdom 등의 웹서비스 모니터링 서비스를 이용하여 모니터링 할 경우,
웹서버, DNS 서버 등 여러 장애 포인트 중 어떤 부분이 문제인지 빠르게 확인할 수 있다.
!
- 국내 유명 DNS 서비스들도 가끔 DDoS 로 인해 응답 불능 상태에 빠지는 경우가 있다.
-> 되도록이면 AWS Route 53 등 안정적인 DNS 서비스를 사용하는 것을 권장.
!
- 국내 DNS 서비스의 경우에는 DDoS 방어 등을 목적으로 해외 트래픽을 차단하는 경우가
있어 해외 대상 서비스를 하는 경우 국내 DNS를 사용하면 해외에서 접속이 되지 않는 경우
가 생길 수 있다.
24. !
2-1. 만약 무시해도 되는 오류라면 “STOP SLAVE;” 쿼리 실행 후 “SET GLOBAL
SQL_SLAVE_SKIP_COUNTER = 1;” 쿼리를 통해 skip할 쿼리 개수를 지정후
“START SLAVE;” 쿼리를 통해 replication을 재시작 한다.
!
2-2. 무시할 수 없는 오류라면 앞서 언급한 XtraBackup을 통해 Slave를 다시 생성한다.
!
!
25. !
상황 6. 반드시 데이터 분석용 쿼리는 Slave 서버에만 보내도록 한다.
!
- 실수로 작성한 쿼리가 Master에서 실행될 경우 심각한 장애를 초래할 수 있다.
!
- 직접 MySQL 접속 권한을 주는 대신 “내부 관리자용 웹 어플리케이션”에서 쿼리를 실행
하도록 하면 코드 상에서 사전 검증이 가능하다.
- 모든 쿼리는 Transaction 상에서 동작하도록 하고, 실행 완료 후 반드시 Rollback 한다.
- 쿼리 안에 DDL이 포함되어 있으면 실행을 거부한다.
- 유저 정보 table 등 개인 정보 유출 우려가 있는 table명이 쿼리 상에 포함되어 있으면
실행을 거부한다.
- 반드시 Timeout을 지정하여 실수로 실행한 쿼리가 무한정 실행되는 것을 방지한다.
!