[면접공부] - db (feat.gpt) (2)

반응형
반응형

정처기도 함께 공부하고 있어서 정규화도 이번에 한번 정리해보고
3. 리플리케이션
4. 파티셔닝 
5. 샤딩 
6. 인덱스 이렇게 학습을 해보자 이번엔

그러니까 5가지를 학습할예정이다.
정규화 같은 경우는 DB의 종복을 제거하고 이상현상을 제거하기 위한 방법이라고 생각하면 된다.
하지만 조회 성능은 떨어진다고 알고 있다. 그럴땐 반정규화로 다시 데이터를 늘리는 방법을 선택할 수 있다. 또한 정규화에는 1~5까지 총 6가지가 존재한다. 원부이결다비 이거였나.. 원자성 부분 이행 함수 결정자 다중값 비손실 분해이건데.. gpt는 어케 대답하는지 보자
정규화는 실무에서 테이블 설계를 할 때 중복을 줄이고 데이터 무결성을 유지하기 위해 사용하는 기본적인 기준입니다.
하지만 모든 상황에 3NF 이상 정규화를 철저하게 적용하기보다는, 성능과 확장성도 함께 고려해서 적절히 타협하는 편입니다.

예를 들어, 마스터 데이터나 변경이 잦은 데이터는 정규화를 적용해서 유지보수성과 무결성을 챙기고,
반대로 자주 조회되는 데이터나 보고서용 집계 테이블은 성능을 위해 비정규화를 하기도 합니다.

저는 보통 도메인 모델을 설계할 때, 처음에는 정규화된 구조로 시작하고, 이후 성능 테스트나 사용 패턴을 보면서 필요한 부분만 비정규화하는 방식으로 접근하고 있습니다.

다음은 리플리케이션으로 DB를 복제해서 여러대의 DB서버에 저장하는 방식을 말합니다. 

하나의 Primary(또는 Master) DB의 데이터를
하나 이상의 Secondary(또는 Replica, Slave) DB복제하는 구조

이건또 그림이 어떻게 되나 한번 확인해보자.

                [클라이언트 요청]
                      │
                      ▼
                 [Master DB]
                   (쓰기/읽기)
                   /      \
                  /        \
       복제(replication)   복제(replication)
                /              \
               ▼                ▼
        [Slave DB1]        [Slave DB2]
          (읽기 전용)         (읽기 전용)

 

  • Master DB: 데이터를 직접 쓰고 관리하는 메인 DB입니다. INSERT, UPDATE, DELETE 같은 쓰기 작업은 여기서만 수행됩니다.
  • Slave DB: Master로부터 데이터를 복제(Replication) 받아 읽기 전용으로 사용합니다.
    • 주로 SELECT 쿼리 성능을 분산시키기 위해 사용됩니다.
  • 복제 방식: 비동기 또는 동기로 구성 가능하며, MySQL에서는 binlog를 기반으로 복제합니다.

그러니까 마스터를 복사해서 슬레이브로 복사한데이터를 읽기를 쓴다는 건데... 
그러면 성능적으로 이점을 얻을 수 있을거 같다. 

              구분                                           비동기 복제 (Asynchronous)                                  동기 복제 (Synchronous)

📍복제 시점 Master가 커밋한 후, Slave는 나중에 복제 Slave가 복제 완료 후, Master가 커밋
🕒 지연 복제 지연 가능 (Replication Lag 발생 가능) 지연 거의 없음 (항상 일치 보장)
📦 데이터 유실 가능성 가능 (장애 시 Slave가 최신 데이터 없을 수 있음) 거의 없음 (모든 Slave에 반영 후 커밋되므로)
⚡ 성능 빠름 (Master가 Slave 기다리지 않음) 느릴 수 있음 (Slave 응답 기다림)
💡 사용 예 읽기 성능 위주 시스템 (일관성보다 가용성) 강한 일관성 요구되는 금융 등 중요 시스템

 

