LLM WikiAccess-protected knowledge portal

WIKI

CockroachDB 26.x: Leader Lease·값 분리(Value Separation)·FIPS 140-3으로 분산 SQL의 운영 경계를 다시 그은 방식

왜 지금 봐야 하나 CockroachDB v26.2가 2026년 5월 22일에 공개됐다. v26.1이 2026년 2월 18일 출시됐으므로, 두 릴리스를 합치면 지난 5개월 동안 분산 SQL 운영에서 가장 중요한 세 문제를 한꺼번에 해결했다. 쓰기 증폭 Write Amplification 값 분리 Value Separation 가 v25.4에서 GA되고 v26.x에서 기본값이 됐다. Pebble 스토리지 엔진에서 블롭 파일을 이

경로human/study/content/database-frontier/33-cockroachdb-26-leader-lease-value-separation-fips.md
카테고리Study
태그#fips #infra #leader #lease #mysql #separation #study #value

왜 지금 봐야 하나

CockroachDB v26.2가 2026년 5월 22일에 공개됐다. v26.1이 2026년 2월 18일 출시됐으므로, 두 릴리스를 합치면 지난 5개월 동안 분산 SQL 운영에서 가장 중요한 세 문제를 한꺼번에 해결했다.

CockroachDB를 이미 운영 중이거나, PostgreSQL 호환 분산 SQL을 도입 검토 중인 팀이라면 이 세 변화가 아키텍처 결정에 직접 영향을 준다.

v26.1은 90일 창(2026-04-22) 밖인 2026-02-18 출시였으나 180일 창 이내다. v26.2는 2026-05-22 출시로 90일 창 이내다. 이 장은 두 릴리스를 함께 다루며, v26.2를 주 대상으로 한다.


CockroachDB 핵심 아키텍처 한눈에 보기

계층구성 요소역할
SQL 레이어DistSQL / Vectorized EngineSQL → KV 연산 변환, 분산 실행 계획
KV 레이어Range, Raft Group, Leaseholder데이터를 레인지(~128MB)로 분할, Raft로 복제
스토리지 레이어Pebble (LSM-tree 기반)로컬 KV 저장, 압축, 값 분리(blob files)

CockroachDB 아키텍처와 v26.x 주요 변화

CockroachDB v26.x 아키텍처: 레인지·Raft·Pebble·Leader Lease·값 분리 SQL 레이어 (DistSQL / Vectorized Engine) SQL 파싱 → Logical Plan → Physical Plan → 분산 TableReader (각 노드 병렬 실행) Node 1 — Leader & Leaseholder Range A (Leader) Leader Lease: Raft 리더 = Leaseholder 쓰기: proposer → 다수결 → commit 읽기: 리스 확인 없이 즉시 서빙 Pebble (값 분리 ON) 키: SST 파일 (L0–L6) 256B+ 값: blob 파일로 분리 압축 시 값 재기록 없음 → WA↓ v26.1 보안 기능 FIPS 140-3 (Go 1.24 네이티브) JWT/OIDC SSO 역할 자동 동기화 CDC Protobuf 직렬화 Node 2 — Follower Range A (Follower) Raft AppendEntries 수신 Leader 장애 시 새 리더 선출 → 새 리더가 즉시 Lease도 인수 Pebble (값 분리 ON) 복제된 동일 blob 구조 읽기 확장 시 일부 서빙 가능 v26.2 MAINTAIN 권한 소유자 아닌 사용자도 REFRESH MATERIALIZED VIEW 가능 Node 3 — Follower Range A (Follower) Quorum: 3노드 중 2노드 커밋 다수결로 내구성 보장 지리 분산 시 지역별 배치 가능 Pebble (값 분리 ON) Compaction: 키만 재정렬 blob 파일은 GC로 별도 관리 v26.2 분산 IMPORT merge SST 로컬 write → coordinator merge → ingest Raft Raft 운영 해석 Leader Lease: Raft 리더가 Lease도 보유하므로 쓰기 후 읽기가 추가 라운드트립 없이 즉시 일관성 있게 서빙된다. 리더 장애 시 새 리더 선출과 동시에 Lease 인수가 이루어져 가용성 회복 속도가 빠르다. 값 분리: Pebble 압축이 키 파일만 재정렬하고 blob 파일은 건드리지 않으므로, 대용량 값을 다루는 쓰기 집약 워크로드에서 쓰기 증폭이 최대 50% 감소한다.
CockroachDB v26.x: 레인지·Raft·Pebble 계층과 Leader Lease·값 분리 동작

1. Leader Lease: Raft 합의와 읽기 서빙을 통합한 이유

기존 구조의 문제

CockroachDB는 데이터를 레인지(Range)라는 단위로 분할한다. 기본 크기는 약 128MB며, 각 레인지는 독립적인 Raft 복제 그룹으로 관리된다. 읽기와 쓰기는 Leaseholder라고 불리는 특정 복제본이 처리한다.

