-
대규모 시스템에서 데이터베이스 사용시스템 설계 2022. 7. 24. 23:12
틀린 내용이 있을 수도 있습니다!
틀린 내용이 있다면 댓글로 달아주시면 감사하겠습니다!
대규모 시스템 설계에서 필요한 데이터베이스 사용에 대해 학습한 내용을 정리했다.
어떤 데이터베이스를 사용할 것인가
데이터베이스에는 여러가지 종류가 있지만, 크게 RDBMS와 NoSQL 이 두가지에 대해서 알아본다.
1. RDBMS
- 자료를 테이블, 행과 열을 통해서 표현한다.
- 테이블의 관계에 따라 Join이 가능하다.
- 정규화를 거쳐 데이터 중복 없이 한번만 저장할 수 있다.
- 스키마로 인해 데이터가 유연하지 못하다.
- Mysql, Oracle, postgresql, sqlite
2. NoSQL
- Not only SQL이라는 슬로건에서 생겨난 데이터베이스로 key와 value로 데이터를 관리한다.
- 관계형 모델을 사용하지 않으며 join 기능이 없다.
- 데이터 중복이 발생할 수 있으며, 중복된 데이터가 변경될 경우, 수정을 모든 컬렉션에서 해야한다.(Updater가 자주 이루어지지 않는 시스템에서 유리)
- 확장성, 가용성, 높은 성능을 갖는다.
- NoSQL는 저장되는 데이터 구조에 따라서 다음과 같이 분류되기도 한다.
- Key-value 저장소
- 그래프 저장소
- 칼럼 저장소
- 문서 저장소
- Cassandra, Amazon dynamoDB, Hbase, MongoDB
대부분 레거시가 RDB이기 때문에, RDB가 익숙하고 이를 많이 사용할 것이다.
하지만 대규모 시스템 설계에 있어 효율적인 아키텍처를 구성하기 위해서는 NoSQL과 같은 DB 또한 고려하여 설계해야 한다.
RDBMS가 적합한 경우
- 데이터 구조가 명확하여 스키마가 변경될 여지가 없는 경우에 사용하는 것이 좋다.
- 중복된 데이터가 없어 변경(update)이 자주 이루어지는 시스템에 적합하다.
NoSQL이 적합한 경우
- 낮은 latency가 요구되는 경우
- 다루는 데이터가 관계형 데이터가 아닌 비정형 데이터인 경우
- 데이터(json, yaml)를 직렬화하거나 역직렬화 할 수 있기만 하면 된다.
- 확장에 용이하기 때문에 아주 많은 양의 데이터 저장이 필요한 경우
데이터 베이스 다중화
- 주로 대부분의 데이터베이스들은 master-slave 구조를 지원한다.
- master에는 데이터 원본을 저장하고, slave에는 사본을 저장한다.
- master에서는 insert, delete, update와 같은 write 연산을 하며, slave에서는 read 연산을 한다.
- 다중화의 장점
- 질의를 병렬로 처리할 수 있기 때문에 성능이 개선된다.
- 데이터베이스를 지역적으로 떨어진 장소에 다중화 해놓음으로써 가용성과 안정성을 높일 수 있다.
- master를 여러대 두는 다중 마스터 구조나 원형 다중화 구조를 이용하면 가용성과 안정성을 한층 더 높일 수 있다 .
- 다중화 구성의 Database가 다운되는 경우
- Master가 하나 뿐인데 master가 다운되는 경우
- slave가 master로 승격되어, 해당 slave가 master 역할을 한다. 이후 slave가 하나 줄었으므로 slave를 하나 더 생성한다.
- 만약 해당 slave에 저장된 데이터가 최신 데이터가 아니라면, 복구 스크립트를 돌려서 최신 데이터를 추가해주어야 한다.
- slave가 하나뿐인데 slave가 다운된 경우
- slave로 향하는 read 질의는 master를 향하게 되어 slave가 다운되어도 문제가 발생하지 않는다.
- slave가 하나 줄었으므로 새로운 slave를 하나 더 생성한다.
- Master가 하나 뿐인데 master가 다운되는 경우
데이터베이스 확장하기
데이터베이스를 확장할때 scale up과 scale out 방식이 있다.
- scale up
- 무한 확장이 불가능하기 때문에, 사용자 수가 계속 늘어나면 감당하기 어려워진다.
- SPOF의 문제점이 있다.
- 고성능 서버를 사용할 수록 비용적인 문제가 생긴다.
- scale out
- 수평적 확장의 경우, sharding을 통해서 데이터베이스의 성능을 증가시킬 수 있다.
- 원하는 만큼 확장할 수 있다.
Sharding(샤딩)
- 데이터베이스를 shard라는 작은 다윈로 분할하는 방식으로, 모든 샤드는 같은 스키마를 쓰지만 샤드에 보관되는 데이터 사이에는 중복이 없다.
- 동작 방식
- 해시함수를 지정하여 사용자 데이터를 어떤 샤드에 넣을 것인지 결정한다.
- 예를 들면 user_id % 4라는 해시함수를 이용하여, user_id에 따라 샤드0, 샤드1, 샤드2, 샤드3에 나누어 저장한다.
- 샤딩을 사용했을 때 발생할 수 있는 문제점
- 데이터의 재샤딩 문제
- 특정 샤드에 데이터가 너무 많아져서 하나의 샤드로는 더 이상 관리가 힘들때, 샤드를 확장하고, 데이터를 분배시켜주어야 한다.
- 샤드간 데이터 데이터 분포가 균등하지 못해서 특정 샤드가 다른 샤드에 비해서 빠르게 소진될 때, 샤드 키를 계산하는 해시함수를 바꿔주어야 한다.
- 유명인사 문제(Hot spot)
- 여러 유명인사들이 한 샤드에 몰려 있을 때, 해당 샤드로 질의가 집중되어 과부하되는 현상으로, 유명인사들을 각각 다른 샤드로 배치하여 이를 해결할 수 있다.
- 조인과 비정규화
- 여러 샤드에 걸친 데이터는 조인하기가 힘들어지므로, 데이터에비스를 비정규화하여 질의를 수행할 수 있도록 한다.
- 데이터의 재샤딩 문제
REF
- 가상면접 사례로 배우는 대규모 시스템 설계 기초
반응형'시스템 설계' 카테고리의 다른 글
분산 환경에서의 장애감지: Gossip Protocol (1) 2022.08.28 분산 환경에서의 일관성 처리: 정족수 합의 (0) 2022.08.28 안정 해시 설계 (0) 2022.08.02 처리율 제한 장치(Rate Limiter) 설계 (0) 2022.07.31 캐시(Cache)와 CDN(Content Delivery Network) 정리 (0) 2021.09.21