"리플리케이션은 주로 읽기 부하 분산, 고가용성 확보, 백업 및 분석용도 분리 등을 위해 사용합니다."

  • 먼저, 실무에서는 쓰기와 읽기 비율이 다른 경우가 많습니다.
    그래서 Master는 쓰기 전용, Slave는 읽기 전용으로 분리하여
    읽기 성능을 수평 확장할 수 있도록 구성합니다.
  • 또한, Master DB에 장애가 발생하더라도
    Slave 중 하나를 빠르게 승격(Promotion)해서
    서비스를 중단 없이 유지할 수 있습니다.
    즉, 고가용성과 장애 복구(HA/Failover) 관점에서도 중요한 구조입니다.
  • 그리고 Slave는 보고서 생성, 통계 분석, 백업 작업 등 부하가 큰 작업을
    분리해서 실행할 수 있어서, Master의 성능에 영향을 주지 않도록 할 수 있습니다.
  • 마지막으로, 지리적으로 분산된 시스템에서
    사용자에게 가까운 Slave를 배치하면,
    지연을 줄이고 응답 속도를 개선하는 데에도 활용할 수 있습니다.

이런 이유들 때문에 리플리케이션은 고성능 시스템을 설계할 때
필수적인 구성 요소 중 하나라고 생각합니다.

더 공부할거는 많지만 일단 넘어가면 다음은 파티셔닝이다
어제 클러스터링을 학습하였다. 이거 같은 경우는 수직 분할로 알고 있다. 그러면 정규화랑 다른점을 찾아야 하는데...

파티셔닝은 하나의 테이블을 논리적으로 분리해서 성능과 관리 효율을 높이는 기법입니다.
파티셔닝은 크게 수평 분할과 수직 분할로 나뉘고,
수평은 데이터를 범위 또는 조건으로 나누고,
수직은 자주 사용되는 컬럼만 분리해 성능을 높입니다.

반면 클러스터링은 물리적으로 여러 DB 인스턴스를 구성해서 수평 확장하는 구조입니다.
즉, 파티셔닝은 DB 내부의 테이블 최적화,
클러스터링은 DB 인프라의 확장 전략이라고 이해하면 됩니다.

파티셔닝을 사용하는 이유
“파티셔닝은 데이터 양이 많아졌을 때 쿼리 성능 저하를 방지하고,
관리를 효율적으로 하기 위해 사용합니다.

예를 들어 로그 테이블이나 주문 테이블처럼 데이터가 시간 단위로 계속 쌓이는 경우,
전체 테이블을 스캔하는 대신 해당 파티션만 조회할 수 있어서 성능이 크게 향상됩니다.

또한 파티션 단위로 백업, 삭제, 이동이 가능해 운영 관리에 유리하고,
일정 규모 이상부터는 수평적 확장을 위한 샤딩의 전단계로 활용되기도 합니다.”

이유                                                          설명

🔹 성능 향상 파티션 프루닝으로 불필요한 데이터 스캔 방지
🔹 운영 효율 파티션 단위로 백업/삭제 가능
🔹 확장 대비 추후 샤딩 구조로의 이전이 수월
🔹 아카이빙 유리 오래된 데이터를 파티션 단위로 따로 관리

 

정규화는 데이터 중복 제거와 무결성 보장을 위한 설계 전략이고,
수평 파티셔닝은 성능 최적화와 관리 효율을 위한 실행 전략입니다.
정규화는 컬럼(열)을 중심으로 관계를 나누고,
수평 파티셔닝은 값(행)을 기준으로 동일 구조 데이터를 분할합니다.

내가 여러번 학습한 샤딩이다.  근데 모르겠다.
샤딩(Sharding)이란 데이터를 수평적으로 분할하여 여러 개의 데이터베이스 서버에 나누어 저장하는 방식입니다.

샤딩의 목적

  • 데이터 증가로 인한 성능 저하 방지
  • 분산 처리를 통한 병목현상 방지
  • 시스템의 확장성과 가용성 향상

샤딩 방법 (Sharding 전략)