문제는 Raft 리더와 Leaseholder가 반드시 같은 노드일 필요가 없다는 점이었다. Raft 리더가 노드 A에 있고 Leaseholder가 노드 B에 있으면, 쓰기 시 리더가 제안(Propose)한 후 Leaseholder에게 별도로 전달해야 했다. 또한 Lease 갱신 자체가 Raft 로그 항목으로 처리되면서 수십만 개 레인지를 가진 클러스터에서 CPU를 크게 소모했다.

Leader Lease의 동작 원리

v25.2에서 도입된 Leader Lease는 단순한 원칙을 적용한다. Raft 리더가 항상 해당 레인지의 Leaseholder가 된다.

이 변화의 효과는 세 가지다.

  1. 쓰기 경로 단순화: 리더가 제안과 서빙을 모두 처리한다. Leaseholder 에게 추가 라운드트립이 없다.
  2. 장애 복구 가속: 리더 장애 시 Raft 선출과 동시에 새 리더가 Lease도 인수한다. 기존에는 Lease 만료와 갱신 대기 시간이 따로 존재했다.
  3. CPU 절감: 수십만 개 레인지의 Lease 갱신을 Raft 로그 항목으로 별도 처리하지 않아도 된다.

단, Lease 전송(transfer)이 필요한 경우는 있다. 특정 레인지를 가까운 리전에서 더 효율적으로 서빙해야 할 때다. 이 경우 leader preference 설정으로 제어한다.

-- 레인지의 리더 선호 노드 확인
SHOW RANGES FROM TABLE orders WITH DETAILS;

-- 특정 존에 리더를 배치
ALTER TABLE orders CONFIGURE ZONE USING
  lease_preferences = '[[+zone=us-east1]]';

SIGMOD 2026 논문

Leader Lease의 설계는 2026년 SIGMOD에서 발표된 "Scalable Leader Leases For Multi Consensus Groups in CockroachDB"에 상세히 기술됐다. 핵심 기여는 수십만 개의 Raft 그룹을 가진 클러스터에서 리스 관리가 전체 CPU의 병목이 되는 문제를 "Leader = Leaseholder" 불변 조건 하나로 해결했다는 점이다. 불변 조건 유지를 위한 Raft 프로토콜 수정과 리더십 안정 메커니즘이 포함됐다.


2. 값 분리(Value Separation): Pebble 스토리지 최적화

LSM-tree의 쓰기 증폭 문제

Pebble은 RocksDB에서 영감을 받은 LSM-tree(Log-Structured Merge-tree) 기반 스토리지 엔진이다. LSM-tree는 쓰기를 빠르게 처리하지만 컴팩션(Compaction) 이라는 배경 작업에서 데이터를 여러 번 재기록한다. 이를 쓰기 증폭(Write Amplification)이라 한다.

문제는 레인지의 값이 크면 클수록 컴팩션이 더 많은 데이터를 재기록한다는 점이다. 예를 들어 각 키에 1KB 이상의 JSON 값이 붙어 있으면, 압축(L0→L6) 과정에서 이 값들이 반복적으로 읽히고 다시 쓰인다. 이는 디스크 I/O를 소진하고 지연 스파이크를 유발한다.

blob 파일로 분리하는 원리

값 분리는 LevelDB/RocksDB 계열에서 WiscKey(2016)가 제안한 아이디어를 Pebble에 맞게 구현한 것이다. 핵심은 다음과 같다.

기존 구조 (값 인라인):
  SST L4: [key1 → value(2KB)], [key2 → value(3KB)], ...
  컴팩션: 키와 값을 모두 재기록 → WA 높음

값 분리 구조:
  SST L4: [key1 → blob_ref], [key2 → blob_ref], ...
  blob 파일: [value(2KB)], [value(3KB)], ...
  컴팩션: 키와 blob_ref만 재기록 → WA 낮음

실측 효과

Cockroach Labs의 내부 벤치마크에 따르면, 쓰기 집약적이고 값이 넓은(wide-row) 워크로드에서 처리량이 최대 50% 향상됐다. 읽기 성능은 거의 영향을 받지 않았다. blob 파일은 키 조회 시 추가 I/O가 필요하지만, 대부분의 경우 OS 페이지 캐시가 이를 흡수한다.

반면, 값이 작고(256B 미만) 읽기가 많은 워크로드에서는 효과가 미미하다. 값 분리는 쓰기 집약적이고 값이 큰 컬럼이 많은 테이블에서 가장 효과가 크다.

v26.x 기준으로 값 분리는 기본값으로 켜져 있다. 필요시 클러스터 설정으로 제어할 수 있다.

-- 값 분리 임계 크기 확인 (기본값: 256 bytes)
SHOW CLUSTER SETTING storage.value_separation.minimum_size;

-- 값 분리 비활성화 (비추천)
SET CLUSTER SETTING storage.value_separation.enabled = false;

3. v26.1 보안·규정 준수: FIPS 140-3, JWT/OIDC, CDC Protobuf

v26.1은 2026년 2월 출시됐다. 핵심은 엔터프라이즈 보안 요건 세 가지를 공식 지원한 것이다.

