데이터베이스
기본적으로 하나의 서버, 하나의 스토리지를 가지고 있다.
샤딩, 클러스터링, 레플리케이션
공통점
Clustering
데이터베이스 서버가 죽으면?
-> 서버를 여러개로 만들자!
1. Clustering(Active-Active)
![](https://velog.velcdn.com/images%2F1yangsh%2Fpost%2F65d8fbef-364f-4dc6-83e5-33bea92ae9b5%2Fimage.png)
prod
- 여러 데이터베이스 서버를 동작 상태로 둔다
- 하나의 서버가 죽어도 다른 서버가 역할을 할 수 있기 떄문에 서버의 중단이 최소화됨
con
- 하나의 스토리지를 공유하고 있기 때문에 병목이 생길 수 있다.
- 비용이 비싸다
2. Clustering(Active-Standby)
![](https://velog.velcdn.com/images%2F1yangsh%2Fpost%2F3b609059-8523-4d9d-80c2-5d63f99df4c1%2Fimage.png)
하나의 서버를 Active 상태로 두고 서버가 중지됐을 때 stand by 서버가 active 상태가 되어 대신하게 된다.
prod
- 비용이 저렴하다 (standby는 실제로 운용되지 않기 때문에)
con
- Active가 죽었을 때 전환 시 시간이 오래 걸린다
Replication
저장된 데이터가 손실되면 어떡하지?
-> 실제 데이터가 저장되는 저장소도 복제하자
replication
- 여러 개의 DB를 권한에 따라 수직적인 구조(Master-Slave)로 구축하는 방식
- 현재는 master-slave 단어를 안쓰는 추세인 만큼 source-replica 구조로 불리운다
![](https://velog.velcdn.com/images%2F1yangsh%2Fpost%2Fdf81fd70-7deb-4817-9a27-b3e1d4a5c9fc%2Fimage.png)
위 구성의 단점은 Slave의 DB 서버가 놀게 된다는 점
- Master DB(소스 DB)에는 Insert, Update, Delete
- Slave DB(Replica DB)에는 Select 를 하여 부하 분산
replication 구축 목적
- 스케일 아웃
- 갑자기 늘어나는 트래픽에 대해 부하를 줄이기 위해 서버를 늘리는 것
- 데이터 백업
- 백업 과정은 실제 실행중인 쿼리에 영향을 줄 수 있다.
- 따라서, 복제를 하여 레플리카 서버에서 데이터 백업을 진행
- 데이터 분석
- 데이터 분석의 경우, 대량의 데이터 조회, 복잡한 쿼리가 많을 수 있다.
- 소스 서버에서 데이터 분석을 할 경우, 실제 서비스에 문제가 생길 수 있다.
- 따라서 데이터 분석 전담 서버를 두는 것이 좋다.
- 데이터의 지리적 분산
- 데이터베이스 서버가 멀리 떨어져 있다면 빠른 응답을 받기 어렵다.
- 다양한 지역에 레플리카 서버를 두어 응답 속도를 높일 수 있다.
Sharding
데이터가 많아서 검색이 느린데 더 빠르게 할 수 있는 방법이 있을까?
-> 테이블을 나눠서 검색하자
sharding
- 테이블을 특정 기준으로 나눠서 저장 및 검색
![](https://velog.velcdn.com/images%2F1yangsh%2Fpost%2F08d7adc1-17d5-4b81-b308-733b4bd82941%2Fimage.png)
Sharding 시 주의할 점
Shard Key
를 잘 선정해야 한다
- 나눠진 shard 중 어떤 shard를 선택할지 결정하는 키
- Shard Key 결정방식에 따라 Sharding 방법이 나뉜다
Shard Key를 결정하는 방식
1. Hash Sharding
- 구현이 간단하다 (key-value)
- 확장성이 떨어진다
- 공간에 대한 효율을 고려하지 않는다
2. Dynamic Sharding
![](https://velog.velcdn.com/images%2F1yangsh%2Fpost%2F4c1d58eb-ce48-45f8-bd51-8b03949a316b%2Fimage.png)
- 확장에 용이하다
- 데이터를 재배치시 Locator Service도 동기화 해야한다
- Locator에 의존적이다
3. Entity Group
- 1, 2번 방식과 같은 경우 key-value 형식이기 때문에 RDB보다 NoSQL에 좀 더 적합하다
- 관계가 있는 Entity끼리 같은 Shard 내에 공유하도록 만든 방식
prod
- 단일 Shard 내에서 쿼리가 효율적
- 단일 Shard 내에서 강한 응집도를 가진다
con
- 다른 Shard의 Entity와 연관되는 경우 비효율적
결론
데이터베이스를 나누는 것도 비용이기 떄문에 현재 상황에 맞는 기술을 사용하는 것이 중요하다
Reference
히브리의 Sharding, Clustering, Replication