[MySQL] DB 다중화

doogang·2024년 10월 16일
0

다중화

데이터베이스 특징 : 많은 데이터를 영구적으로 보관해야함
→ 서버 내부의 로컬 저장소나 메모리로는 많은 데이터를 보관하지 못하기에 외부 저장소와 묶여야한다.
→ DB는 서버(계산이나 업무 로직 처리)와 저장소(데이터 보존)로 구분한다.

클러스터링

클러스터링 : 동일한 기능의 컴포넌트를 병렬화하는 것

  • 가장 기본적인 다중화로는 1개의 저장소에 2개 이상의 서버를 두는 것
    → 데이터를 보존하는 저장소가 1개여서 정합성을 신경쓰지 않아도 된다.
  • 2대의 서버가 있는데, 이 2대의 서버가 모두 동작하는지의 여부에 따라 종류를 나눌 수 있다.

[ Active-Active ] : 클러스터를 구성하는 컴포넌트를 동시에 가동 (2개 모두 동작)

장점

  • 시스템 다운 시간이 짧다 : 복수의 DB 서버가 동시에 동작하고 있어서 1대가 다운되어도 다른 DB가 계속 요청을 처리해서 시스템 전체가 다운되는 일을 방지할 수 있다.
  • 성능이 좋다 : 동시에 동작하는 DB 서버가 증가하면서 동시에 가동하는 CPU나 메모리도 증가하기 때문에 성능도 향상될 수 있다.

단점

  • 병목 현상의 가능성 : 여러 대의 서버가 하나의 저장소를 공유하기 때문에 여기서 병목 현상이 발생하여 성능 이슈가 생길 수 있다.

[ Active-Standby ] : 클러스터를 구성하는 컴포넌트 중 실제 가동은 Active만, 다른 하나(Standby)는 대기 상태

  • Cold-Standby : 평소엔 Standby DB가 작동하지 않다가 Active DB가 다운된 시점에 작동하는 구성
  • Hot-Standby : 평소에도 Standby DB가 작동하는 구성. (전환되는 시간이 짧지만 비싸다.)
  • 둘 다 대기할 뿐, 실제로 일을 하는 것은 Active DB 1대 뿐이라는 것은 똑같다.

[ 클러스터링 동작 방식 중 Galera 방식]

리플리케이션

클러스터링의 단점

  • 저장소가 하나다! (고장나면 데이터를 모두 잃는다)
  • 동기로 데이터를 공유하기 때문에 write가 느리다.
  • 장애 전파의 가능성

리플리케이션 : DB 서버 + 저장소 세트를 복수로 준비하는 구성 (서버 뿐 아니라 데이터도 다중화한다)

  • 저장소도 따로 분리하여 준비함으로써, 하나의 저장소가 고장났을 때에도 서비스를 유지할 수 있다. (가용성이 높다)
  • 쓰기의 경우 master DB만 하게 될텐데, 그러면 다른 한쪽은 이 데이터를 정해진 주기에 맞춰서 읽어가야한다. → 정해진 주기 사이에 문제가 생기면 그만큼의 데이터는 소실된다.
  • 비동기로 데이터를 복사하기 때문에 클러스터링보다 빠르다.
  • 클러스터링의 경우 하나의 서버는 놀게 되는데(standby인 경우이고, Active-Active는 둘다 일한다), 리플리케이션은 한쪽을 write 다른 한쪽을 read를 담당하게 하여 성능도 높인다.

[ 리플리케이션 동작 방식 ]

  1. 마스터 노드에서 시간 순서대로 수행한 업데이트 트랜잭션 로그들을 BIN LOG에 저장한다. (read 관련 트랜잭션은 마스터에서 실행되지 않기 때문에 없다)
  2. slave 노드의 IO Thread가 BIN LOG를 복사해서 Relay Log에 기록한다.
  3. SQL Thread가 Relay Log에 기록된 쿼리를 그대로 실행한다. (동일한 쿼리를 실행함으로써 동기화)

[ 클러스터 ] : 모든 디비가 동기화. (서버의 병렬 구조)

  • 장애 복구 : 문제가 발생했을 때, 나머지 다른 서버가 들어오는 요청을 처리하여 장애 발생을 피할 수 있다.
  • 성능에 대한 이점 : Active-Active의 경우엔 2개의 DB 서버로 요청을 분산할 수 있다.

→ master 서버가 write를 계속 받고, 다른 서버들에도 전달을 해서 master가 죽어도 다른 서버들에도 모두 동일한 데이터가 들어가있다. 그리고 다른 서버가 master로 승격한다.

[ 리플리케이션 ] : 비동기로 동작

→ 데이터 정합성이 깨질 수 있음.

샤딩

Shared-Disk : 복수의 서버가 1대의 저장소를 공유

Shared-Nothing : 서로 데이터를 공유하지 않는다. 서버와 저장소의 세트를 병렬로 늘려서 성능을 향상시킨다.

→ 병목을 방지하여 처리율이 좋다.

샤딩 : 구글이 개발한 Shared-Nothing 방식의 구성

  • 저장소를 서로 공유하지 않기 때문에 각 저장소에 문제가 생기면 해당 저장소에 있는 데이터는 읽어오지 못한다.
  • 다른 저장소와 데이터를 합쳐서 봐야할 때, 데이터를 합쳐줘야하는 작업을 해야한다.

[ 샤딩의 데이터를 나누는 Shard Key 방식 ]

  1. Hash Sharding : Hash 함수의 결과에 따라 샤딩하는 방식. DB 서버가 추가되면 해시 알고리즘이 바뀌어야한다.
  2. Dynamic Sharding : 샤드 키를 정의한 테이블을 만들어서 샤딩하는 방식. 샤드가 늘어나면 테이블의 키만 추가하면 된다.
  3. Entity Group : 연관성 있는 엔티티를 한 샤드에 두는 방식
profile
안녕하세요

0개의 댓글