Cassandra 文档

版本

您正在查看预发布版本的文档。

Snitch

在 Cassandra 中,Snitch 有两个功能

  • 它向 Cassandra 教授有关您的网络拓扑结构的足够信息,以便高效地路由请求。

  • 它允许 Cassandra 将副本分散到您的集群中,以避免相关故障。它通过将机器分组到“数据中心”和“机架”中来实现这一点。Cassandra 会尽力避免在同一个“机架”上拥有多个副本(这可能不是实际位置)。

动态 Snitch

动态 Snitch 监控读取延迟,以避免从速度变慢的主机读取。动态 Snitch 在 cassandra.yaml 上使用以下属性进行配置

  • dynamic_snitch:是否启用或禁用动态 Snitch。

  • dynamic_snitch_update_interval:100 毫秒,控制执行主机评分计算的更昂贵部分的频率。

  • dynamic_snitch_reset_interval:10 分钟,如果设置为大于零,这将允许将副本“固定”到主机,以提高缓存容量。

  • dynamic_snitch_badness_threshold::糟糕阈值将控制固定主机必须比其他副本差多少,才能使动态 Snitch 更倾向于其他副本。这表示为一个双精度数,代表百分比。因此,值为 0.2 表示 Cassandra 将继续优先考虑静态 Snitch 值,直到固定主机比最快的副本差 20% 为止。

Snitch 类

cassandra.yaml 中的 endpoint_snitch 参数应设置为实现 IEndpointSnitch 的类,该类将被动态 Snitch 包装,并决定两个端点是否在同一个数据中心或同一个机架上。开箱即用,Cassandra 提供了以下 Snitch 实现

GossipingPropertyFileSnitch

这应该是您在生产环境中使用的首选 Snitch。本地节点的机架和数据中心在 cassandra-rackdc.properties 中定义,并通过 Gossip 传播到其他节点。如果 cassandra-topology.properties 存在,则将其用作后备,允许从 PropertyFileSnitch 迁移。

SimpleSnitch

将策略顺序视为邻近性。这可以在禁用读取修复时提高缓存局部性。仅适用于单数据中心部署。

PropertyFileSnitch

邻近性由机架和数据中心决定,这些信息在 cassandra-topology.properties 中明确配置。

RackInferringSnitch

邻近性由机架和数据中心决定,这些信息假定分别对应于每个节点 IP 地址的第三个和第二个八位字节。除非这恰好与您的部署约定相匹配,否则最好将其用作编写自定义 Snitch 类的示例,并以此精神提供。

基于云的 Snitch

这些 Snitch 用于各种云供应商的云环境中。所有基于云的 Snitch 实现目前都扩展了 AbstractCloudMetadataServiceSnitch(它又扩展了 AbstractNetworkTopologySnitch)。

每个基于云的 Snitch 都有自己的方式来解析相应节点所属的机架和数据中心。AbstractCloudMetadataServiceSnitch 封装了实现它的最常见机制。所有基于云的 Snitch 都调用特定于相应云的 HTTP 服务。AbstractCloudMetadataServiceSnitch 的构造函数接受 AbstractCloudMetadataServiceConnector 的实现,该实现实现了一个方法 apiCall,该方法默认情况下会对预定义的 HTTP URL 执行 HTTP GET 请求,不发送任何 HTTP 标头,并且它期望响应的 HTTP 代码为 200。如果实现者需要,可以作为请求的一部分发送各种 HTTP 标头。

目前,AbstractCloudMetadataServiceConnector 的唯一实现是 DefaultCloudMetadataServiceConnector。如果用户需要覆盖 AbstractCloudMetadataServiceConnector 的行为,用户可以实现自己的连接器并将其传播到 AbstractCloudMetadataServiceSnitch 的构造函数中。

所有基于云的 Snitch 都在 cassandra-rackdc.properties 中接受这些属性

metadata_url

用于从云服务检索拓扑信息的 URL,这与云相关。

metadata_request_timeout

30s(30 秒)的默认值设置 apiCall 调用时的连接超时。换句话说,如果在该时间段内没有收到响应,则对 metadata_url 的请求将超时。

dc_suffix

一个字符串,默认情况下为空,它将附加到解析的数据中心。

内置的基于云的 Snitch 是

Ec2Snitch

适用于单个区域中的 EC2 部署,或在启用区域间 VPC 的多个区域中部署(从 2017 年底开始提供,请参阅 AWS 公告)。从 EC2 API 加载区域和可用区信息。区域被视为数据中心,可用区被视为机架。仅使用私有 IP,因此只有在启用区域间 VPC 时,这才能跨多个区域工作。

Ec2MultiRegionSnitch

使用公共 IP 作为 broadcast_address 以允许跨区域连接(因此,您也应该将种子地址设置为公共 IP)。您需要在公共 IP 防火墙上打开 storage_portssl_storage_port(对于区域内流量,Cassandra 在建立连接后将切换到私有 IP)。

对于 Ec2 Snitch,自 CASSANDRA-16555 以来,可以选择 AWS IMDS 的版本。默认情况下,使用 IMDSv2。IMDS 的版本由属性 ec2_metadata_type 驱动,其值可以是 v1v2。可以通过 ec2_metadata_url(或 metadata_url)指定 IMDS 的自定义 URL,默认情况下为 169.254.169.254,然后执行对 /latest/meta-data/placement/availability-zone 端点的查询。

IMDSv2 由需要先从 IDMSv2 获取的令牌保护,并且必须在对 IDMSv2 的实际查询中将其传递在标头中。Ec2SnitchEc2MultiRegionSnitch 会自动执行此操作。向用户公开的唯一配置参数是 ec2_metadata_token_ttl_seconds,默认情况下设置为 21600。TTL 必须是 [30, 21600] 范围内的整数。

AlibabaCloudSnitch

一个 Snitch,它假定 ECS 区域是 DC,ECS 可用区是机架。此信息在节点的配置中可用。区域 ID 的格式类似于 cn-hangzhou-a,其中 cn 表示中国,hangzhou 表示杭州区域,a 表示 AZ ID。我们使用 cn-hangzhou 作为 DC,使用 a 作为区域 ID。此 Snitch 的 metadata_url 默认情况下为 100.100.100.200/,它将对端点 /latest/meta-data/zone-id 执行 HTTP 请求。

AzureSnitch

Azure Snitch 将通过调用 /metadata/instance/compute?api-version=%s&format=json 端点(针对 169.254.169.254metadata_url)来解析数据中心和机架,并以 JSON 格式返回响应,默认情况下,API 版本为 2021-12-13。API 版本可以通过 cassandra-rackdc.properties 中的属性 azure_api_version 进行配置。数据中心从响应的 location 字段解析,机架从 zone 字段解析。当 zone 未设置或为空字符串时,它将查看 platformFaultDomain 字段。解析后的值前缀为 rack- 字符串。

GoogleCloudSnitch

Google Snitch 将通过调用 /computeMetadata/v1/instance/zone 端点(针对 metadata.google.internalmetadata_url)来解析数据中心和机架。