DB 운영 방식
- 한대의 DB 서버에서 운영한다.
- 이중화 : 한대의 서버만 운영하니까 불안해, DB 서버가 죽으면 서비스가 되지 않으니까 DB 서버를 두대로 만들자.
- 레플리카 : 서버 두대로도 부족한 거 같아. 한대가 죽으면, 한대로 운영하는 동안 백업을 할 수가 없어 레플리카는 기본적으로 서버 4대가 한 묶음이다.
- 파티션 : 하나의 테이블에 너무 많은 데이터가 있어서 느려졌어, 관리도 힘들어, 테이블을 나누지만 하나의 테이블처럼 사용하자
- 샤딩 : 하나의 디비에 너무 많은 데이터가 있어서 느려졌어, 파티션으론 한계가 있으니, 디비를 복사해서 하나의 디비처럼 사용하자
- proxySQL : 서버 여러대를 하나의 서버처럼 사용하고 싶어
파티션
데이터를 별도의 테이블로 분리해서 저장하지만 사용자 입장에서는 여전히 하나의 테이블로 읽기와 쓰기를 할 수 있게 해주는 설루션
파티션을 사용하는 이유
- 하나의 테이블이 너무 커서 인덱스의 크기가 물리적인 메모리보다 클 때
- 데이터 특성상 주기적인 삭제 작업이 필요한 경우 -> 로그 테이블
- 단일 insert / select의 빠른 처리
인덱스가 커진다 == select / insert / update / delete 모두 느려진다
워킹 셋의 크기를 줄임으로써 메모리 공간을 효율적으로 활용할 수 있다
이력 데이터 관리
파티션을 이용하면 특정 기간 동안의 데이터만 테이블에 쌓이게 된다.
해당 필요 없는 데이터(2007년)는 테이블채로 삭제하면 된다.
신규 데이터는 새로운 테이블(2011년)을 생성하여 관리한다.
수직(vertical) 파티셔닝 == 정규화
테이블의 칼럼 중 특정 칼럼들을 테이블을 분리하여 따로 저장하는 형태를 의미한다. 주로 순차적인 데이터를 관리하는 테이블에 많이 사용한다. 관계형 데이터베이스에서 3정규화와 같은 개념으로 접근하면 이해하기 쉽다. 하지만 수직 파티셔닝은 이미 정규화된 데이터를 분리하는 과정이다.
수직 파티셔닝을 사용하면 자주 사용하는 컬럼 등을 분리시켜 성능을 향상할 수 있다. 그리고 한 테이블을 선택하면 결국 모든 칼럼을 메모리에 올리게 됨으로써 필요하지 않은 칼럼까지 올라가서 한 번에 읽을 수 있는 열이 줄어든다. 이는 I/O 측면에서 본다면 필요한 칼럼만 올리면 훨씬 많은 수의 열을 메모리에 올릴 수 있으니 성능상의 이점이 있다.
수평(horizontal) == 샤딩
스키마(schema)를 복제한 후 샤드 키를 기준으로 데이터를 나누는 것을 말한다. 즉 스키마가 같은 데이터를 두 개 이상의 테이블에 나누어 저장하는 것을 말한다. 하나의 테이블의 각 행을 다른 테이블에 분산시키는 것이다. 수평 파티셔닝은 퍼포먼스, 가용성을 위하여 key를 기반으로 여러 곳에 분산 저장한다. 그리고 일반적으로 분산 저장 기술에서 파티셔닝은 수평 분할을 의미한다. 보통 수평 분할을 한다고 하였을 때는 하나의 데이터베이스 안에서 이루어지는 경우를 지칭한다.
장점에는 데이터의 개수를 기준으로 나누어 파티셔닝 하며, 데이터의 개수가 작아지고 따라서 데이터베이스의 개수도 작아지게 된다. 자연스럽게 성능은 향상된다. 단점은 서버 간 연결 과정이 많아지고 데이터를 찾는 과정이 기존보다 복잡해 지연시간이 증가하나. 또한 하나의 서버가 고장 나게 된다면 데이터의 무결성이 깨질 가능성이 있다.
번외 파티션 테이블을 서버마다 분리하기
https://www.youtube.com/watch?v=8Eb_n7JA1yA&ab_channel=NHNCloud
기본적인 개념은 DB가 레플리카 되어 있을 경우 write / read를 각각의 서버를 지정해서 수행하는 개념이다.
이를 확장해서 DB 서버별로 샤딩된 데이터들을 하나의 서버처럼 접속해서 쿼리를 날려주도록 아키텍처를 설계할 수 있다.
참고
https://planbs.tistory.com/entry/ProxySQL
https://teamsmiley.github.io/2020/11/09/proxysql/
'Database > DB' 카테고리의 다른 글
postgresql SQL Error [42P10]: ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification (0) | 2022.11.10 |
---|---|
파티셔닝 실습 - postgresql (0) | 2021.06.22 |
객체 지향 데이터베이스 (OODB / object-oriented Database) (2) | 2021.06.18 |
LeetCode sql 문제, 유저별 월별 집계 (0) | 2021.05.20 |
postGIS 쿼리 튜닝 (0) | 2021.04.24 |