FIPS 140-3 네이티브

기존 FIPS 지원은 OpenSSL BoringCrypto를 외부 라이브러리로 연결하는 방식이었다. 성능 오버헤드와 빌드 복잡성이 있었다. v26.1은 Go 1.24의 crypto/fips140 패키지를 사용해 FIPS 140-3을 완전히 네이티브로 구현했다.

이 변화의 운영 의미는 크다. 미국 연방 규정(NIST 2026년 9월 기한)이나 금융권 PCI DSS가 FIPS 140-3을 요구하는 경우, 외부 라이브러리 없이 표준 CockroachDB 바이너리 하나로 컴플라이언스를 충족한다.

# FIPS 모드 확인
cockroach version --details | grep -i fips

JWT/OIDC SSO 역할 자동 동기화

기존에는 OIDC로 로그인한 사용자에게 DB 역할을 수동으로 부여해야 했다. v26.1부터 IdP(Identity Provider)의 그룹 클레임(Group Claims)을 CockroachDB 역할 멤버십으로 자동 동기화한다.

예를 들어 Okta나 Azure AD에서 사용자가 db-admin 그룹에 속해 있으면, CockroachDB에서 자동으로 admin 역할이 부여된다. 온보딩·오프보딩 시 DB 역할 관리 작업이 사라진다.

-- OIDC 설정 확인
SHOW CLUSTER SETTING server.oidc_authentication.provider_url;

-- 그룹 → 역할 매핑 확인
SELECT * FROM system.role_members WHERE role = 'db-admin';

CDC Protobuf 직렬화

Kafka를 프로토버프(Protocol Buffers)로 표준화한 조직에서는 CockroachDB의 JSON/Avro 기반 CDC가 변환 레이어를 강제했다. v26.1부터 CDC(Changefeed)가 Protobuf를 직접 직렬화 포맷으로 지원한다.

CREATE CHANGEFEED FOR TABLE orders
INTO 'kafka://kafka:9092'
WITH format = 'protobuf',
     confluent_schema_registry = 'http://registry:8081';

4. v26.2 운영 개선: MAINTAIN 권한과 IMPORT 성능

MAINTAIN 권한

기존에는 Materialized View를 REFRESH하려면 소유자이거나 슈퍼유저여야 했다. 운영팀이 개발팀 소유의 View를 갱신하거나 자동화 스크립트가 주기적으로 갱신하는 경우에 권한 충돌이 생겼다.

v26.2의 MAINTAIN 권한은 이 문제를 해결한다.

-- analytics_team에 Materialized View 갱신 권한 부여
GRANT MAINTAIN ON MATERIALIZED VIEW daily_summary TO analytics_team;

-- 부여 후 소유자가 아니어도 갱신 가능
REFRESH MATERIALIZED VIEW daily_summary;

테이블에도 MAINTAIN 권한을 부여할 수 있어, 통계 갱신이나 vacuum 작업 자동화에 활용된다.

분산 IMPORT Merge

대용량 IMPORT 작업에서 새 실행 경로가 추가됐다.

기존: IMPORT 프로세서가 SST 파일을 작성하고 즉시 인제스트. v26.2: 프로세서가 로컬 스토리지에 SST를 먼저 쓰고, 코디네이터 노드가 이를 병합한 뒤 인제스트.

이 방식은 L0 SST 파일 수를 줄여 컴팩션 백로그를 방지한다. 특히 TB 단위 대용량 마이그레이션에서 IMPORT 완료 후 발생하던 성능 저하를 완화한다.

-- 분산 IMPORT merge 활성화 (기본값: off, 대용량 IMPORT 시 권장)
SET CLUSTER SETTING bulkio.import.distributed_merge.mode = 'on';

5. CockroachDB를 선택하는 기준과 피해야 할 경우

CockroachDB가 강점을 발휘하는 조건이 명확하다.

적합한 경우:

피해야 할 경우:


6. 운영 체크리스트 (v26.x 기준)

업그레이드 전

값 분리 운영

Leader Lease 운영

성능 및 모니터링


결론

CockroachDB v26.x는 분산 SQL의 세 가지 오래된 약점을 한 번에 다뤘다. Leader Lease는 합의 레이어의 스케일 제약을 완화했고, 값 분리는 쓰기 집약 워크로드의 스토리지 병목을 50% 줄였다. v26.1의 FIPS 140-3 네이티브 지원과 JWT/OIDC 역할 동기화는 엔터프라이즈 보안 도입의 마지막 장벽을 제거했다.

운영자가 이 릴리스에서 먼저 볼 것은 성능 수치가 아니라 자신의 워크로드 프로파일이다. 값이 크고 쓰기가 많은 테이블이라면 값 분리의 효과가 바로 보인다. 멀티 리전이고 리더 선출 이벤트가 성능 지표에 찍혔다면 Leader Lease 동작을 확인할 차례다. 그리고 규정 준수 요건이 있는 조직이라면, v26.1의 FIPS 140-3과 SSO 개선이 도입 결정을 바꿀 수 있다.

References