Delen via


Veelvoorkomende problemen in Azure Cosmos DB voor Apache Cassandra oplossen

VAN TOEPASSING OP: Cassandra

De API voor Cassandra in Azure Cosmos DB is een compatibiliteitslaag die wire-protocolondersteuning biedt voor de opensource Apache Cassandra-database.

In dit artikel worden veelvoorkomende fouten en oplossingen beschreven voor toepassingen die gebruikmaken van Azure Cosmos DB voor Apache Cassandra. Als uw fout niet wordt weergegeven en er een fout optreedt wanneer u een ondersteunde bewerking uitvoert in Cassandra, maar de fout niet aanwezig is wanneer u systeemeigen Apache Cassandra gebruikt, maakt u een ondersteuning voor Azure aanvraag.

Notitie

Als volledig beheerde cloudeigen service biedt Azure Cosmos DB garanties voor beschikbaarheid, doorvoer en consistentie voor de API voor Cassandra. De API voor Cassandra faciliteert ook platformbewerkingen zonder onderhoud en patching zonder downtime.

Deze garanties zijn niet mogelijk in eerdere implementaties van Apache Cassandra, dus veel van de API voor Cassandra-back-endbewerkingen verschillen van Apache Cassandra. We raden bepaalde instellingen en benaderingen aan om veelvoorkomende fouten te voorkomen.

NoNodeAvailableException

Deze fout is een wrapper-uitzondering op het hoogste niveau met een groot aantal mogelijke oorzaken en interne uitzonderingen, waarvan veel clientgerelateerd kunnen zijn.

Veelvoorkomende oorzaken en oplossingen:

Kan geen verbinding maken met een host

Mogelijk ziet u deze fout: 'Kan geen verbinding maken met een host, het opnieuw proberen in 600000 milliseconden'.

Deze fout kan worden veroorzaakt door SNAT-uitputting (Source Network Address Translation) aan de clientzijde. Volg de stappen bij SNAT voor uitgaande verbindingen om dit probleem uit te sluiten.

De fout kan ook een time-outprobleem zijn waarbij de Azure Load Balancer standaard vier minuten time-out voor inactiviteit heeft. Zie time-out voor inactiviteit van load balancer. Schakel keep-alive in voor het Java-stuurprogramma en stel het keepAlive interval voor het besturingssysteem in op minder dan vier minuten.

Zie problemen met NoHostAvailableException oplossen voor meer manieren om de uitzondering te verwerken.

OverloadedException (Java)

Aanvragen worden beperkt omdat het totale aantal verbruikte aanvraageenheden hoger is dan het aantal aanvraageenheden dat u hebt ingericht in de keyspace of tabel.

Overweeg om de doorvoer die is toegewezen aan een keyspace of tabel vanuit Azure Portal te schalen (zie Elastisch schalen van een Azure Cosmos DB voor Apache Cassandra-account) of het implementeren van een beleid voor opnieuw proberen.

Zie voor Java voorbeelden voor opnieuw proberen voor het v3.x-stuurprogramma en het v4.x-stuurprogramma. Zie ook Azure Cosmos DB Cassandra Extensions voor Java.

OverloadedException ondanks voldoende doorvoer

