규모 확장성과 관계된 설계 문제 푸는 데에 유용한 지식들을 배워보자!
RDBMS (Relational Data-Base Management System)
관계형 데이터베이스 관리 시스템이라고도 한다.
대표적으로 ..
MySQL, 오라클 데이터베이스, PostgreSQL
자료
테이블, 열, 칼럼으로 표현
여러 테이블에 있는 데이터를 관계에 따라 join 가능
2) 비-관계형 데이터베이스 (irrelational database)
NoSQL 이라고도 부름
대표적으로 ..
CouchDB, Neo4j, Cassandra, HBase, Amazon DynamoDB
NoSQL : join 연산X
a) 키-값 저장소 key-value store
b) 그래프 저장소 graph store
c) 칼럼 저장소 column store
d) 문서 저장소 document store
비-관계형 DB 선택이 바람직한 경우
아주 낮은 응답 지연 시간(latency) 요구
다루는 데이터가 비정형
데이터의 직렬화, 역직렬화만 필요
아주 많은 양의 데이터 저장
서버 1 다운 → 모든 트래픽은 서버 2로 전송
→ 웹 사이트 전체가 다운되는 일 방지
트래픽 가파르게 증가 → 두 대의 서버로 트래픽을 감당할 수 없는 시점에서 로드밸런서가 대처 (웹 서버 계층에 더 많은 서버 추가) → 로드 밸런서가 자동적으로 트래픽 분산
3) 한계
장애의 자동복구나 다중화를 지원 X
→ 데이터베이스 다중화
더 나은 성능
안정성(reliability) : 여러 장소에 서버 다중화
가용성(availability) : 장애 대처 용이
- 데이터를 여러 지역에 복제
4) 데이터베이스 서버 가운데 하나가 다운되면?
부 서버가 한 대 뿐인데 다운된 경우
부 서버가 여러 대인데 다운된 경우
주 데이터베이스 서버가 다운된 경우
한 대의 부 서버가 주 서버를 대체
새로운 부 서버 추가
→ 부 서버에 보관된 데이터가 최신 상태가 아닐 경우
없는 데이터는 복구 스크립트를 돌려서 추가
다중 마스터(multi-masters), 원형 다중화(circular replication) 도입
const cacheAvailable = 'caches' in self;
const cache = await caches.open('my-cache');
// 캐시로 뭔가를 한다...
2) 읽기 주도형 캐시 전략(read-through caching strategy) 저장되어있으면 반환 없으면 DB에 질의해서 저장 후 반환 이 외에도 다양한 캐시 전략이 존재어떤 특정 지점에서의 장애가 전체 시스템의 동작을 중단시켜버릴 수 있는 경우 → 단일 장애 지점
6) 캐시 메모리의 적절한 크기
SSmall → 너무 자주 밀려나 캐시의 성능 저하
(대응) 캐시 메모리 과할당(overprovision)
→ 캐시에 보관될 데이터가 갑자기 늘어났을 때 생긴 문제도 방지할 수 있게 된다.
7) 데이터 방출 정책 : 캐시가 꽉 찬 후에 추가로 데이터를 넣어야 할 경우, 기존 데이터를 내보내야 한다.
대표적) LRU(Least Recently Used) : 마지막으로 사용된 시점이 가장 오래된 데이터를 내보내는 정책
LFU(Least Frequently Used) : 사용된 빈도가 가장 낮은 데이터를 내보내는 정책
FIFO(First In First Out) : 가장 먼저 캐시에 들어온 데이터를 가장 먼저 내보내는 정책
웹사이트 방문 시, 그 사용자에게 가장 가까운 CDN 서버가 정적 콘텐츠를 전달
사용자가 CDN 서버로부터 멀면 멀수록 웹사이트 로드 속도 줄어듬
1) 사용자 A가 이미지 URL을 이용해 image.png에 접근
→ URL의 도메인은 CDN 서비스 사업자가 제공
2) CDN 서버의 캐시에 해당 이미지가 없는 경우, 서버는 원본 서버에 요청하여 파일을 가져옴.
3) 원본 서버가 파일을 CDN 서버에 반환
→ 응답의 HTTP 헤더에는 해당 파일이 얼마나 오래 캐시될 수 있는지를 설명하는 TTL 값이 들어있다.
4) CDN 서버는 파일을 캐시하고 사용자A에게 반환
→ 이미지는 TTL에 명시된 시간이 끝날 때까지 캐시
5) 사용자 B가 같은 이미지에 대한 요청을 CDN 서버에 전송
6) 만료되지 않은 이미지에 대한 요청은 캐시를 통해 처리
보통 제3 사업자(third-party providers)에 의해 운영됨
사용자는 CDN으로 들어가고 나가는 데이터 전송 양에 따라 요금 내야 함
자주 사용하지 않는 콘텐츠를 캐싱하는 것은 이득 X, CDN에서 빼는 것을 고려하자!
2) 적절한 만료 기한 설정
시의성이 중요한 콘텐츠의 경우 만료 시점을 잘 정해야 함
너무 길면, 콘텐츠의 신선도 하락
너무 짧으면, 원본 서버에 빈번히 접속
3) CDN 장애에 대한 대처 방안
CDN 자체가 죽었을 경우 웹사이트/앱이 어떻게 동작해야하는지 고려해야 함
해당 문제를 감지하여 원본 서버로부터 직접 콘텐츠를 가져오도록 클라이언트를 구성하는 것이 필요
4) 콘텐츠 무효화 방법
아직 만료되지 않은 콘텐츠여도 CDN에서 제거하는 방법
CDN 서비스 사업자가 제공하는 API를 이용한 콘텐츠 무효화
콘텐츠의 다른 버전을 서비스하도록 오브젝트 버저닝(object versioning) 이용
→ 콘텐츠의 새로운 버전을 지정하기 위해서는 URL 마지막에 버전 번호를 인자로 주면 된다.
ex. image.png?v=2
+) 계속 읽는 중입니당