개선된 스트리밍

개선된 스트리밍 (Improved Streaming)

Apache Cassandra 4.0은 스트리밍에 여러 개선을 했어요. 스트리밍은 클러스터의 노드가 SSTable 형태로 데이터를 교환하는 데 사용하는 과정이에요. SSTable의 스트리밍은 다음과 같은 여러 연산을 위해 수행돼요.

출처: Improved Streaming

본문

  • SSTable Repair
  • Host Replacement
  • Range movements
  • Bootstrapping
  • Rebuild
  • Cluster expansion

Netty 기반 스트리밍 (Streaming based on Netty)

Cassandra 4.0의 스트리밍은 Netty를 사용한 Non-blocking Input/Output(NIO) 기반이에요(CASSANDRA-12229). 이는 스트리밍 메시지와 파일 전송의 단일 스레드(또는 순차), 동기, 블로킹 모델을 대체해요. Netty는 동시에 여러 연결이 열리는 비차단, 비동기, 다중 스레드 스트리밍을 지원해요. 비차단은 스레드가 보낸 요청에 대한 응답을 기다리지 않으므로 차단되지 않는다는 것을 의미해요. 응답은 다른 스레드에서 반환될 수 있어요. 비동기이므로 연결과 스레드는 분리되어 1:1 관계가 없어요. 스레드보다 몇 배 더 많은 연결이 열릴 수 있어요.

제로 카피 스트리밍 (Zero Copy Streaming)

4.0 이전에는 스트리밍하는 동안 Cassandra가 SSTable을 객체로 재구체화했어요. 이는 불필요한 가비지를 생성하고 일부 SSTable이 개별 파티션이 아닌 전체 파일로 전송될 수 있으므로 전체 스트리밍 과정을 느리게 했어요. Cassandra 4.0은 ZeroCopy API를 사용한 더 빠른 스트리밍을 위해 가능할 때 전체 SSTable을 스트리밍하는 지원을 추가했어요(CASSANDRA-14556). 활성화하면 Cassandra는 적격한 SSTable에 ZeroCopy를 사용해 전송을 크게 가속화하고 처리량을 높여요. 제로 카피 경로는 보내는 쪽과 받는 쪽 모두에서 데이터를 user-space로 가져오는 것을 피해요. 스트리밍 관련 연산은 모두 해당하는 개선을 느낄 거예요. 제로 카피 스트리밍은 하드웨어에 바인딩되며, 하드웨어 한계(네트워크와 디스크 IO)에 의해서만 제한돼요.

고가용성 (High Availability)

벤치마크 테스트에서 Zero Copy Streaming은 파티션 기반 스트리밍보다 5배 빠르며, 더 빠른 스트리밍은 개선된 가용성의 이점을 제공해요. 클러스터의 복구는 주로 스트리밍 속도에 의존하며, 실패한 노드가 있는 Cassandra 클러스터는 훨씬 더 빨리(5배) 복구할 수 있어요. 노드가 실패하면 SSTable을 교체 노드로 스트리밍해야 해요. 교체 연산 중에 새 Cassandra 노드는 이 새 노드의 토큰 범위에 속하는 데이터 사본을 보유한 이웃 노드에서 SSTable을 스트리밍해요. 저장된 데이터 양에 따라 이 과정은 상당한 네트워크 대역폭이 필요하고 완료하는 데 시간이 걸릴 수 있어요. 이런 범위 이동 연산이 오래 걸릴수록 클러스터 가용성을 더 많이 잃어요. 여러 노드의 실패는 고가용성을 크게 낮출 거예요. 새 노드가 데이터 스트리밍을 빨리 완료할수록 더 빨리 트래픽을 제공할 수 있어서 클러스터의 가용성이 높아져요.

제로 카피 스트리밍 활성화 (Enabling Zero Copy Streaming)

제로 카피 스트리밍은 cassandra.yaml에서 다음 설정을 설정해 활성화돼요.

stream_entire_sstables: true

제로 카피 스트리밍은 기본적으로 활성화돼요.

제로 카피 스트리밍에 적격한 SSTable

SSTable의 모든 파티션을 전송해야 할 때 제로 카피 스트리밍이 사용돼요. 이는 LeveledCompactionStrategy를 사용하거나 SSTable을 토큰 범위로 분할하는 것이 활성화되었을 때 흔해요. SSTable의 모든 파티션 키를 반복해 제로 카피 스트리밍 적격성을 결정해요.

제로 카피 스트리밍의 이점 (Benefits of Zero Copy Streaming)

활성화하면 Cassandra가 모든 컴포넌트를 포함해 적격한 전체 SSTable을 노드 간에 제로 카피 스트리밍할 수 있게 해 줘요. 이는 stream_throughput_outbound로 지정된 스로틀링에 따라 네트워크 전송을 크게 가속화해요.

활성화하면 보내고 받는 노드의 GC 부담을 줄여줘요. 이 기능은 디스크 균형을 유지하려고 하지만 보장할 수는 없어요. internode 암호화가 활성화되면 이 기능은 자동으로 비활성화돼요. 현재는 Leveled Compaction과 함께 사용할 수 있어요.

제로 카피 스트리밍 구성 (Configuring for Zero Copy Streaming)

