Sdílet prostřednictvím


Řešení běžných problémů ve službě Azure Cosmos DB for 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 for 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 Cassandry se tato chyba nezobrazí, vytvořte požadavek podpora Azure.

Poznámka

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

Tyto záruky nejsou možné v předchozích implementacích Apache Cassandry, takže se mnoho back-endových operací rozhraní API pro Cassandra 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 klientem.

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

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í za 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 tématu 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í. Povolte funkci Keep-Alive pro ovladač Javy 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 výjimkou NoHostAvailableException .

OverloadedException (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 ze Azure Portal (viz Elastické škálování účtu Azure Cosmos DB for 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 služby Azure Cosmos DB pro Javu.

PřetíženíException i přes dostatečnou propustnost

Zdá se, že systém omezování požadavků i v případě, že je zřízena dostatečná propustnost pro svazek 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 stačit pro operace schématu v produkčním systému. Pokud však 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 žádost o podpora Azure.

  • Nerovnoměrná distribuce dat: Pokud je propustnost zřízená v rozhraní API pro Cassandra, rozdělí se rovnoměrně mezi fyzické oddíly a každý fyzický oddíl má horní limit. Pokud se z jednoho konkrétního oddílu vkládá nebo dotazuje velké množství dat, může být rychlost omezená i v případě, že pro tuto tabulku zřídíte velké množství celkové propustnosti (jednotek žádostí).

    Zkontrolujte svůj datový model a ujistěte se, že nemáte přílišnou nerovnoměrnou distribuci, která by mohla způsobit horké oddíly.

Občasné chyby připojení (Java)

Připojení se neočekávaně přeruší 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í formát je ExponentialReconnectionPolicy. Pro službu Azure Cosmos DB pro Apache Cassandra ale doporučujeme ConstantReconnectionPolicy s dvousekundovým zpožděním.

Příklady ovladačů Java najdete v dokumentaci k ovladači Java 4.x, v dokumentaci k ovladači Java 3.x nebo v tématu Konfigurace zásady opětovného připojení .

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

Možná jste v ovladači Java DataStax v 3.x implementovali zásadu vyrovnávání zatížení 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 pro withLocalDc() neodpovídá datacentru kontaktního bodu, může docházet k občasné 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 selhání u velké tabulky

Pokud spustíte select count(*) from table příkaz nebo podobně pro velký počet řádků, vyprší časový limit serveru.

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

Pokud stále vyprší časový limit počtu, můžete získat počet záznamů z telemetrie back-endu azure Cosmos DB tak, že přejdete na kartu Metriky v Azure Portal, vyberete metriku document counta pak přidáte filtr pro databázi nebo kolekci (analog tabulky 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 zásady reconnectionPolicy pro ovladač Javy

Verze 3.x

Pro verzi 3.x ovladače Java 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í funkce Keep-Alive pro ovladač Javy

Verze 3.x

Pro verzi 3.x ovladače Java nastavte při vytváření objektu clusteru možnost Keep-Alive a pak se ujistěte, ž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 verzi 4.x ovladače Java nastavte možnost Keep-Alive přepsáním nastavení v reference.confa ujistěte se, že je v operačním systému povolená funkce Keep-Alive:

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

Další kroky