1. 범위(Range) 기반 샤딩

  • 데이터를 특정 범위로 나누어 저장합니다.
    • 예: 사용자 ID가 11,000은 DB1, 1,0012,000은 DB2

2. 해시(Hash) 기반 샤딩

  • 해시 함수를 이용하여 데이터를 균등하게 분산시킵니다.
    • 예: userId % 서버 수로 저장할 서버를 결정

3. 디렉터리(Directory) 기반 샤딩

  • 샤드 정보를 별도 관리하는 디렉터리 서비스를 이용합니다.
  • 데이터 위치를 유연하게 관리할 수 있습니다.

장점

  • 데이터베이스 용량과 성능 확장이 쉽습니다.
  • 시스템 장애 시 전체 서비스가 아닌 특정 샤드만 영향 받습니다.

단점

  • 데이터 조인(join)이 어려워지고 복잡성이 증가합니다.
  • 샤딩 전략을 잘못 선택할 경우 데이터가 한쪽으로 몰릴 수 있습니다.

클러스터링 vs 파티셔닝 vs 샤딩

구분설명적용 수준
클러스터링 여러 서버가 동일 데이터를 복제하여 분산 처리 서버 수준
파티셔닝 단일 DB 내에서 테이블을 나누어 관리 DB 내부
샤딩 단일 테이블 데이터를 여러 DB로 나누어 저장 DB 외부

샤딩이란 데이터가 급격히 증가할 때, 하나의 데이터베이스에 저장하는 것이 아닌, 데이터를 수평적으로 분할해 여러 개의 데이터베이스에 나누어 저장하는 방식입니다.
주로 데이터가 너무 많아서 한 개의 데이터베이스로는 감당하기 어려워질 때 성능 유지 및 확장성 확보를 위해 사용합니다. 대표적인 전략으로는 범위(Range) 기반, 해시(Hash) 기반, 디렉터리 기반 등이 있습니다.

하지만 샤딩은 데이터가 분산되어 있기 때문에 데이터 간의 조인이 어렵고, 관리가 복잡해질 수 있습니다. 따라서 정확한 샤딩 전략 선택과 구현이 매우 중요합니다

 

이제 마지막이다. 인덱스..

  • 복합 인덱스(Composite Index): 여러 칼럼을 묶어서 인덱스를 설정하는 방식이며, 자주 같이 조회되는 칼럼들을 묶을 때 사용합니다.
  • 클러스터드 인덱스(Clustered Index) vs 비클러스터드 인덱스(Non-clustered Index):
    • 클러스터드 인덱스는 실제 데이터가 인덱스 순서대로 저장됩니다(MySQL에서는 보통 Primary Key).
    • 비클러스터드 인덱스는 인덱스가 데이터의 위치만 가리킵니다(별도의 공간을 사용하여 데이터를 직접 가리킴).
 요건데 프로젝트가 원래 논클러스터드 인덱스로 갈뻔하다가 얘는 쓰기 성능이 떨어진다고 알고 있다.

"커버링 인덱스란, 쿼리에서 필요한 모든 컬럼을 인덱스가 포함하고 있어 테이블 접근 없이 인덱스 자체만으로 데이터를 얻을 수 있는 인덱스를 의미합니다. 이렇게 하면 랜덤 액세스가 줄어들어 성능이 크게 개선됩니다. 하지만 너무 많은 컬럼을 포함하면 인덱스 크기가 커져서 관리 비용이 증가하므로 신중히 사용해야 합니다."

커버링 인덱스를 효과적으로 만들려면 복합 인덱스의 컬럼 순서가 중요합니다. 첫째, 카디널리티(중복되지 않고 고유한 값의 수)가 높은 컬럼을 앞에 배치하여 데이터를 빠르게 좁힐 수 있게 합니다. 둘째, 복합 인덱스는 왼쪽부터 차례대로 읽히기 때문에, 자주 조회되는 조건의 컬럼을 앞쪽에 배치해야 효율적인 인덱스가 됩니다.

 

내일은 면접이나 복기해봐야지...

 

반응형

댓글

Designed by JB FACTORY