GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Inclu
Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. - donnemartin/system-design-primer
github.com
- RDBMS
SQL 같은 관계형 DB 는 테이블 내의 조직화된 데이터 항목들의 집합이다.
RDB의 transaction 과 관련된 4가지 ACID 속성이 있다.
- Atomicity: 각 transaction 은 모두 반영되거나 반영되지 않는다.
- Consistency: 모든 transaction 은 DB를 유효한 상태에서 다른 유효한 상태로 만든다.
- Isolation: 동시에 실행중인 transaction 은 마치 transaction 이 순차적으로 실행된것처럼 같은 결과를 갖는다
- Durability: 한번 transaction 이 commit 되면 그대로 유지된다.
RDB 를 확장하기 위한 기술에는 master-slave replication, master-master replication, federation, sharding, denormalization, SQL tuning 등이 존재한다.
- Master-slave replication
master 는 읽기 쓰기를 지원하며, 쓰기는 1개 혹은 그 이상의 slave 들로 복제되며 slave 들은 읽기 모드만 지원한다. slave 는 tree 같은 형태로 추가적인 slave 들로 복제될 수 있다. 만약 master 가 offline 상태가 되면 시스템은 특정 slave 를 master 로 승격시키거나 신규 master 가 제공될때까지 read-only 모드로 운영될 수 있다.
단점
- slave 를 master 로 승격시키기 위한 추가 로직이 필요하다.
- Master-master replication
두 master 가 읽기 쓰기를 지원하며, 서로 데이터를 복제한다. 만약 1대가 내려가도 시스템은 여전히 읽기 쓰기가 가능한 형태로 운영될 수 있다.
단점
- 어디에 써야할지를 결정하기 위해 로드 밸런서나 어플리케이션 로직을 변경할 필요가 있다.
- 대부분의 master-master 시스템은 일관성이 느슨해지거나 (ACID 위배) 동기화로 인해 지연이 증가한다.
- 쓰기 노드가 더 많이 추가되고 대기 시간이 길어질수록 충돌 해결의 중요성이 커진다.
- 복제 모드의 단점
- 새로운 쓰기 데이터가 다른 노드로 복제되기 전에 마스터가 불능 상태가 되면 데이터가 소실될 가능성이 존재한다.
- 쓰기는 읽기 복제본으로 재전송된다. 만약 쓰기가 많아지면 읽기 복제본이 쓰기 재전송으로 인해 정체되어 읽기 작업을 많이 수행할 수 없게 된다.
- slave 읽기가 많아 질수록 더 많은 복제해야할것도 많아져서 이로 인해 복제 지연이 증가한다.
- 어떤 시스템에서는 마스터에 대한 쓰기 수행시 동시에 쓰기 위해 여러 스레드를 생성하는 반면 읽기 복제본은 단일 스레드를 사용한 순차적 쓰기만 지원한다.
- 복제본은 더 많은 하드웨어 자원을 소모하며 복잡성이 증가한다.
- Federation
Federation (일반적으로 사용하면 "연합" 이라는 의미이며, DB 에서는 기능적인 측면의 파티셔닝을 일컫는다) 은 기능축으로 DB 를 나누는 방식을 말한다. 예를 들어 하나의 단일 DB 대신 forums, users, products 와 같이 3개의 DB 로 나눌 수 있으며 각 DB 에는 더 적은 읽기 및 쓰기 traffic 이 가해지므로 복제 지연이 적어진다. DB 크기가 작아지면 memory hit 율이 높아지게 된다. 단일 중앙 master 가 쓰기를 수행하지 않고 병렬로 쓸수 있으므로 처리량이 증가한다.
단점
- Federation 은 만약 스키마가 거대한 기능들이나 테이블을 요구한다면 효과적이지 않다.
- 어떤 DB 에 읽고 쓸지를 결정하기 위해 어플리케이션 로직을 갱신해야 한다.
- 두 DB 간 데이터 join 이 복잡하다.
- Federation 은 더 많은 하드웨어 리소스를 사용하며 복잡성이 증가한다.
- 샤딩
샤딩은 데이터를 여러 DB 로 나누어서 분산 시키며 각 DB 는 데이터의 특정 집합만 다루게 된다. 그림과 같은 user DB 에서 user 수가 증가함에 따라 더 많은 샤드가 클러스터에 추가된다.
federation 과 비슷한 이점이 있으며 샤딩은 읽기/쓰기 지연이 적고, 적은 복제본수를 가지며 cache hit 율이 높다. 인덱스 크기가 줄어들어서 빠른 쿼리측면의 성능면에서 이점이 있다. 만약 1 샤드가 다운되면 다른 샤드가 운영되지만 데이터 손실을 방지하기 위해서는 어떤 형태의 복제본을 추가해야 한다. federation 처럼 중앙 마스터 쓰기가 없으며 병렬로 쓰게 해주어 처리량이 증가한다.
유저의 테이블을 샤딩하는 일반적인 방법은 사용자 성의 이니셜이나 지리적 위치를 이용한다.
단점
- 샤드를 고려한 어플리케이션 로직이 추가되어야 하며 SQL 쿼리가 복잡해진다.
- 샤드간 데이터 분포가 불균형해질 수 있다. 예를 들어 특정 샤드에 파워 유저가 존재하면 다른 그룹에 비해 해당 샤드에 부하가 많이 걸릴 수 있다.
- 리밸런싱을 하면 복잡성이 증가한다. 해시링에 기반한 샤딩 기능은 전송되는 데이터양을 줄일 수 있다.
- 멀티플 샤드의 데이터 조인이 복잡하다.
- 샤딩은 더 많은 하드웨어 리소스를 소모하고 복잡성이 증가한다.
비정규화
비정규화는 일부 쓰기 성능을 희생하여 읽기 성능을 향상 시킨다. 데이터를 중복하여 써서 비싼 연산인 여러 테이블간 join 을 회피한다. PostgreSQL 과 오라클 같은 일부 RDBMS 는 중복 정보를 저장하는 materialized views 를 제공한다.
federation 과 샤딩과 같은 기술로 데이터를 한번 분산 시키면 데이터 센터간 조인을 관리해야하기 때문에 복잡성이 증가한다. 비정규화를 통해 이런 복잡한 조인이 필요하지 않게 될 수 있다.
대부분의 시스템에서 읽기는 쓰기에 비해 100:1 이나 1000:1 로 압도적으로 많다. 복잡한 DB 에서 읽기 join 은 상당히 비싼 연산이 될 수 있으며 디스크 연산에서 상당부분 시간을 소요할 수 있다.
단점
- 데이터가 중복된다.
- 제약조건은 정보의 사본을 동기화된 형태로 유지하는데 도움이 되며, 이는 설계의 복잡성을 증가시킨다.
- 쓰기 부하가 있는 상황에서 비정규화된 디비는 정규화된 디비보다 성능이 더 떨어진다.
'Concepts > System Design' 카테고리의 다른 글
NoSQL (0) | 2025.04.20 |
---|---|
DNS (0) | 2025.04.13 |
Communication (0) | 2025.04.13 |
Asynchronism (0) | 2025.04.13 |
Application layer (0) | 2025.04.13 |
댓글