Snitch

Snitch (스니치)

Cassandra에서 snitch는 두 가지 역할을 해요. 첫째, 네트워크 토폴로지를 충분히 파악해서 요청을 효율적으로 라우팅하도록 도와주고, 둘째, 리플리카(replica)를 클러스터 전반에 분산시켜 연관 장애(correlated failure)를 피하게 해줍니다. 이 두 번째 역할은 머신을 '데이터센터'와 '랙'으로 묶는 방식으로 이뤄져요. Cassandra는 같은 '랙'(실제로는 물리적 위치가 아닐 수도 있어요)에 리플리카가 둘 이상 배치되지 않도록 최선을 다합니다.

출처: 문서

본문

다이나믹 스니칭(Dynamic snitching)

다이나믹 스니치(dynamic snitch)는 읽기 지연 시간을 모니터링해서 느려진 호스트로부터 읽는 것을 피하게 해줘요. 다이나믹 스니치는 cassandra.yaml의 다음 속성들로 구성됩니다:

  • dynamic_snitch: 다이나믹 스니치를 활성화할지 비활성화할지 여부.
  • dynamic_snitch_update_interval: 100ms. 호스트 점수 계산 중 더 비싼 부분을 얼마나 자주 수행할지 제어.
  • dynamic_snitch_reset_interval: 10m. 0보다 크게 설정하면 캐시 용량을 늘리기 위해 리플리카를 호스트에 '고정(pinning)'할 수 있게 해줌.
  • dynamic_snitch_badness_threshold: 고정된 호스트가 다른 리플리카보다 얼마나 더 나빠져야 다이나믹 스니치가 그 대신 다른 리플리카를 선호할지 제어하는 임계값. 백분율을 나타내는 double로 표현돼요. 즉 0.2 값은 고정된 호스트가 가장 빠른 호스트보다 20% 더 나빠질 때까지 Cassandra가 정적 snitch 값을 계속 선호한다는 뜻입니다.

Snitch 클래스

cassandra.yamlendpoint_snitch 파라미터는 IEndpointSnitch를 구현하는 클래스로 설정해야 해요. 이 클래스는 다이나믹 스니치로 감싸져 두 엔드포인트가 같은 데이터센터에 있는지, 같은 랙에 있는지 판단합니다. Cassandra는 기본으로 다음 snitch 구현을 제공해요.

GossipingPropertyFileSnitch 프로덕션에서 사용할 기본 snitch로 권장돼요. 로컬 노드의 랙과 데이터센터는 cassandra-rackdc.properties에 정의되고 gossip을 통해 다른 노드에 전파됩니다. cassandra-topology.properties가 존재하면 이를 폴백으로 사용해 PropertyFileSnitch에서 마이그레이션할 수 있게 해줍니다.

SimpleSnitch Strategy 순서를 근접성(proximity)으로 취급해요. 읽기 리페어를 비활성화할 때 캐시 지역성을 개선할 수 있습니다. 단일 데이터센터 배포에만 적합해요.

PropertyFileSnitch 근접성은 cassandra-topology.properties에 명시적으로 구성된 랙과 데이터센터에 의해 결정됩니다.

RackInferringSnitch 근접성은 각 노드 IP 주소의 3번째와 2번째 옥텟이 각각 랙과 데이터센터에 대응한다고 가정해 결정돼요. 배포 규칙과 우연히 일치하지 않는 한, 이 snitch는 커스텀 Snitch 클래스를 작성하는 예시로 사용하기에 좋습니다.

클라우드 기반 snitch

이 snitch들은 다양한 클라우드 벤더의 클라우드 환경에서 사용돼요. 모든 클라우드 기반 snitch 구현은 현재 AbstractCloudMetadataServiceSnitch(이것은 다시 AbstractNetworkTopologySnitch를 확장)를 확장합니다.

각 클라우드 기반 snitch는 해당 노드가 속한 랙과 데이터센터를 해석하는 방식이 각기 다릅니다. AbstractCloudMetadataServiceSnitch는 이를 달성하기 위한 가장 공통적인 장치를 캡슐화해요. 모든 클라우드 기반 snitch는 각 클라우드에 특화된 HTTP 서비스를 호출합니다. AbstractCloudMetadataServiceSnitch의 생성자는 AbstractCloudMetadataServiceConnector 구현을 받는데, 이 구현은 기본적으로 사전 정의된 HTTP URL에 대해 HTTP GET 요청을 실행하고(HTTP 헤더는 보내지 않음) HTTP 코드 200 응답을 기대하는 apiCall 메서드를 구현해요. 구현자가 원한다면 요청의 일부로 다양한 HTTP 헤더를 보낼 수 있어요.

