균등 데이터베이스 샤딩: 데이터 분산 및 쿼리 처리 전략
균등 샤딩은 미리 정의된 파티셔닝 키 없이 데이터를 여러 샤드에 분산하는 데이터베이스의 수평 확장 기법입니다. 비즈니스 로직이 고정 키를 허용하지 않거나 키의 효과가 시간이 지나면서 떨어질 때 유용합니다. 주요 목표는 부하를 균등하게 분산하고 노드 간 레코드 분포를 고르게 유지하는 것으로, 요구사항이 변화하는 시스템에 필수적입니다.
균등 데이터 분산 원리
균등성은 두 가지 주요 방법으로 달성됩니다: 랜덤 샤드 선택 또는 노드 부하 기반 선택. 랜덤 분산은 구현이 간단하지만 샤드 초기 크기가 다르면 불균형을 바로잡지 못합니다. 더 유연한 방법은 현재 레코드 수에 따른 샤드 우선순위를 사용하며, 이를 통해:
- 불균등한 시작 지점에서도 자동 부하 평준화.
- 클러스터 내 하드웨어 차이를 우선순위 조정으로 보상.
- 유지보수나 아카이빙 시 쓰기 제외(예: 우선순위 0).
부하 모니터링을 위해 서비스는 주기적으로 각 샤드의 주요 테이블 크기를 쿼리하고, 오버헤드를 최소화하기 위해 값을 캐시합니다.
객체 식별자 생성 및 사용
균등 샤딩에서 객체 ID는 샤드 정보를 포함해야 합니다. 예를 들어 숫자 키에 오프셋이나 시드를 내장합니다. 이렇게 하면 특정 ID로 SELECT나 UPDATE 같은 OLTP 작업이 빨라지며, ID에서 샤드를 바로 파악할 수 있습니다. 키 생성 전략은 효율적이어야 합니다:
- 키 요청 시 한 번에 배치(예: NN개)를 반환해 성능 병목 방지.
- 테이블별 시드는 샤드 시스템 테이블이나 연결 설정에 저장해 유연 관리.
- 비즈니스 서비스는 객체 삽입 전 DML 쿼리로 새 키를 가져와 데이터 무결성 보장.
참조 테이블 및 논리적 복제 관리
샤딩 시스템에는 조회 테이블(참조 테이블)이 많습니다. 크기는 작고 업데이트는 드물지만 쿼리 정확성에 필수적입니다. 모범 사례:
- 참조 테이블을 전용 DB 인스턴스에 저장하고 거기서만 업데이트.
- 논리적 복제(예: PostgreSQL 기능)로 샤드에 동기화.
- 샤드 부하 감소와 데이터 일관성 유지, 중복 업데이트 노력 최소화.
분산 환경에서의 데이터 검색 및 페이징
균등 샤딩에서 샤드 키를 모르는 검색은 노드 간 조정이 필요합니다. 날짜 내림차순 정렬된 주문 피드의 3페이지를 가져온다고 가정하면, 코디네이터(프록시나 비즈니스 서비스)가 다음과 같이 처리합니다:
- 모든 샤드에 쿼리 브로드캐스트, 페이지 경계 조정: LIMIT은 페이지 크기 * 페이지 번호 + 1, OFFSET은 항상 0.
- 각 샤드가 LIMIT 내 로컬 정렬 데이터를 반환.
- 코디네이터가 모든 결과를 병합해 한 번에 전역 정렬.
- 병합 리스트에서 요청 페이지 추출해 사용자에게 반환.
읽기 일관성을 보장하지만 깊은 페이징 시 메모리 집약적입니다. 완화 방안:
- 사용자는 깊이 들어가지 않으므로 일반 케이스 최적화.
- 대용량 내보내기(XLSX/CSV)는 메모리 여유 있는 전용 서비스로 비동기 파일 생성, 순차 처리.
페이징 구현 예시
샤드 A, B에 id 컬럼으로 분산된 테이블 t1을 가정합니다. id 오름차순으로 2개 레코드 1페이지를 요청하면: SELECT id FROM t1 ORDER BY id LIMIT 3 OFFSET 0. 코디네이터가 각 샤드에 보내 병합·정렬 후 페이지 반환. 2페이지는 LIMIT 5(2 * 2 + 1)로 더 많은 데이터 감지하고 "다음 페이지" 버튼 표시. 성능과 일관성 균형, 탐색 깊이에 적응.
주요 요약
- 균등 샤딩은 부하 분산으로 동적 파티셔닝 키 처리.
- 객체 ID에 샤드 정보 내장으로 OLTP 속도와 라우팅 향상.
- 참조 테이블 논리적 복제로 업데이트 오버헤드 감소.
- 조정 페이징은 메모리 최적화 필요하지만 일반 사용자 흐름에 적합.
- 대용량 내보내기는 비동기 처리로 핵심 시스템 영향 최소화.
— Editorial Team
아직 댓글이 없습니다.