스로틀링은 스트리밍 속도를 줄여요. stream_throughput_outbound는 노드의 모든 아웃바운드 스트리밍 파일 전송을 주어진 총 처리량(Mbps)으로 조절해요. 설정되지 않으면 기본값은 200 Mbps 또는 24 MiB/s예요.

stream_throughput_outbound: 24MiB/s

Zero Copy 스트리밍 벤치마크를 실행하려면 stream_throughput_outbound를 매우 높은 값으로 설정해야 해요. 그렇지 않으면 스로틀링이 상당해 벤치마크 결과가 의미가 없어요.

inter_dc_stream_throughput_outbound는 데이터센터 간 모든 스트리밍 파일 전송을 조절해요. 이 설정은 stream_throughput_outbound로 구성된 모든 네트워크 스트림 트래픽 조절에 더해 inter dc 스트림 처리량을 조절할 수 있게 해 줘요. 설정되지 않으면 기본값은 200 Mbps 또는 25 MB/s예요.

inter_dc_stream_throughput_outbound: 24MiB/s

제로 카피 스트리밍으로 스트리밍되는 SSTable 컴포넌트

Zero Copy Streaming은 전체 SSTable을 스트리밍해요. SSTable은 별도 파일의 여러 컴포넌트로 구성돼요. 스트리밍되는 SSTable 컴포넌트는 표 1에 나열돼 있어요.

SSTable 컴포넌트 설명
Data.db SSTable의 기본 데이터. 나머지 컴포넌트는 데이터 컴포넌트를 기반으로 재생성될 수 있어요.
Index.db 데이터 파일의 위치를 가리키는 행 키의 인덱스.
Filter.db SSTable의 행 키에 대한 직렬화된 블룸 필터.
CompressionInfo.db 압축되지 않은 데이터 길이, 청크 오프셋 등에 대한 정보를 담는 파일.
Statistics.db SSTable 내용에 대한 통계 메타데이터.
Digest.crc32 데이터 파일 size_bytes의 CRC32 체크섬을 보유해요.
CRC.db 압축되지 않은 파일의 청크에 대한 CRC32를 보유해요.
Summary.db SSTable Index Summary(Index 컴포넌트의 샘플링)를 보유해요.
TOC.txt 목차. SSTable의 모든 컴포넌트 목록을 저장해요.

커스텀 컴팩션 전략 같은 것이 사용하는 커스텀 컴포넌트도 포함될 수 있어요.

복구 스트리밍 미리보기 (Repair Streaming Preview)

nodetool repair로 복구하는 것은 복구된 SSTable의 스트리밍을 포함하며, 수행해야 할 복구 스트리밍 양의 추정치를 제공하기 위해 복구 미리보기가 추가됐어요. 복구 미리보기(CASSANDRA-13257)는 다음 옵션으로 nodetool repair --preview를 호출해 실행돼요:

-prv, --preview

스트리밍할 범위와 데이터 양을 결정하지만 실제로 복구를 수행하지는 않아요.

키스페이스 스트리밍 병렬화 (Parallelizing of Streaming of Keyspaces)

부트스트랩과 리빌드에 대한 서로 다른 키스페이스의 스트리밍은 Cassandra 4.0에서 병렬화됐어요(CASSANDRA-4663).

멀티 DC 배포에서 스트리밍을 위한 고유 노드 (Unique nodes for Streaming in Multi-DC deployment)

각 DC의 레플리카 수가 3개 이상일 때 Range Streamer는 데이터를 스트리밍할 고유 노드를 선택해요(CASSANDRA-4650). 이 최적화가 하는 일은 클러스터 전체에 스트리밍 부하를 고르게 분산하는 것이에요. 최적화가 없으면 어떤 노드가 다른 노드보다 더 많은 데이터를 스트리밍하도록 선택될 수 있어요. 이 패치는 하나의 범위만 스트리밍하도록 전용 노드를 선택할 수 있게 해 줘요.

이것은 노드 부트스트래핑 성능을 높이고 데이터를 제공하는 노드에 더 적은 부담을 줄 거예요. 각 DC의 N < 3이면 2개 노드에서만 스트리밍하므로 이는 영향을 주지 않아요.

스트림 연산 타입 (Stream Operation Types)

특정 스트림의 타입 또는 목적을 아는 것이 중요해요. 버전 4.0(CASSANDRA-13064)은 서로 다른 스트림 타입을 구분하기 위해 enum을 추가해요. 스트림 타입은 스트림 요청과 스트림 태스크 모두에서 사용할 수 있어요. 서로 다른 스트림 타입은 다음과 같아요.

  • Restore replica count
  • Unbootstrap
  • Relocation
  • Bootstrap
  • Rebuild
  • Bulk Load
  • Repair

레플리카 수가 구성된 RF 아래로 떨어질 때 Decommission 허용 안 함 (Disallow Decommission when number of Replicas will drop below configured RF)

CASSANDRA-12510은 레플리카 수를 구성된 복제 계수(RF) 아래로 낮출 decommission을 방어하며, 의도적인 경우 decommission을 계속 허용하는 --force 옵션을 추가해요. 이 노드가 레플리카 수를 구성된 RF 아래로 줄이더라도 강제로 decommission해요.

더 알아보기 (Learn more)