Sdílet prostřednictvím


Řešení běžných problémů ve službě Azure Cosmos DB pro Apache Cassandra

PLATÍ PRO: Cassandra

Rozhraní API pro Cassandra ve službě Azure Cosmos DB je vrstva kompatibility, která poskytuje podporu přenosového protokolu pro opensourcovou databázi Apache Cassandra.

Tento článek popisuje běžné chyby a řešení pro aplikace, které používají Službu Azure Cosmos DB pro Apache Cassandra. Pokud vaše chyba není uvedená a při spuštění podporované operace v Cassandře dojde k chybě, ale při použití nativní apache Cassandra se tato chyba nezobrazí, vytvořte požadavek podpora Azure.

Poznámka:

Jako plně spravovaná cloudová nativní služba poskytuje Azure Cosmos DB záruky dostupnosti, propustnosti a konzistence pro rozhraní API pro Cassandra. Rozhraní API pro Cassandra také usnadňuje operace platformy nulové údržby a opravy bez výpadků.

Tyto záruky nejsou možné v předchozích implementacích Apache Cassandra, takže mnoho rozhraní API pro back-endové operace Cassandra se liší od Apache Cassandra. Doporučujeme konkrétní nastavení a přístupy, které vám pomůžou vyhnout se běžným chybám.

NoNodeAvailableException

Tato chyba je výjimka obálky nejvyšší úrovně s velkým počtem možných příčin a vnitřních výjimek, z nichž mnohé můžou souviset s klienty.

Běžné příčiny a řešení:

  • Časový limit nečinnosti služby Azure LoadBalancers: Tento problém se může také projevit jako ClosedConnectionException. Pokud chcete tento problém vyřešit, nastavte v ovladači nastavení udržování naživu (viz Povolení udržování naživu pro ovladač Java) a zvyšte nastavení udržování v operačním systému nebo upravte časový limit nečinnosti v Azure Load Balanceru.

  • Vyčerpání prostředků klientské aplikace: Ujistěte se, že klientské počítače mají dostatek prostředků k dokončení požadavku.

Nejde se připojit k hostiteli

Může se zobrazit tato chyba: Nejde se připojit k žádnému hostiteli, plánování opakování v milisekundách 600000 milisekund.

Příčinou této chyby může být vyčerpání překladu zdrojových síťových adres (SNAT) na straně klienta. Pokud chcete tento problém vyloučit, postupujte podle pokynů v SNAT pro odchozí připojení .

Chyba může být také problém s vypršením časového limitu nečinnosti, kdy má nástroj pro vyrovnávání zatížení Azure ve výchozím nastavení čtyři minuty časového limitu nečinnosti. Viz vypršení časového limitu nečinnosti nástroje pro vyrovnávání zatížení. U ovladače Java povolte udržování naživu a nastavte keepAlive interval v operačním systému na méně než čtyři minuty.

Další způsoby zpracování výjimky najdete v tématu řešení potíží s chybou NoHostAvailableException .

PřetíženíException (Java)

Požadavky jsou omezené, protože celkový počet spotřebovaných jednotek žádostí je vyšší než počet jednotek žádostí, které jste zřídili v prostoru klíčů nebo tabulce.

Zvažte škálování propustnosti přiřazené k prostoru klíčů nebo tabulce z webu Azure Portal (viz Elastické škálování účtu Azure Cosmos DB pro Apache Cassandra) nebo implementaci zásad opakování.

Informace o Javě najdete v ukázkách opakování pro ovladač v3.x a ovladač v4.x. Viz také rozšíření Cassandra pro Azure Cosmos DB pro Javu.

PřetíženíException navzdory dostatečné propustnosti

