本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
最佳化無伺服器環境的用戶端驅動程式連線
要與 Amazon Keyspaces 進行通信,您可以使用任何您選擇的現有 Apache 卡桑德拉客戶端驅動程序。由於 Amazon Keyspaces 是無伺服器服務,因此建議您針對應用程式的輸送量需求最佳化用戶端驅動程式的連線組態。本主題介紹最佳作法,包括如何計算應用程式需要多少連線,以及監視和錯誤處理連線。
主題
連接如何在 Amazon Keyspaces 中工作
本節概述用戶端驅動程式連線在 Amazon Keyspaces 中的運作方式。由於 Cassandra 用戶端驅動程式設定錯誤可能會導致 Amazon Keyspace 中的PerConnectionRequestExceeded
事件,因此需要在用戶端驅動程式組態中設定適當數量的連線,以避免這些和類似的連線錯誤。
連線至 Amazon Keyspaces 時,驅動程式需要種子端點來建立初始連線。Amazon Keyspaces 使用 DNS 將初始連線路由到眾多可用端點之一。端點會連接至網路負載平衡器,進而與叢集中的其中一個要求處理常式建立連線。建立初始連線之後,用戶端驅動程式會從system.peers
表格收集所有可用端點的相關資訊。使用此資訊,用戶端驅動程式可以建立與所列端點的其他連線。用戶端驅動程式可建立的連線數目受用戶端驅動程式設定中指定的本機連線數目限制。默認情況下,大多數客戶端驅動程序為每個端點建立一個連接,並建立連接池到 Cassandra 並通過該連接池進行負載平衡查詢。雖然可以建立多個連接到同一個端點,但在網絡負載平衡器後面,它們可能會連接到許多不同的請求處理程序。透過公用端點連線時,建立一個連線至system.peers
表格中列出的九個端點,每個端點都會產生九個連線至不同的要求處理程式。
如何在 Amazon Keyspaces 中配置連接
Amazon Keyspaces 每秒每個 TCP 連線最多可支援 3,000 個 CQL 查詢。由於驅動程式可建立的連線數目沒有限制,因此我們建議每個連線每秒只鎖定 500 個 CQL 要求,以允許額外負荷、流量突增及更佳的負載平衡。請遵循下列步驟,以確保驅動程式的連線已正確設定,以滿足應用程式的需求。
增加驅動程序在其連接池中維護的每個 IP 地址的連接數。
-
大多數卡桑德拉驅動程序建立了一個連接池卡桑德拉,並通過該連接池進行負載平衡查詢。大多數驅動程序的默認行為是建立到每個端點的單個連接。Amazon Keyspaces 會向驅動程式公開九個對等 IP 地址,因此根據大多數驅動程式的預設行為,這會產生 9 個連線。Amazon Keyspaces 每秒每個 TCP 連線最多支援 3,000 個 CQL 查詢,因此,使用預設設定的驅動程式最大 CQL 查詢輸送量為每秒 27,000 個 CQL 查詢。如果您使用驅動程式的預設設定,單一連線可能需要處理超過每秒 3,000 CQL 查詢的最大 CQL 查詢輸送量。這可能會導致
PerConnectionRequestExceeded
事件。 若要避免發生
PerConnectionRequestExceeded
事件,您必須設定驅動程式為每個端點建立其他連線,以分配輸送量。作為 Amazon Keyspaces 中的最佳實務,假設每個連線每秒可支援 500 個 CQL 查詢。
這表示,對於需要支援每秒估計 27,000 個 CQL 查詢分散在九個可用端點的實際執行應用程式,您必須為每個端點設定六個連線。如此可確保每個連線每秒處理不超過 500 個要求。
根據應用程式的需求,計算您需要為驅動程式設定的每個 IP 位址的連線數。
若要判斷您需要為應用程式設定每個端點的連線數目,請考慮下列範例。您有一個應用程式每秒需要支援 20,000 個 CQL 查詢,其中包含 10,000 個INSERT
SELECT
、5,000 個和 5,000 個DELETE
作業。Java 應用程式在亞馬遜彈性容器服務 (Amazon ECS) 上的三個執行個體上執行,其中每個執行個體都會建立到 Amazon Keyspaces 的單一工作階段。您可以用來估計您需要為驅動程式設定多少連線的計算方式,會使用下列輸入。
您的應用程式需要支援的每秒要求數目。
因維護或失敗而減去一個的可用執行個體數目。
可用端點的數目。如果您透過公用端點進行連線,則會有九個可用端點。如果您使用的是 VPC 端點,則會有兩到五個可用端點之間,視區域而定。
每個連線每秒使用 500 個 CQL 查詢作為 Amazon Keyspaces 的最佳實務。
四捨五入結果。
在此範例中,公式如下所示。
20,000 CQL queries / (3 instances - 1 failure) / 9 public endpoints / 500 CQL queries per second = ROUND(2.22) = 3
根據此計算,您需要在驅動程式組態中為每個端點指定三個本機連線。對於遠端連線,每個端點僅設定一個連線。
如何透過 Amazon Keyspaces 中的 VPC 端點設定連線
透過私有 VPC 端點進行連線時,您最有可能有 3 個端點可用。根據可用區域的數量以及指派的 VPC 中的子網路數目,每個區域的 VPC 端點數目可能會有所不同。美國東部 (維吉尼亞北部) 區域有五個可用區域,您最多可以有五個 Amazon Keyspaces 端點。美國西部 (加利佛尼亞北部) 區域有兩個可用區域,而且您最多可以有兩個 Amazon Keyspaces 端點。端點數目不會影響規模,但會增加您需要在驅動程式組態中建立的連線數目。請考量下列範例。您的應用程式需要支援 20,000 個 CQL 查詢,並且在 Amazon ECS 上的三個執行個體上執行,其中每個執行個體都會建立一個到 Amazon Keyspaces 的工作階段。唯一的區別在於不同端點中有多少個可用端點 AWS 區域。
美國東部 (維吉尼亞北部) 區域所需的連線:
20,000 CQL queries / (3 instances - 1 failure) / 5 private VPC endpoints / 500 CQL queries per second = 4 local connections
美國西部 (加利佛尼亞北部) 區域所需的連線:
20,000 CQL queries / (3 instances - 1 failure) / 2 private VPC endpoints / 500 CQL queries per second = 10 local connections
重要
使用私有 VPC 端點時,Amazon Keyspaces 需要其他許可,才能動態探索可用的 VPC 端點並填入表格。system.peers
如需詳細資訊,請參閱 使用介面 VPC 端點資訊填入system.peers表格項目。
透過使用不同的私有 VPC 端點存取 Amazon Keyspaces 時 AWS 帳戶,很可能只會看到單一 Amazon Keyspaces 端點。同樣地,這不會影響 Amazon Keyspace 的可能輸送量規模,但可能需要增加驅動程式組態中的連線數量。此範例顯示單一可用端點的相同計算方式。
20,000 CQL queries / (3 instances - 1 failure) / 1 private VPC endpoints / 500 CQL queries per second = 20 local connections
若要進一步了解使用共用 VPC 跨帳戶存取 Amazon Keyspaces 的詳細資訊,請參閱。使用共用 VPC 中的 VPC 端點設定跨帳戶存取
如何監視 Amazon Keyspaces 中的連接
若要協助識別應用程式所連線的端點數目,您可以記錄在system.peers
表格中探索到的對等端點數目。下面的例子是 Java 代碼的一個例子,它打印的連接已建立後的對等數量。
ResultSet result = session.execute(new SimpleStatement("SELECT * FROM system.peers")); logger.info("number of Amazon Keyspaces endpoints:" + result.all().stream().count());
注意
CQL 主控台或主 AWS 控台未部署在 VPC 內,因此會使用公用端點。因此,從位於 VPCE 以外的應用程式執行system.peers
查詢通常會產生 9 個對等。打印每個對等端的 IP 地址也可能會有所幫助。
您也可以透過設定 VPCE Amazon 指標來觀察使用 VPC 端點時的對等數量。 CloudWatch 在中 CloudWatch,您可以看到與 VPC 端點建立的連線數目。卡桑德拉驅動程序建立每個端點發送 CQL 查詢和控制連接來收集系統表信息的連接。下圖顯示使用驅動程式設定中設定的 1 個連線連線連線至 Amazon Keyspaces 後的 VPC 端點 CloudWatch 指標。此指標顯示六個作用中連線,其中包含一個控制連線和五個連線 (跨可用區域的每個端點 1 個)。
若要開始使用 CloudWatch 圖形監視連線數目,您可以在 Amazon Keyspaces AWS CloudFormation 範本存放庫 GitHub 中部署此範本
如何處理 Amazon Keyspaces 中的連接錯誤
當超過每個連接配額 3,000 請求時,Amazon Keyspaces 返回一個PerConnectionRequestExceeded
事件,卡桑德拉驅動程序接收或異常。WriteTimeout
ReadTimeout
您應該在 Cassandra 重試策略或應用程序中使用指數輪詢重試此異常。您應該提供指數輪詢,以避免發送額外的請求。
預設重試原則會嘗試try next host
在查詢計畫中執行。由於 Amazon Keyspaces 在連線到 VPC 端點時可能會有一到三個可用端點,因此您也可能會在應用程式日誌NoHostAvailableException
中看到除了WriteTimeout
和ReadTimeout
例外狀況之外的。您可以使用 Amazon Keyspaces 提供的重試政策,這些政策會在相同的端點上重試,但跨不同的連線重試。
您可以在 Amazon Keyspaces Java 代碼示例存儲庫 GitHub 中找到 Java 的指數重試政策的示例