일시적 복제

일시적 복제 (Transient Replication)

참고: Transient Replication(CASSANDRA-14404)은 애플리케이션과 배포를 위해 데이터베이스의 모든 측면을 검증할 수 있는 전문 Apache Cassandra 사용자를 위해 설계된 실험적 기능이에요. 즉, 읽기, 쓰기, decommission, remove, rebuild, repair, replace 같은 연산이 쿼리, 데이터, 구성, 운영 관행, 가용성 요구 사항과 모두 동작하는지 확인할 수 있어야 해요. Apache Cassandra 4.0에 transient replication의 초기 구현이 있어요. 향후 Cassandra 릴리스에서 이 기능을 더 넓은 사용자층에 적합하게 만들 거예요. 향후 버전이 transient replication으로 모노토닉 읽기, LWT, 로그 배치, 카운터도 지원할 것으로 예상돼요. 실험적이므로 transient replication은 프로덕션 사용에 권장되지 않아요.

출처: Transient Replication

본문

목표 (Objective)

transient replication의 목표는 점진적 복구(incremental repair)를 사용해 저장 요구 사항을 데이터 중복(또는 합의 그룹 크기)에서 분리하고, 저장 오버헤드를 줄이는 것이에요. 일부 노드는 전체 레플리카(full replica)로 작동하고(주어진 토큰 범위의 모든 데이터를 저장), 일부 노드는 일시적 레플리카(transient replica)로 작동하며 같은 토큰 범위에 대해 미복구(unrepaired) 데이터만 저장해요.

transient replication으로 가능해진 최적화를 "Cheap quorums"라고 해요. 저장 사용량의 대응하는 증가 없이 데이터 중복이 증가한다는 것을 의미해요.

transient replication은 충분한 전체 레플리카가 모든 데이터를 받고 저장하는 데 사용할 수 없을 때 유용해요. transient replication을 사용하면 복제 대상 세트를 구성해 점진적으로 복구되지 않은 데이터만 복제할 수 있어요. 최적화로, 전체 레플리카에 데이터를 성공적으로 썼다면 일시적 레플리카에 쓰는 것을 피할 수 있어요.

점진적 복구 후 일시적 레플리카에 저장된 일시적 데이터는 버릴 수 있어요.

Transient Replication 활성화

transient replication은 기본적으로 활성화되지 않아요. 클러스터의 각 노드에서 cassandra.yaml에 다음 구성 속성을 설정해 개별적으로 활성화해야 해요.

transient_replication_enabled: true

transient replication은 SimpleStrategyNetworkTopologyStrategy 모두로 구성할 수 있어요. transient replication은 복제 계수를 <total_replicas>/<transient_replicas>로 설정해 구성해요.

예를 들어 복제 계수(RF) 3으로 키스페이스를 만들어요.

CREATE KEYSPACE CassandraKeyspaceSimple WITH replication = {'class': 'SimpleStrategy',
'replication_factor' : 4/1};

또 다른 예로, some_keysopace keyspace는 DC1에 3개의 레플리카(그중 1개는 일시적)와 DC2에 5개의 레플리카(그중 2개는 일시적)를 가질 거예요:

