해당 서비스에 맞는 서비스를 잘 골라야 한다.
단위 디스크 크기와 서버의 디스크 베이 갯수
배포가 번거로운 일이 되면 안됨
빠른 배포보다 중요하다.
롤백 기준 사전 정의는 필수
속도가 두배 빨라진다면 - 50% 하드웨어로 커버할 수 있음
하지만 속도 개선을 위해
첫번째 작업은 프로파일링 -절대 감에 의존하지 말 것, 어디가 느린지 파악하는 것이 우선
디스크 개수 : 1T 1개 vs 100G 10개 등
상황에 따라 결정
RAID 컨트롤러
배터리 충전 중에는 디스크에 바로 쓰기
전원 공급이 끊길 때 쓰기 유실을 최소하기 위한 드라이버 정책 - 이로 인해 서비스 품질 급락
RAID 컨트롤러
Redundant Array of Inexpensive/Independent Disk
저장장치 여러 개를 묶어 고용량, 고성능인 저장 장치 한 개와 같은 효과를 얻기 위해 개발된 기법
URI의 빈도와 각 응답속도 관리
구간별 처리 속도 관리 - 주요 기능의 경우, URI 하나의 응답 속도를 쪼개서 내부 로직별 처리 속도 기록
생각보다 관리할 것이 많음
한 통 발송은 쉽지만 다량 발송은 손이 많이 감
코드의 문제가 아니라 운영의 문제
신규 서버 설치
장비를 받아, 10분 내에 설치할 수 있도록 (방화벽 오픈 등이 빠른 대응에 거림돌)
일상적인 응용 배포
자동 복구 - 장애 시 루틴하게 하는 작업
필요한 기본 인프라
수집 주기 - 실시간 or 시간 단위
중앙에 로그 모으는 것 : 로그 어그리게이터
PINPOINT, SCOUTER 사용함
ORM을 사용하지 않는다면, DBA의 쿼리 검수 필요
ORM (Object Relational Mapping)
동적 쿼리를 없애도록 - 1개의 동적 쿼리는 생각보다 적은 N개의 정적 쿼리로 변경 가능
슬로우 쿼리 자동 검출 - DBA와 개발자가 협의해야 함
ORM이란?
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것
에러 로그 수집에 Log&Crash 활용
경고와 장애 수준을 분리하기
대부분 장애 수준이 되어서야 알람을 받음
ex) 디스크 사용률 90% 이상이 될 때 알람
최저값 모니터링
보통 데몬 개수가 N개를 넘을 때만 알람을 받음 -> 데몬이 죽었다면 알람이 안 옴
주기적으로 수치 점검
테스트 활용해 기능 체크 - 사용자 인터페이스 레벨의 테스트 모듈을 주기적으로 돌려, 서비스 상태 체크
무의미한 알람 받지 않도록!! ( 진짜 경고 메시지가 묻힐 수 있음 )
외부 API를 이용할 경우, 해당 API를 직접 체크
연동 서비스쪽 원인으로 발생한 장애를 빠르게 검출할 수 있음
Dooray Messenger로 가능
필수 : vmstat, mpstat, iostat, netstat, free, top, sar, ping (사용법 숙지하기)
50x - 사용자들은 무의식적으로 새로 고침을 반복 -> 별도 (정적) 서버로 리다이렉트 하도록 설정
에러가 아닌 척 - 쇼핑몰, 결제를 처리하는 서버에서 오류가 났다면 일단 OK 메시지를 보내고 추후 결제 처리
DEBUG 레벨의 로깅 , 로그를 껐더니 속도 10배 향ㅅ아
에러 로그를 안봐서 키우는 장애 - 에러 로그의 크기는 0을 목표로 해야함.
괜찮은 에러는 에러가 아니니 에러 로그에 남기지 않기
디폴트 값 사용 주의 - 보통 디폴트가 얼마인지도 모르고 사용
평균 응답 속도에 상응하는 타임아웃 설정
단위 확인 필요
에러 핸들링
소스코드에서 return 값 제대로 확인하지 않는 경우
( 실패인데 그 다음 코드를 계속 실행하는 경우, 성공이 아니지만 굳이 실행을 멈출 필요가없는 경우)
L4를 적용했는데도, 정상 동작하지 않는 서버로 요청이 가는 경우
갑자기 쿼리의 실행 계획이 바뀌어 슬로우 쿼리 발생
통계 쿼리 - 캐쉬 메모리가 지역성이 떨어지는 데이터로 채워져 성능 저하 초래
집계 쿼리 - ex) 받은 메일함의 안 읽은 메일 통 수 관리
사용자 단에서 일괄 재구동 -DDoS와 같은 서버 요청 발생, 특히 집계 쿼리
클라이언트가 랜덤으로 재구동하도록 설계
JVM은 DNS 쿼리 결과 캐슁
기본 설정은 JVM 재구동하기 전까지 캐슁 결과 변경 불가
서비스 기능을 중요도로 정렬
장애시 중요 기능을 보호하는 대응 -우선 순위 떨어지는 기능을 포기해 상위 기능 사용성을 유지
메일링 리스트를 이용하여 유관자에게 전파 - 장애 처리 전에 일단 전파
유용한 스크립트
기계적으로 할일 - 개발 TC 보강, QA TC 보강
빠른 장애 대처 - 장애를 어떻게 알았는가, 원인을 아는데 왜 오래 걸렸는지 자동으로 알 수는 없는지, 자동으로 복구할 수 있는지
crontab 이용 -> 특정상황 등에서 Tomcat, apache, nginx 재구동
재구동시 알람 -> Dooray messenger hook 이용