웹, 앱, 데이터베이스, 캐시가 모두 한 대 서버
마스터: 쓰기
슬레이브: 읽기
(마스터 변경 내역은 슬레이브에 즉시 반영)
자주 참조되는 데이터를 메모리 안에 보관
즉, DB로 요청을 보내지 않고 캐시 계층에서 데이터 반환
대표적으로 memcachedAPI
고려 사항
SECONDS = 1
cache.set('myKey', 'hi there', 3600 * SECONDS)
cache.get('myKey')
지리적으로 분산된 서버의 네트워크
정적 콘텐츠 전송 목적
이미지, 비디오, CSS, JavaScript 파일 등 캐시
동적 콘텐츠 캐싱도 가능한데 나중에 다룸
요약하면 요청에 따라 HTML 페이지 캐시
대표적으로 클라우드프론트, 아카마이
TTL에 따라 만료되지 않은 요청을 CDN에서 처리됨
고려 사항
바람직한 건 상태 정보를 DB와 같은 지속성 저장소에 보관, 필요할 떄 가져오는 것
이렇게 구성된 걸 무상태 웹 계층이라고 함.
상태 정보가 서버가 아닌 외부 DB에서 관리하도록 하는 것
(sql, nosql 뿐만 아니라 redis와 같은 캐시 시스템도 가능)

동일 인프라를 각각 지리적으로 다른 인프라에 구성
상태 정보만 동일 DB에서 관리하면 됨.
무손실을 보장하는 비동기 통신 컴포넌트
생산자(발행자)와 소비자가 존배
생산자 -> [메시지 큐] -> 소비자
생산자는 메시지 큐에 발행하며, 소비자는 메시지큐를 구독하고, 메시지는 소비자에 의해 소비된다.
소비자는 메시지 큐를 구독한다.
메시지 큐 별도 작업 서버가 필요함.

로그: 에러 로그 등
메트릭: CPU, 메모리, 디스크I/O, DB 성능, 캐시 성능, DAU, 수익, 리텐션(재방문) 등
자동화: CI/CD
수직적 확장: 자원 증설, 한계가 있음
수평적 확장: 서버 증설, 샤딩이라고 함.
샤딩: DB를 샤드(shard)라고 부르는 작은 단위로 분할
모든 샤드는 같은 스키마를 쓰지만 샤드에 보관되는 데이터 사이에는 중복이 없음
샤드는 조각, 파편이라는 뜻
일종의 해싱으로 특정 트래픽은 특정 DB에 저장

고려 사항

특별한 전략이 필요
기본을 기억하기
2^10 1KB
2^20 1MB
2^30 1GB
2^40 1TB
2^50 1PB
시스템이 오랜 시간 동안 지속적으로 중단 없이 운영될 수 있는 능력
별도 미들웨어 서버를 두고, 레디스 등에 기록해서 씀.

락은 시스템의 성능을 상당히 떨어뜨린다.
서버 수가 달라지면(해시 함수 변경) 캐시 미스 문제 발생
안정 해시: 해시 테이블 크기가 조정될 때 평균적으로 오직 k/n개의 키만 재배치하는 해시 기술
k는 키의 개수, n은 슬롯 개수
(반대: 전통적 해시 테이블은 슬롯의 수가 바뀌면 거의 대부분 키를 재배치 함)
안정 해시는 모듈러 연산이 아님. 해시 링에 배치.
서버가 추가/삭제되도 일부 키만 재배치 됨
데이터는 일관성, 가용성, 파티션 감내성 세 가지 요구사항을 도시에 만족시키는 분산 시스템 설계 불가능
이런 식으로 개략적으로 추정하기!