分享方式:


對 Azure Cosmos DB for Apache Cassandra 中的常見問題進行疑難排解

適用於: Cassandra

Azure Cosmos DB 中的 API for Cassandra 是相容性層,可為開放原始碼 Apache Cassandra 資料庫提供有線通訊協定支援

本文說明應用程式使用 Azure Cosmos DB for Apache Cassandra 時常見的錯誤和解決方案。 如果您的錯誤未列出,且當您執行 Cassandra 中支援的作業時遇到錯誤,但在使用原生 Apache Cassandra 時未出現錯誤,請建立 Azure 支援要求

注意

Azure Cosmos DB 是完全受控的雲端原生服務,可為 API for Cassandra 提供可用性、輸送量和一致性的保證。 API for Cassandra 也有助於進行零維護的平台作業和零停機的修補。

先前的 Apache Cassandra 實作無法提供這些保證,因此許多 API for Cassandra 後端作業與 Apache Cassandra 不同。 建議使用特定的設定和方法,以協助避免常見的錯誤。

NoNodeAvailableException

此錯誤是最上層的包裝函式例外狀況,有大量可能的原因和內部例外狀況,其中有許多都與用戶端相關。

常見的原因和解決方案:

無法連線至主機

您可能會看到此錯誤:「無法連線至任何主機,排定在 600000 毫秒內重試。」

造成此錯誤的原因,可能是已在用戶端上耗盡來源網路位址轉譯 (SNAT)。 請遵循輸出連線 SNAT 上的步驟,以排除此問題。

此錯誤也可能是閒置逾時問題,其中 Azure 負載平衡器預設有四分鐘的閒置逾時。 請參閱負載平衡器閒置逾時針對 Java 驅動程式啟用保持運作,並將作業系統上的 keepAlive 間隔設定為小於四分鐘。

如需更多處理例外狀況的方式,請參閱對 NoHostAvailableException 進行疑難排解

OverloadedException (Java)

要求會進行節流,因為取用的要求單位總數高於您在索引鍵空間或資料表上佈建的要求單位數。

請考慮調整透過 Azure 入口網站指派給索引鍵空間或資料表的輸送量 (請參閱彈性調整 Azure Cosmos DB for Apache Cassandra 帳戶),或實作重試原則。

針對 Java,請參閱 v3.x 驅動程式v4.x 驅動程式的重試範例。 另請參閱適用於 Java 的 Azure Cosmos DB Cassandra 延伸模組

儘管有足夠的輸送量,仍出現 OverloadedException

即使針對要求磁碟區或取用的要求單位成本佈建了足夠的輸送量,系統似乎仍在節流要求。 可能的原因有二:

  • 結構描述層級作業:API for Cassandra 會針對結構描述層級作業 (CREATE TABLE、ALTER TABLE、DROP TABLE) 實作系統輸送量預算。 此預算應該足以滿足生產系統中的結構描述作業。 但是,如果您有大量的結構描述層級作業,則可能會超過此限制。

    因為預算不是由使用者控制,所以請考慮降低您執行的結構描述作業數目。 如果該動作無法解決問題,或是對您的工作負載不可行,請建立 Azure 支援要求

  • 資料扭曲:在 API for Cassandra 中佈建輸送量時,系統會在實體分割區之間平均分配輸送量,且每個實體分割區都有上限。 如果您有大量要從某個特定分割區中插入或查詢的資料,其可能會有速率限制,即使您針對該資料表佈建大量的整體輸送量 (要求單位) 也一樣。

    請檢閱您的資料模型,並確保您沒有可能造成經常性分割區的過度扭曲。

間歇連線能力錯誤 (Java)

連線非預期地中斷或逾時。

適用於 Java 的 Apache Cassandra 驅動程式提供兩個原生重新連線原則:ExponentialReconnectionPolicyConstantReconnectionPolicy。 預設值為 ExponentialReconnectionPolicy。 不過,針對 Azure Cosmos DB for Apache Cassandra,建議使用兩秒延遲的 ConstantReconnectionPolicy

