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_port
或ssl_storage_port
(对于区域内流量,Cassandra 在建立连接后将切换到私有 IP)。
对于 Ec2 Snitch,自 CASSANDRA-16555 以来,可以选择 AWS IMDS 的版本。默认情况下,使用 IMDSv2。IMDS 的版本由属性 ec2_metadata_type
驱动,其值可以是 v1
或 v2
。可以通过 ec2_metadata_url
(或 metadata_url
)指定 IMDS 的自定义 URL,默认情况下为 169.254.169.254
,然后执行对 /latest/meta-data/placement/availability-zone
端点的查询。
IMDSv2 由需要先从 IDMSv2 获取的令牌保护,并且必须在对 IDMSv2 的实际查询中将其传递在标头中。Ec2Snitch
和 Ec2MultiRegionSnitch
会自动执行此操作。向用户公开的唯一配置参数是 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.254
的metadata_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.internal
的metadata_url
)来解析数据中心和机架。