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:
Time-out voor inactiviteit van Azure LoadBalancers: dit probleem kan zich ook voordoen als
ClosedConnectionException
. Als u het probleem wilt oplossen, stelt u de keep-alive-instelling in het stuurprogramma in (zie Keep alive inschakelen voor het Java-stuurprogramma) en verhoogt u de keep alive-instellingen in uw besturingssysteem of past u de time-out voor inactiviteit in Azure Load Balancer aan.Uitputting van clienttoepassingsresources: zorg ervoor dat clientcomputers voldoende resources hebben om de aanvraag te voltooien.
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 count
en 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.
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.conf
te schakelen en zorg ervoor dat keep-alive is ingeschakeld in het besturingssysteem:
datastax-java-driver {
advanced {
socket{
keep-alive = true
}
}
Volgende stappen
- Meer informatie over ondersteunde functies in Azure Cosmos DB voor Apache Cassandra.
- Leer hoe u migreert van systeemeigen Apache Cassandra naar Azure Cosmos DB voor Apache Cassandra.