請參閱 Java 4.x 驅動程式的文件Java 3.x 驅動程式的文件,或針對 Java 驅動程式設定 ReconnectionPolicy 範例。

負載平衡原則的錯誤

您可能已在 Java DataStax 驅動程式的 v3.x 中實作負載平衡原則,其程式碼如下所示:

cluster = Cluster.builder()
        .addContactPoint(cassandraHost)
        .withPort(cassandraPort)
        .withCredentials(cassandraUsername, cassandraPassword)
        .withPoolingOptions(new PoolingOptions() .setConnectionsPerHost(HostDistance.LOCAL, 1, 2)
                .setMaxRequestsPerConnection(HostDistance.LOCAL, 32000).setMaxQueueSize(Integer.MAX_VALUE))
        .withSSL(sslOptions)
        .withLoadBalancingPolicy(DCAwareRoundRobinPolicy.builder().withLocalDc("West US").build())
        .withQueryOptions(new QueryOptions().setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM))
        .withSocketOptions(getSocketOptions())
        .build();

如果 withLocalDc() 的值不符合連絡點資料中心,您可能會遇到間歇錯誤:com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried)

實作 CosmosLoadBalancingPolicy。 若要使其運作,您可能需要使用下列程式碼來升級 DataStax:

LoadBalancingPolicy loadBalancingPolicy = new CosmosLoadBalancingPolicy.Builder().withWriteDC("West US").withReadDC("West US").build();

計數無法在大型資料表上進行

當您針對大量資料列執行 select count(*) from table 或類似指令碼時,伺服器會逾時。

如果您使用的是本機 CQLSH 用戶端,請變更 --connect-timeout--request-timeout 設定。 請參閱 cqlsh:CQL 殼層

如果計數仍然逾時,您可以從 Azure Cosmos DB 後端遙測中取得記錄計數,方法是移至 Azure 入口網站中的 [計量] 索引標籤、選取度量 document count,然後新增資料庫或集合 (類似 Azure Cosmos DB 中的資料表)。 然後,您可以將滑鼠停留在您想要計算記錄數目的時間點結果圖形上方。

計量檢視

設定 Java 驅動程式的 ReconnectionPolicy

3.x 版

若為 3.x 版的 Java 驅動程式,請在建立叢集物件時設定重新連線原則:

import com.datastax.driver.core.policies.ConstantReconnectionPolicy;

Cluster.builder()
  .withReconnectionPolicy(new ConstantReconnectionPolicy(2000))
  .build();

4.x 版

若為 4.x 版的 Java 驅動程式,請覆寫 reference.conf 檔案中的設定來設定重新連線原則:

datastax-java-driver {
  advanced {
    reconnection-policy{
      # The driver provides two implementations out of the box: ExponentialReconnectionPolicy and
      # ConstantReconnectionPolicy. We recommend ConstantReconnectionPolicy for API for Cassandra, with 
      # base-delay of 2 seconds.
      class = ConstantReconnectionPolicy
      base-delay = 2 second
    }
}

針對 Java 驅動程式啟用保持運作

3.x 版

若為 3.x 版的 Java 驅動程式,請在建立叢集物件時設定保持運作,然後確定保持運作已在作業系統中啟用

import java.net.SocketOptions;
    
SocketOptions options = new SocketOptions();
options.setKeepAlive(true);
cluster = Cluster.builder().addContactPoints(contactPoints).withPort(port)
  .withCredentials(cassandraUsername, cassandraPassword)
  .withSocketOptions(options)
  .build();

4.x 版

若為 4.x 版的 Java 驅動程式,請藉由覆寫 reference.conf 中的設定來設定保持運作,然後確定保持運作已在作業系統中啟用

datastax-java-driver {
  advanced {
    socket{
      keep-alive = true
    }
}

下一步