Zdá se, že systém má omezování požadavků, i když je zřízena dostatečná propustnost pro objem požadavků nebo spotřebované náklady na jednotku požadavků. Existují dvě možné příčiny:

  • Operace na úrovni schématu: Rozhraní API pro Cassandra implementuje rozpočet propustnosti systému pro operace na úrovni schématu (CREATE TABLE, ALTER TABLE, DROP TABLE). Tento rozpočet by měl být dostatečný pro operace schématu v produkčním systému. Pokud ale máte velký počet operací na úrovni schématu, můžete tento limit překročit.

    Vzhledem k tomu, že rozpočet není řízený uživatelem, zvažte snížení počtu spuštěných operací schématu. Pokud tato akce problém nevyřeší nebo není pro vaši úlohu proveditelná, vytvořte podpora Azure žádost.

  • Nerovnoměrná distribuce dat: Při zřizování propustnosti v rozhraní API pro Cassandru se rovnoměrně rozdělí mezi fyzické oddíly a každý fyzický oddíl má horní limit. Pokud máte velké množství dat, která se vkládají nebo dotazují z jednoho konkrétního oddílu, může se jednat o omezení rychlosti, i když pro tuto tabulku zřídíte velké množství celkové propustnosti (jednotky žádostí).

    Zkontrolujte datový model a ujistěte se, že nemáte nadměrnou nerovnoměrnou distribuci, která by mohla způsobit horké oddíly.

Přerušované chyby připojení (Java)

Připojení se neočekávaně zahodí nebo vyprší časový limit.

Ovladače Apache Cassandra pro Javu poskytují dvě nativní zásady opětovného připojení: ExponentialReconnectionPolicy a ConstantReconnectionPolicy. Výchozí hodnota je ExponentialReconnectionPolicy. Pro službu Azure Cosmos DB pro Apache Cassandra ale doporučujeme ConstantReconnectionPolicy se dvěmasekundovým zpožděním.

Podívejte se na dokumentaci pro ovladač Java 4.x, dokumentaci pro ovladač Java 3.x nebo konfiguraci reconnectionPolicy pro příklady ovladačů Javy.

Chyba se zásadami vyrovnávání zatížení

Možná jste implementovali zásadu vyrovnávání zatížení v ovladači Java DataStax verze 3.x s kódem podobným:

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();

Pokud hodnota withLocalDc() datacentra kontaktního bodu neodpovídá, může docházet k přerušované chybě: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried).

Implementujte CosmosLoadBalancingPolicy. Aby to fungovalo, možná budete muset upgradovat DataStax pomocí následujícího kódu:

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

Počet selže u velké tabulky.

Při spuštění select count(*) from table nebo podobném počtu řádků vyprší časový limit serveru.

Pokud používáte místního klienta CQLSH, změňte --connect-timeout nastavení.--request-timeout Viz cqlsh: prostředí CQL.

Pokud počet stále vyprší, můžete získat počet záznamů z back-endové telemetrie služby Azure Cosmos DB tak, že přejdete na kartu metriky na webu Azure Portal, vyberete metriku document counta pak přidáte filtr pro databázi nebo kolekci (analogová tabulka ve službě Azure Cosmos DB). Potom můžete najet myší na výsledný graf pro bod v čase, ve kterém chcete zjistit počet záznamů.

Zobrazení metrik

Konfigurace reconnectionPolicy pro ovladač Java

Verze 3.x

Pro ovladač Java verze 3.x nakonfigurujte zásadu opětovného připojení při vytváření objektu clusteru:

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

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

Verze 4.x

Pro verzi 4.x ovladače Java nakonfigurujte zásadu opětovného připojení přepsáním nastavení v reference.conf souboru:

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
    }
}

Povolení udržování naživu pro ovladač Java

Verze 3.x

Pro ovladač Javy verze 3.x nastavte udržování při vytváření objektu clusteru a ujistěte se, že je v operačním systému povolená funkce keep-alive:

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

Verze 4.x

Pro ovladač Java verze 4.x nastavte udržování naživu přepsáním nastavení v reference.confa pak se ujistěte, že je v operačním systému povoleno udržování naživu:

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

Další kroky