CREATE KEYSPACE some_keysopace WITH replication = {'class': 'NetworkTopologyStrategy',
'DC1' : '3/1'', 'DC2' : '5/2'};

일시적으로 복제된 키스페이스는 read_repairNONE으로 설정된 테이블만 지원해요.

중요한 제한 사항:

  • 일부 엔드포인트가 정상 상태가 아닐 때는 RF를 변경할 수 없어요(범위 이동 없음).
  • 일시적 레플리카가 있으면 전체 레플리카를 추가할 수 없어요. 먼저 모든 일시적 레플리카를 제거하고 전체 레플리카 수를 변경한 다음 일시적 레플리카를 다시 추가해야 해요.
  • 각 시간 사이에 점진적 복구를 실행하면서 일시적 레플리카 수를 한 번에 하나씩만 안전하게 늘릴 수 있어요.

또한 transient replication은 다음에 사용할 수 없어요.

  • 모노토닉 읽기 (Monotonic Reads)
  • 경량 트랜잭션 (LWTs)
  • 로그 배치 (Logged Batches)
  • 카운터 (Counters)
  • 구체화된 뷰를 사용하는 키스페이스
  • 보조 인덱스 (2i)

Cheap Quorums

Cheap quorums는 요청된 일관성 레벨을 충족할 만큼 충분한 전체 레플리카를 사용할 수 없을 때까지 일시적 레플리카에 쓰는 것을 피하기 위한 쓰기 경로의 최적화 세트예요. 일시적 레플리카에는 힌트가 절대 쓰여지지 않아요. 읽기 경로의 최적화는 일시적 레플리카에서 읽기를 선호해요. transient replication을 사용하도록 구성된 테이블에 quorum으로 쓸 때, quorum은 일시적 레플리카가 쓰기를 처리할 필요가 없도록 항상 사용 가능한 전체 레플리카를 일시적 레플리카보다 선호해요. 전체 레플리카가 느리거나 사용할 수 없을 때는 일시적 레플리카에 쓰기를 보내 빠른 쓰기 보호(빠른 읽기 보호와 유사)로 꼬리 지연 시간(tail latency)을 줄여요. 일시적 레플리카는 데이터가 없으면 블룸 필터 검사 이상을 할 필요가 없으므로 읽기를 더 빠르게 제공할 수 있어요. vnode와 큰 클러스터 크기에서는 하나 이상의 전체 레플리카가 실패해도 일시적 레플리카가 일부 임시 복제 범위에 대해 꾸준한 양의 쓰기 트래픽을 제공하기 시작하는 상황에서도 많은 데이터를 가지지 않을 거예요.

투기적 쓰기 옵션 (Speculative Write Option)

CREATE TABLE은 transient replica와 함께 사용하기 위해 speculative_write_threshold 옵션을 추가해요. 이 옵션은 simple 타입이며 기본값은 99PERCENTILE이에요. 레플리카가 느리거나 응답하지 않을 때 speculative_write_threshold는 cheap quorum 쓰기가 일시적 레플리카를 포함하도록 승격되는 임계값을 지정해요.

Pending 범위와 일시적 레플리카 (Pending Ranges and Transient Replicas)

Pending ranges는 일시적 레플리카 간의 토큰 범위 이동을 나타내요. 임시 범위가 이동될 때, 이동이 적용된 후 읽기 quorum이 응답을 반환할 수 있도록 두 일시적 레플리카가 논리적 일시적 레플리카를 위한 쓰기를 받아야 하는 기간이 있을 거예요. 확장 중에 노드는 일시적으로 일시적 레플리카가 아니에요. 읽기를 제공할 수 있기 전에 임시 범위에 대해 전체 레플리카처럼 데이터를 스트리밍해요. 전체 레플리카에 대한 pending 상태가 있는 것처럼 pending 상태가 발생해요. 일시적 레플리카도 pending일 때 항상 쓰기를 받아요. Pending 임시 범위는 조금 더 많은 데이터를 보내고 읽기가 피해져요.

읽기 복구와 일시적 레플리카 (Read Repair and Transient Replicas)

읽기 복구는 일시적 레플리카를 복구하려고 시도하지 않아요. 읽기는 항상 적어도 하나의 전체 레플리카를 포함해요. 가능한 곳에서는 일시적 레플리카를 선호해야 해요. 범위 스캔은 스캔된 모든 범위가 하나의 전체 레플리카를 포함한다는 요구 사항을 충족하는 레플리카 선택을 수행하도록 보장해요. 점진적 및 검증 복구 처리 중 일시적 레플리카에서 anti-compaction은 임시 범위에 대해 어떤 데이터도 출력하지 않아요. 데이터는 복구 후 버려지고 일시적 레플리카에는 데이터가 절대 스트리밍되지 않기 때문이에요.

전체 레플리카와 일시적 레플리카 사이 전환 (Transitioning between Full Replicas and Transient Replicas)

transient replication이 도입한 추가 상태 전환은 스트리밍과 nodetool cleanup이 다르게 동작해야 해요. 데이터가 스트리밍될 때 전체 레플리카에서 일시적 레플리카가 아닌 곳에서 스트리밍되도록 보장돼요.

미복제에서 일시적 복제로 전환하는 것은 다음 점진적 복구가 완료될 때까지 노드가 pending 상태로 유지되어야 함을 의미해요. 이때 그 범위의 데이터가 전체 레플리카에서 사용 가능한 것으로 알려져요.

일시적 복제에서 전체 복제로 전환하려면 전체 레플리카에서 스트리밍이 필요하며, 미복제에서 복제로 전환할 때 데이터가 스트리밍되는 방식과 동일해요. 전환은 스트리밍이 완료될 때까지 일시적 레플리카가 전체 레플리카로 읽히지 않도록 관리돼요. 즉시 쓰기 quorum에 사용될 수 있어요.

전체 복제에서 일시적 복제로 전환하려면 공간을 회수하기 위해 일시적으로 복제된 범위에서 복구된 데이터를 제거하는 cleanup이 필요해요. 즉시 쓰기 quorum에 사용될 수 있어요.

일시적 복제에서 미복제로 전환하려면 이전에 일시적으로 복제된 데이터를 제거하기 위해 cleanup을 실행해야 해요.

transient replication이 사용 중일 때는 노드 추가/제거, RF 변경, DC 추가/제거를 포함한 링 변경이 지원돼요.

Transient Replication은 EACH_QUORUM 지원

(CASSANDRA-14727)은 EACH_QUORUM에 대한 Transient Replication 지원을 추가해요. (CASSANDRA-14768)에 따라, 기다려야 하는 응답 수와 요청된 일관성 레벨과 관계없이 모든 DC에서 최소 QUORUM의 노드에 쓰는 것을 보장해요. 이는 transient replication으로 사용자를 최소한으로 놀라게 하기 위한 것이에요. 일반 쓰기에서는 모든 노드에 써서 도달 가능한 모든 DC에서 QUORUM에 도달하는 것을 소프트 보장해요. ACK를 기다리지 않더라도 두 경우 모두 충분한 메시지를 보냈어요.

더 알아보기 (Learn more)