가상면접사례로 배우는 대규모 시스템 설계 기초(2)
오늘 배운 것
1장 사용자 수에 따른 규모 확장성
앞서 로드밸런서로 웹 서버 부하분산, DB 다중화로 DB부하 분산 성공.
응답시간을 줄이기 위해 캐시와 정적 콘텐츠는 CDN을 도입하라. (동적 콘텐츠도 되긴 하는데 범위를 벗어남)
캐시 사용 시 유의할 점
- 캐시는 적은 update, 많은 read일때 유리하다.
- 캐시의 위치는 메모리, 영속적인 데이터는 놓으면 안된다.
-
만료 정책이 없으면 데이터는 캐시에 계속 남는다. 너무 짧으면 DB를 너무 자주 읽게 되고, 너무 길면 원본과 차이가 날 가능성이 높아진다.
-
일관성(consistency)은 어떻게 유지되는가. 원본과 캐시 내의 사본이 같은지 여부를 말한다. 원본 갱신과 캐시 갱신이 단일 트랜잭션이 아니라면 일관성이 깨질 수 있다. 여러 지역에 시스템이 확장되는 경우 일관성을 유지하는 것이 어렵다. 페이스북의 논문 “Scaling Memcache at Faebook”을 참고하라.
-
장애 대처, 캐시 서버를 한 대만 두면,
단일 장애 지점(SPOF)이 될 것이다.단일장애지점이란, 어떤 특정 지점에서의 장애가 전체 시스템의 동작을 중단 시키는 경우를 말한다. 그래서 여러 지역에 캐시 서버를 분산해야 한다. - 캐시 메모리는 얼마나 크게 잡을 것인가. 너무 작으면 데이터가 캐시에서 자주 밀려나서 캐시 성능이 떨어진다.
- 데이터 방출 정책은 무엇인가. 캐시가 꽉 차면 기존 데이터를 내보내야 한다. LRU, LFU, FIFO…
CDN
CDN은 정적 콘텐츠를 전송하는 데 쓰이는, 지리적으로 분산된 서버의 네트워크. 이미지 비디오 CSS JS파일을 캐시할 수 있다.
동적 콘텐츠 캐싱은 상대적으로 새로운 개념이다. 우선 이 책에선 정적 콘텐츠만 보자.
여러 지역단위의 캐시와 DB의 관계가 CDN과 원본서버와 비슷하다.
CDN사용 시 고려해야 할 사항
- 비용: CDN은 보통 제3 사업자에 의해 운영된다. 자주 사용되는 콘텐츠를 캐싱해야 한다.
- 적절한 만료시점: 시의성이 중요한 콘텐츠는 만료 시점을 잘 정해야 한다. 너무 짧으면 자주 원본서버에 접속해야 하고, 길면 신선도가 떨어진다.
- CDN 자체가 죽었을 경우 대처방안을 고려해야 한다.
- 콘텐츠 무효화 방법, 아직 만료되지 않았더라도 아래 방법 가운데 하나를 써서 CDN에서 제거할 수 있다.
- CDN 사업자가 제공하는 API로 제거
- 다른 버전을 서비스하도록 오브젝트 버저닝 이용.