2017-05-25 7 views
1

Je cours Cassandra avec un très petit ensemble de données de sorte que les données peuvent exister sur memtable seulement. Voici mes configurations:Cassandra - comment désactiver memtable flush

En jvm.options:

-Xms4G 
-Xmx4G 

En cassandra.yaml,

memtable_cleanup_threshold: 0.50 
memtable_allocation_type: heap_buffers 

Selon la documentation cassandra.yaml, le memtable_heap_space_in_mb et memtable_heap_space_in_mb sera défini sur 1/4 de la taille du segment, soit 1000 Mo

Selon la documentation ici (http://docs.datastax.com/en/cassandra/3.0/cassandra/configuration/configCassandra_yaml.html#configCassandra_yaml__memtable_cleanup_threshold), le vidage memtable se déclenchera si la taille totale de memtabl (s) dépasse (1000 + 1000) * 0.50 = 1000MB.

Maintenant, si j'effectue plusieurs demandes d'écriture qui aboutissent à près de 300 Mo de données, memtable est toujours vidé puisque je vois des sstables créés sur le système de fichiers (Data.db etc.) et je ne comprends pas pourquoi.

Quelqu'un pourrait-il expliquer ce comportement et indiquer s'il me manque quelque chose ici?

+0

Pourquoi n'utilisez-vous pas Redis? Redis est un magasin de structure de données en mémoire, open source (sous licence BSD), utilisé comme base de données, cache et courtier de messages. https://redis.io/ –

Répondre

0

Ci-dessous la réponse que j'ai reçue du groupe d'utilisateurs Cassandra, en la copiant ici au cas où quelqu'un d'autre cherche la même chose Info. Après avoir pensé à votre scénario, je crois que votre petite taille de SSTable pourrait être due à la compression de données. Par défaut, toutes les tables activent la compression SSTable.

Lancez votre scénario. Disons que vous avez alloué 4 Go à votre noeud Cassandra. Votre memtable_heap_space_in_mb et memtable_offheap_space_in_mb atteindront environ 1Go. Comme vous avez memtable_cleanup_threshold à .50 nettoyage de la table sera déclenché lorsque l'espace total allouable memtable dépasse 1/2GB. Notez que le seuil de nettoyage est .50 de 1 Go et pas une combinaison d'espace de segment de mémoire et hors tas. Cette taille d'allocation de memtable est le montant total disponible pour toutes les tables de votre noeud. Cela inclut tous les espaces de clés liés au système. Le processus de nettoyage va écrire la plus grande memtable sur le disque.

Pour votre cas, je suppose que vous êtes sur un seul noeud avec une seule table avec activité d'insertion. Je ne pense pas que le journal de validation déclenchera un vidage dans cette circonstance, car par défaut, le journal de validation dispose de 8192 Mo d'espace sauf si le journal de validation est placé sur un très petit disque.

Je suppose que votre table sur le disque est inférieure à 500 Mo à cause de la compression. Vous pouvez désactiver la compression sur votre table et voir si cela aide à obtenir la taille désirée.

j'ai écrit un billet de blog expliquant le rinçage memtable (http://abiasforaction.net/apache-cassandra-memtable-flush/)

Permettez-moi de savoir si vous avez une autre question.

J'espère que cela aide.

1

Un déclencheur supplémentaire pour le vidage de memtable est l'espace de commitlog utilisé (32 Mo par défaut).

http://docs.datastax.com/en/cassandra/3.0/cassandra/operations/opsMemtableThruput.html

http://docs.datastax.com/en/cassandra/3.0/cassandra/configuration/configCassandra_yaml.html#configCassandra_yaml__commitlog_total_space_in_mb

Depuis Cassandra devrait être persistant, il doit faire écrit sur le disque pour trouver les données après le noeud défaillant. Si vous n'avez pas besoin de cette durabilité, vous pouvez utiliser d'autres bases de données basées sur la mémoire - redis, memcache etc.

+0

En fait, j'ai désactivé le journal de validation en ajoutant le paramètre durable_writes = false lors de la création de l'espace de clé. Cela ne devrait donc PAS déclencher le vidage basé sur le journal de validation, mais il est toujours en train de le déverser sur le serveur sstable. – pree