2017-03-15 1 views
2

Nous utilisons rest api pour exécuter des requêtes dans cassandra et une de nos requêtes qui fetch compte crée des problèmes pour nous.Recevoir des nombres incohérents de cassandra

Nous avons construit un cluster Cassandra et récemment, nous avons fait des sauvegardes et des restaurations et copié toutes les données vers un nouveau cluster. Nous avons fait un rafraîchissement de nodetool sur les tables, et nous avons également réparé le nodetool. Cependant, certains de nos appels API échouent et retournent des résultats incohérents.

1) La requête de comptage comporte des clés de partition. N'a vu aucun délai d'attente de lecture ou aucune erreur de l'appel api.

2) Voici à quoi ressemble notre code de création de session.

val poolingOptions = new PoolingOptions 
    poolingOptions 
     .setCoreConnectionsPerHost(HostDistance.LOCAL, 4) 
     .setMaxConnectionsPerHost(HostDistance.LOCAL, 10) 
     .setCoreConnectionsPerHost(HostDistance.REMOTE, 4) 
     .setMaxConnectionsPerHost(HostDistance.REMOTE, 10) 

val builtCluster = clusterBuilder.withCredentials(username, password) 
     .withPoolingOptions(poolingOptions) 
     .build() 
val cassandraSession = builtCluster.get.connect() 
val preparedStatement = cassandraSession.prepare(statement).setConsistencyLevel(ConsistencyLevel.QUORUM) 
cassandraSession.execute(preparedStatement.bind(args :_*)) 

configuration du cluster:

6 Machines: 3 graines

cassandra est jamais vers le bas sur toute machine

nous utilisons apache cassandra version 3.9

En utilisant cassandra- artefact de pilote-noyau avec la version 3.1.1.

3) Les tpstats nodetoop ne présentent aucune défaillance.

4) Ne voyez pas d'autres problèmes de system.log de cassandra. Nous voyons juste quelques avertissements comme ci-dessous.

Maximum memory usage reached (512.000MiB), cannot allocate chunk of 1.000MiB 
WARN [ScheduledTasks:1] 2017-03-14 14:58:37,141 QueryProcessor.java:103 - 88 prepared statements discarded in the last minute because cache limit reached (32 MB) 

Le premier appel api renvoie 0 et les appels api plus tard donnent des valeurs correctes.

S'il vous plaît laissez-moi savoir, si d'autres détails nécessaires.

+0

ce qui est la structure de votre table et quelle requête exécutons vous? –

+0

Nous avons une table avec 4 colonnes, l'une d'elles est la clé de partition et quelques colonnes (une colonne de date + une colonne de texte) a été sélectionnée comme clé de clustering. Nos requêtes ressembleront à ceci. SELECT count (*) FROM nom_table WHERE parition_column =? ET text_column_of_clustering_key =? ET date_column_of_clustering_key <=? ET date_column_of_clustering_key> =? – Srini

+0

Quel est votre stratégie/facteur de réplication? À quel niveau de cohérence les écritures parviennent-elles à cette table? –

Répondre

1

Ne pas utiliser COUNT (*), l'utilisation contre
count(*) est très inefficace. Cassandra a besoin de scanner toute la ligne juste pour vous donner le compte. Si vous avez une énorme quantité de données, Cassandra peut vous envoyer une exception de timeout.

Utiliser compteur lieu:

Un compteur est une colonne spéciale utilisée pour stocker un nombre qui est changé par incréments. Par exemple, vous pouvez utiliser une colonne de compteur pour compter le nombre de fois qu'une page est affichée.

Définissons une table:

CREATE TABLE counter_test (
    pk int, 
    ctkey text, 
    cdkey date, 
    count counter, 
    PRIMARY KEY (pk, ctkey, cdkey) 
); 

Augmenter la valeur du compteur:

UPDATE counter_test SET count = count + 10 WHERE pk = 1 AND ctkey = 'hi' AND cdkey = '2017-03-16'; 

Diminution de la valeur du compteur:

UPDATE counter_test SET count = count - 5 WHERE pk = 1 AND ctkey = 'hi' AND cdkey = '2017-03-16'; 

Sélectionnez la valeur de compteur:

SELECT * FROM counter_test WHERE pk = 1 AND ctkey = 'hi' AND cdkey = '2017-03-16'; 

vous obtiendrez:

pk | ctkey | cdkey  | count 
----+-------+------------+------- 
    1 | hi | 2017-03-16 |  5 

Source: https://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html

+0

Je ne pense pas que le compteur fonctionne pour notre scénario. Lorsque nous mettons à jour les données, le volume de données est également très élevé. Mise à jour du compteur à chaque fois sera un coup de performance et ne résout pas vraiment notre problème. – Srini