데이터베이스 파쇄 및 복제
데이터베이스 파쇄 및 복제
1) 왜 필요한가
데이터베이스의 수직 업그레이드가 CPU/IO/RAM에 인접하거나 하나의 클러스터가 SPOF가되면 복제 (읽기/HA의 경우) 및 샤딩 (쓰기/데이터 분포의 경우) 이 발생합니다. 목표:- 처리량 (QPS 수평 성장 기록).
- 가용성 (빠른 장애, 단일 장애 지점 없음).
- 데이터 현지화 (다중 지역, 낮은 대기 시간).
- 시끄러운 이웃의 격리 (핫 테넌트/핫 키).
2) 기본 용어 및 일관성 모델
Primary/Leader Replica/Follower: 리더에 기록하고 복제본을 읽으십시오.
동기식 복제: N 노드에 기록 한 후 트랜잭션 확인 (낮은 RPO, 높은 대기 시간).
비동기: 리더가 커밋하고 나중에 로그를 보냅니다 (RPO> 0, 낮은 대기 시간).
Quorum (Raft/Paxos): 대부분의 노드에 쓰기; 하나의 로그, 자동 리더.
쓰기 후 읽기: 레코드 읽기 보장 (§ 5 참조).
네트워크 문제의 경우 중요한 작업을 위해 일관성 (CP) 또는 가용성 (AP) 을 선택하며 종종 다른 경로의 레벨을 결합합니다.
3) 복제: 옵션 및 관행
3. 1 물리적, 논리적
물리적 (WAL/redo/binlog): 간단하고 빠른 블록 로그에 더 가깝습니다. 균질 한 토폴로지/버전으로 제한됩니다.
논리: 행/테이블 레벨의 DML/DDL 스트림; DWH/스트리밍을위한 부분 복제본, 교차 버전 마이그레이션, CDC를 허용합니다.
3. 2 설정 및 관리
지연을 모니터링합니다 (시간/바이트/LSN).
VACUM/청소를 차단하지 않도록 핫 스탠디 피드백 및 복제본에 대한 긴 요청을 제한하십시오.
MySQL-GTID 및 오케스트레이터; 대기 슬롯 - 후원/복제 슬롯, 동기 _ 대기 _ 이름.
sql
-- on leader
ALTER SYSTEM SET synchronous_commit = 'on';
ALTER SYSTEM SET synchronous_standby_names = 'FIRST 1 (standby_a, standby_b)';
SELECT pg_reload_conf();
MySQL GTID (트랜잭션 ID):
sql
SET GLOBAL enforce_gtid_consistency = ON;
SET GLOBAL gtid_mode = ON; -- restart
CHANGE MASTER TO MASTER_AUTO_POSITION=1;
3. 3 가지 토폴로지
1 → N (리더 → 복제본) + 캐스케이드 (복제본이 더 병합 됨).
다중 1 차 (활성 활성) -엄격한 충돌 관리없이 OLTP에서는 피하십시오.
쿼럼 클러스터 (Raft) -CockroachDB/Yugabyte/PG-Raft 애드온.
4) 스플릿 및 라우팅 읽기/쓰기
항상 리더로 글을 쓰십시오. 단서에서 읽었지만 지연을 고려하십시오.
쓰기 후 읽기 전략:1. 세션 끈적 끈적함: 성공적으로 녹음 한 후 클라이언트는 '게 T' 동안 리더로부터 읽습니다.
2. LSN/GTID 게이트: 클라이언트는 "더 오래된 LSN = X를 얻고 싶지 않다" 고 말하고 라우터는 복제본으로 보냅니다.
3. Stale-ok: 일부 쿼리에서는 오래된 데이터 (디렉토리/테이프) 를 허용합니다.
도구: PgBouncer/Pgpool-II (Postgres), ProxySQL/MaxScale (MySQL), Vitess (샤드 라우팅).
LSN 게이트의 예 (아이디어): 'pg _ current _ wal _ lsn ()' 을 HT헤더/쿠키에 저장하고 라우터가 'pg _ last _ wal _ replay _ lsn ()
5) 샤딩 전략
5. 1 키 선택
키는 요청의 균일 성과 지역성을 보장해야합니다
'테넌트 _ id '/' user _ id' 에 의한 해시-균등하지만 범위 스캔을 박탈합니다.
시간/ID 범위-시계열/보관에 적합하지만 핫 샤드 위험.
일관된 해싱-파편을 쉽게 추가/제거 할 수 있습니다.
디렉토리/조회 테이블-유연하지만 (모든 알고리즘) 다른 테이블/캐시.
5. 2 개의 패턴
공유 없음: 각 파편은 별도의 데이터베이스/클러스터이며 응용 프로그램은 라우팅을 알고 있습니다.
미들웨어 샤딩: Vitess (MySQL), Citus (Postgres), 프록시 레벨 가죽 토폴로지.
연맹: 서비스별로 데이터 도메인을 분리합니다 (카탈로그, 지불, 지정).
5. 복합 키 3 개
키 공간을 사용하십시오: '{테넌트}: {엔터티}: {id}' 응용 프로그램 및 캐시에 저장하십시오. 가수 포스트 그레 - 해시 파티셔닝 + LIST/RANGE 하위 파티션.
PostgreSQL 파티션 (조각):sql
CREATE TABLE orders (
tenant_id int,
id bigint,
created_at timestamptz,
...,
PRIMARY KEY (tenant_id, id)
) PARTITION BY HASH (tenant_id);
CREATE TABLE orders_t0 PARTITION OF orders FOR VALUES WITH (MODULUS 16, REMAINDER 0);
--... t1..t15
6) ID 생성
샤딩시 "뜨거운" 단조로운 자동 증분을 피하십시오.
Snowflake와 같은 64 비트 ID (시간 + 영역 + shard + seq) 또는 ULID/KSID (단조 및 분포) 를 사용하십시오.
자이언트 포스트 그레스 - 샤드 당 시퀀스; (PHP 3 = 3.0.6, PHP 4)
7) 온라인 과잉 공유 및 마이그레이션
주요 원칙: 이중 쓰기, demempotency, 임시 이중 라우팅.
단계 (일반화):1. 새 파편/클러스터를 추가하십시오.
2. 듀얼 읽기 (일관성 검사) 사용하기
3. 이중 쓰기 (두 파편 모두), 레코드 불일치를 포함합니다.
4. 백필 히스토리 데이터 (배치, 논리/CDC 복제).
5. "진리의 원천" 을 새로운 파편으로 전환하십시오. "꼬리" 동기화를 남깁니다.
6. 오래된 것을 끄십시오.
도구: Vitess Resharding, Citus move shards, pg _ logical/pgproup, Debezium (CDC), gh-ost/pt-online-schima-change (자물쇠가없는 DDL).
8) 다중 지역 및 지리 분포
지역 당 리더 팔로워: 글로벌 리더 (간단한 모델이지만 지역 간 RTT) 를 통한 로컬 읽기, 쓰기.
멀티 리더: 두 지역에서 녹음-충돌 (타임 스탬프/버전/CRDT) 이 필요합니다.
진정한 분산 SQL (Raft): CockroachDB/Yugabyte-데이터가이 지역에 "접착" 되고 쿼리는 로컬 쿼럼으로 이동합니다.
- 돈/주문-CP (쿼럼/리더), 디렉토리/테이프-AP (캐시, 최종).
- 가능한 분할 뇌로 항상 쓰기 펜싱 (고유 키/버전) 을 계획하십시오.
9) 실제로 일관성
읽기: LSN/GTID로 "잡은" 리더 또는 큐.
모노토닉은 마지막 LSN 읽기보다 "오래되지 않음" 을 읽습니다.
쓰기 충돌 통제: 'SELECT... 업데이트 ', 버전 (' xmin '/' rowversion '), 버전 확인이있는 UPSERT
이데올로기: 지불/이벤트에 대한 demempotence 키.
10) 관찰 가능성, SLO 및 경고
복제 지연: 시간 (초), LSN 거리 (바이트), 초 _ 뒤에 _ master (MySQL).
강제 롤백/충돌, 복제 오류.
p95/p99 대기 시간대 경로 (리더 대 복제본 읽기, 쓰기).
처리량: TPS/잠금/행 경쟁 테이블.
Bloat/VACUUM (PG), InnoDB 버퍼 풀 적중률 (MySQL).
대시 보드: 파편 당 하중, "핫" 파편, 키 배포.
11) 백업, PITR 및 DR
PITR (시점 복구) 에 대한 전체 백업 + WAL/binlog입니다.
다른 지역/클라우드에 저장하고 정기적으로 테스트를 복원하십시
파편의 경우, 일관된 "슬라이스" (시간 조정/LSN) 또는 회복에 대한 적용성 dempotence.
RPO/RTO는 게임 당일에 작성 및 테스트됩니다.
bash pg_basebackup -D/backups/base -X stream -C -S slot_replica_1 WAL archiving via archive_command or pgBackRest/Barman
12) 보안 및 액세스
VPC/ACL로 세분화, 프록시로 mTLS.
최소 권리 원칙에 대한 역할/보조금; 파편/역할 당 개별 사용자.
감사 DDL/DCL, 복제본의 "무거운" 요청으로 제한됩니다.
휴식 시간에 암호화 (KMS) 및 대중 교통 (SL).
패닉 버튼: 사건/조사 기간 동안 글로벌 '읽기'.
13) 도구와 벽돌
PostgreSQL: Patroni (HA), PgBouncer (풀링/RO-routing), repmgr, pgBackRest/Barman (
MySQL: 오케스트레이터 (토폴로지/자동 장애), ProxySQL/MaxScale (라우팅), Percona Xtraback (백업), 그룹 복제/InnoDB 클러스터, Vitess (샤딩/리샤딩).
분산 SQL: CockroachDB, YugabyteDB (쿼럼, 내장 샤딩/지리적 위치).
CDC: 이벤트/ETL을위한 Debezium + Kafka/Pulsar.
14) 반 패턴
자동 장애가없고 DR 테스트가없는 단일 기본.
지연 → 팬텀 오류/의심스러운 버그를 제외한 "매직" 읽기 분할.
"샤딩을 위해" 샤딩: 수직 스케일/인덱스/캐시 대신 조기 합병증.
타임 버킷/해시 소금이없는 핫 레인지 (시간 범위) → 하나의 샤드 용융.
OLTP에서 수십 개의 파편 위에 글로벌 거래 2PC-높은 p99 꼬리와 빈번한 자물쇠.
마이그레이션 중 이중 쓰기/이중 읽기 부족 → 동기화되지 않음.
온라인 도구가없고 호환성 기능 플래그가없는 제품의 DDL.
15) 구현 점검표 (0-60 일)
0-15 일
DB SLO, RPO/RTO를 정의하십시오.
복제, 지연 모니터링, 기본 백업 + PITR 사용.
라우터 (PgBouncer/ProxySQL) 와 쓰기 후 읽기 정책을 입력하십시오.
16-30 일
샤딩 전략을 선택하고 열쇠와 체계를 설명하십시오.
과충전 도구 (Vitess/Citus/CDC) 를 준비하십시오.
"읽기 오래된" 대 "엄격한" 으로 표시된 서비스/테이블 디렉토리.
31-60 일
파일럿 샤드, 이중 읽기 및 백필을 실행하십시오.
게임 데이: 리더 실패, PITR 복구, 지역 전환.
핫 샤드 키 및 불균일보고를 자동화하십시오.
16) 성숙도 지표
Replica lag p95 <대상 (예: 중요한 읽기를 위해 500ms).
성공적인 DR 테스트는 1/4 분기 이상입니다 (RTO 복원, RPO 손실).
파편에 의한 부하 분포: QPS/스토리지에 의한 불균형 <20%.
엄격하게 일관성이 올바르게 라우팅 된 요청 비율 = 100%.
CP 보증 (돈/주문) 이 필요한 사고의 데이터 손실 제로.
다운 타임없이 온라인 DDL/마이그레이션, 호환성 플래그.
17) 레시피 예
시간 범위에 대한 해시 소금 (하나의 파편을 가열하지 않기 위해):sql
-- calculate bucket = hash (user_id)% 16, store (bucket, created_at)
PARTITION BY LIST (bucket) SUBPARTITION BY RANGE (created_at)
읽기 미들웨어 (의사 코드):
python lsn = db. leader_query("SELECT pg_current_wal_lsn()")
ctx. sticky_until = now()+5s ctx. min_lsn = lsn in the read router: select a replica with last_lsn> = ctx. min_lsn, otherwise the leader
Vitess VSchema (조각):
json
{
"tables": {
"orders": { "column_vindexes": [{ "column": "tenant_id", "name": "hash" }] }
}
}
18) 결론
샤딩 및 복제는 기술 일뿐만 아니라 일관성 인식 라우팅, 마이그레이션 분야 (이중 쓰기/읽기, 백필), 일반 DR 테스트 및 지연/핫 샤드 관찰 프로세스이기도합니다. 간단한 + 쓰기 후 리더 → 복제본으로 시작한 다음로드 프로파일에 실제로 필요한 곳에 샤딩을 추가하십시오. 기성품 플랫폼 (Vitess/Citus/Distributed SQL) 을 사용하고 비즈니스에 중요한 데이터를 CP 모드로 유지하십시오. 이러한 방식으로베이스는 병목 현상이 발생하지 않고 플랫폼의 예측 가능하고 탄력적 인 기반이됩니다.