현재 AbstractCloudMetadataServiceConnector의 유일한 구현은 DefaultCloudMetadataServiceConnector입니다. 사용자가 AbstractCloudMetadataServiceConnector의 동작을 재정의할 필요가 있다면 자체 커넥터를 구현해 AbstractCloudMetadataServiceSnitch의 생성자에 전달하면 됩니다.

모든 클라우드 기반 snitch는 cassandra-rackdc.properties에서 다음 속성을 받아들여요.

metadata_url 토폴로지 정보를 가져올 클라우드 서비스의 URL. 클라우드에 따라 다릅니다.

metadata_request_timeout 기본값 30s(30초)로, apiCall 호출에 대한 연결 타임아웃을 설정해요. 즉 그 기간 내에 응답이 없으면 metadata_url에 대한 요청이 타임아웃됩니다.

dc_suffix 해석된 데이터센터에 추가될 문자열. 기본값은 빈 문자열입니다.

내장된 클라우드 기반 snitch는 다음과 같아요.

Ec2Snitch 단일 Region이거나 inter-region VPC가 활성화된 여러 region의 EC2 배포에 적합해요(2017년 말부터 사용 가능, AWS 공지 참고). EC2 API에서 Region과 Availability Zone 정보를 로드합니다. Region은 데이터센터로, Availability Zone은 랙으로 취급돼요. 프라이빗 IP만 사용하므로, inter-region VPC가 활성화된 경우에만 여러 리전에서 동작해요.

Ec2MultiRegionSnitch 크로스 리전 연결을 위해 공개 IP를 broadcast_address로 사용해요(따라서 시드 주소도 공개 IP로 설정해야 해요). 공개 IP 방화벽에서 storage_port 또는 ssl_storage_port를 열어야 합니다(리전 내 트래픽은 연결을 설정한 뒤 프라이빗 IP로 전환됩니다).

Ec2 snitch의 경우 CASSANDRA-16555부터 AWS IMDS 버전을 선택할 수 있어요. 기본적으로 IMDSv2가 사용됩니다. IMDS 버전은 ec2_metadata_type 속성에 의해 결정되며 v1 또는 v2 값이 될 수 있어요. IMDS의 커스텀 URL은 ec2_metadata_url(또는 metadata_url)로 지정할 수 있는데, 기본값은 169.254.169.254이고 /latest/meta-data/placement/availability-zone 엔드포인트에 대한 쿼리를 실행합니다.

IMDSv2는 먼저 IMDSv2에서 토큰을 가져와야 하고, 실제 IMDSv2 쿼리를 위해 헤더에 전달해야 하는 구조로 보안이 강화되어 있어요. Ec2SnitchEc2MultiRegionSnitch는 이를 자동으로 수행합니다. 사용자에게 노출된 유일한 구성 파라미터는 ec2_metadata_token_ttl_seconds이며 기본값은 21600입니다. TTL은 [30, 21600] 범위의 정수여야 해요.

AlibabaCloudSnitch ECS 리전을 DC로, ECS availability_zone을 랙으로 가정하는 snitch예요. 이 정보는 노드의 구성에서 확인할 수 있습니다. zone-id의 형식은 cn-hangzhou-a 같은 형태인데, cn은 중국, hangzhou는 항저우 리전, a는 az id를 뜻해요. dc로는 cn-hangzhou를, zone-id로는 a를 사용합니다. 이 snitch의 metadata_url은 기본적으로 100.100.100.200/이고 /latest/meta-data/zone-id 엔드포인트에 HTTP 요청을 실행합니다.

AzureSnitch Azure snitch는 metadata_url(169.254.169.254)에 대해 /metadata/instance/compute?api-version=%s&format=json 엔드포인트를 호출해 데이터센터와 랙을 해석하며, 기본 API 버전 2021-12-13에 대해 JSON 형식으로 응답을 반환합니다. API 버전은 cassandra-rackdc.propertiesazure_api_version 속성으로 구성할 수 있어요. 데이터센터는 응답의 location 필드에서, 랙은 먼저 zone 필드를 보고 해석합니다. zone이 설정되어 있지 않거나 빈 문자열이면 platformFaultDomain 필드를 봐요. 해석된 값 앞에는 rack- 문자열이 붙습니다.

GoogleCloudSnitch Google snitch는 metadata_url(metadata.google.internal)에 대해 /computeMetadata/v1/instance/zone 엔드포인트를 호출해 데이터센터와 랙을 해석합니다.

더 알아보기 (Learn more)