密探
在 Cassandra 中,密探具有兩個功能
-
它教導 Cassandra 關於您的網路拓撲的足夠知識,以便有效路由請求。
-
它允許 Cassandra 在您的叢集中散佈複本,以避免相關的故障。它透過將機器分組為「資料中心」和「機架」來執行此操作。Cassandra 將盡力避免在同一個「機架」(實際上可能不是物理位置)上放置多個複本。
動態密探
動態密探會監控讀取延遲,以避免從已變慢的主機讀取。動態密探會使用 cassandra.yaml
上的下列屬性進行設定
-
dynamic_snitch
:是否應啟用或停用動態密探。 -
dynamic_snitch_update_interval
:100 毫秒,控制執行主機評分計算中較昂貴部分的頻率。 -
dynamic_snitch_reset_interval
:10 分鐘,如果設定大於 0,這將允許將複本「固定」到主機,以增加快取容量。 -
dynamic_snitch_badness_threshold:
:壞度臨界值將控制固定主機必須比其他複製品差多少,動態 snitch 才會優先選擇其他複製品。這表示為一個代表百分比的雙精度數值。因此,值 0.2 表示 Cassandra 會繼續優先選擇靜態 snitch 值,直到固定主機比最快的慢 20%。
Snitch 類別
cassandra.yaml
中的 endpoint_snitch
參數應設定為實作 IEndpointSnitch
的類別,該類別將由動態 snitch 封裝,並決定兩個端點是否位於同一個資料中心或同一個機架上。Cassandra 提供現成的 snitch 實作
- GossipingPropertyFileSnitch
-
這應該是您在生產環境中使用的首選 snitch。本機節點的機架和資料中心定義在 cassandra-rackdc.properties 中,並透過八卦傳播到其他節點。如果存在
cassandra-topology.properties
,它會用作備用,允許從 PropertyFileSnitch 進行遷移。 - SimpleSnitch
-
將策略順序視為接近度。這可以在停用讀取修復時改善快取區域性。僅適用於單資料中心部署。
- PropertyFileSnitch
-
接近度由機架和資料中心決定,這些明確設定在
cassandra-topology.properties
中。 - RackInferringSnitch
-
接近度由機架和資料中心決定,假設分別對應於每個節點 IP 位址的第 3 和第 2 個八位元組。除非這剛好符合您的部署慣例,否則最好將其用作撰寫自訂 Snitch 類別的範例,並以這種精神提供。
基於雲端的 snitch
這些 snitch 用於雲端環境,供應應商各不相同。所有基於雲端的 snitch 實作目前都擴充了 AbstractCloudMetadataServiceSnitch
(它又擴充了 AbstractNetworkTopologySnitch
)。
每個基於雲端的告密者都有自己的方法來解析節點所屬的機架和資料中心。AbstractCloudMetadataServiceSnitch
封裝了達成此目的最常見的裝置。所有基於雲端的告密者都會呼叫特定於各個雲端的 HTTP 服務。AbstractCloudMetadataServiceSnitch
的建構函式接受 AbstractCloudMetadataServiceConnector
的實作,而 AbstractCloudMetadataServiceConnector
實作了一個方法 apiCall
,預設會對預先定義的 HTTP URL 執行 HTTP GET
要求,不傳送 HTTP 標頭,並預期收到 HTTP 程式碼 200
的回應。如果實作人員需要,也可以傳送各種 HTTP 標頭作為要求的一部分。
目前,AbstractCloudMetadataServiceConnector
唯一的實作是 DefaultCloudMetadataServiceConnector
。如果使用者需要覆寫 AbstractCloudMetadataServiceConnector
的行為,使用者可以實作自己的連接器,並將其傳播到 AbstractCloudMetadataServiceSnitch
的建構函式。
所有基於雲端的告密者都接受 cassandra-rackdc.properties
中的這些屬性
- metadata_url
-
用於擷取拓撲結構資訊的雲端服務 URL,這取決於雲端。
- metadata_request_timeout
-
30s
(30 秒)的預設值會在apiCall
呼叫時設定連線逾時。換句話說,如果在該期間內沒有收到回應,針對metadata_url
的要求就會逾時。 - dc_suffix
-
預設為空字串,將附加到已解析的資料中心。
內建的基於雲端的告密者為
- Ec2Snitch
-
適用於單一區域或啟用跨區域 VPC 的多個區域中的 EC2 部署(自 2017 年底開始提供,請參閱 AWS 公告)。從 EC2 API 載入區域和可用區域資訊。區域視為資料中心,可用區域視為機架。只使用私人 IP,因此只有在啟用跨區域 VPC 時,才會跨多個區域運作。
- Ec2MultiRegionSnitch
-
使用公用 IP 作為廣播位址,以允許跨區域連線(因此,您也應該將種子位址設定為公用 IP)。您需要在公用 IP 防火牆上開啟
storage_port
或ssl_storage_port
(對於區域內流量,Cassandra 會在建立連線後切換到私人 IP)。
對於 Ec2 告密者,自 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
-
一個假設 ECS 區域為 DC,ECS 可用性區域為機架的告密者。此資訊可在節點的設定檔中取得。區域 ID 的格式類似於
cn-hangzhou-a
,其中cn
表示中國,hangzhou
表示杭州區域,a
表示 az id。我們使用cn-hangzhou
作為 dc,並使用a
作為區域 ID。預設情況下,此告密者的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
,以解析資料中心和機架。