Het systeem lijkt aanvragen te beperken, ook al is er voldoende doorvoer ingericht voor aanvraagvolume- of verbruikte kosten voor aanvraageenheden. Er zijn twee mogelijke oorzaken:

  • Bewerkingen op schemaniveau: De API voor Cassandra implementeert een budget voor systeemdoorvoer voor bewerkingen op schemaniveau (CREATE TABLE, ALTER TABLE, DROP TABLE). Dit budget moet voldoende zijn voor schemabewerkingen in een productiesysteem. Als u echter een groot aantal bewerkingen op schemaniveau hebt, kunt u deze limiet overschrijden.

    Omdat het budget niet door de gebruiker wordt beheerd, kunt u overwegen het aantal schemabewerkingen te verlagen dat u uitvoert. Als deze actie het probleem niet oplost of het niet haalbaar is voor uw workload, maakt u een ondersteuning voor Azure aanvraag.

  • Scheeftrekken van gegevens: wanneer doorvoer wordt ingericht in de API voor Cassandra, wordt deze gelijkmatig verdeeld over fysieke partities en heeft elke fysieke partitie een bovengrens. Als u een grote hoeveelheid gegevens hebt die wordt ingevoegd of opgevraagd vanuit een bepaalde partitie, kan dit een snelheidsbeperking hebben, zelfs als u een grote hoeveelheid totale doorvoer (aanvraageenheden) voor die tabel inricht.

    Controleer uw gegevensmodel en zorg ervoor dat u geen overmatige scheeftrekken hebt die dynamische partities kunnen veroorzaken.

Onregelmatige connectiviteitsfouten (Java)

Verbinding wordt onverwacht verbroken of er treedt een time-out op.

De Apache Cassandra-stuurprogramma's voor Java bieden twee systeemeigen beleid voor opnieuw verbinden: ExponentialReconnectionPolicy en ConstantReconnectionPolicy. De standaardwaarde is ExponentialReconnectionPolicy. Voor Azure Cosmos DB voor Apache Cassandra wordt echter aangeraden ConstantReconnectionPolicy met een vertraging van twee seconden.

Zie de documentatie voor het Java 4.x-stuurprogramma, de documentatie voor het Java 3.x-stuurprogramma of het configureren van ReconnectionPolicy voor voorbeelden van Java-stuurprogramma's .

Fout met taakverdelingsbeleid

Mogelijk hebt u een taakverdelingsbeleid geïmplementeerd in v3.x van het Java DataStax-stuurprogramma, met code die vergelijkbaar is met:

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

Als de waarde voor withLocalDc() het datacenter van het contactpunt niet overeenkomt, kan er een onregelmatige fout optreden: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried).

Implementeer CosmosLoadBalancingPolicy. Als u dit wilt laten werken, moet u DataStax mogelijk upgraden met behulp van de volgende code:

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

Het aantal mislukt in een grote tabel

Wanneer u een groot aantal rijen uitvoert select count(*) from table of vergelijkbaar, treedt er een time-out op voor de server.

Als u een lokale CQLSH-client gebruikt, wijzigt u de --connect-timeout of --request-timeout instellingen. Zie cqlsh: de CQL-shell.

Als er nog steeds een time-out optreedt voor het aantal records uit de back-endtelemetrie van Azure Cosmos DB, gaat u naar het tabblad Metrische gegevens in Azure Portal, selecteert u de metrische waarde document counten voegt u vervolgens een filter toe voor de database of verzameling (het analog van de tabel in Azure Cosmos DB). U kunt vervolgens de muisaanwijzer over de resulterende grafiek bewegen voor het tijdstip waarop u het aantal records wilt tellen.

Weergave metrische gegevens

ReconnectionPolicy configureren voor het Java-stuurprogramma

Versie 3.x

Voor versie 3.x van het Java-stuurprogramma configureert u het beleid voor opnieuw verbinden wanneer u een clusterobject maakt:

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

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

Versie 4.x

Voor versie 4.x van het Java-stuurprogramma configureert u het beleid voor opnieuw verbinden door instellingen in het reference.conf bestand te overschrijven:

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

Keep-alive inschakelen voor het Java-stuurprogramma

Versie 3.x

Stel voor versie 3.x van het Java-stuurprogramma keep-alive in wanneer u een clusterobject maakt en zorg ervoor dat keep-alive is ingeschakeld in het besturingssysteem:

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

Versie 4.x

Stel voor versie 4.x van het Java-stuurprogramma keep-alive in door instellingen in reference.confte schakelen en zorg ervoor dat keep-alive is ingeschakeld in het besturingssysteem:

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

Volgende stappen