web-dev-qa-db-fra.com

Quel est le but du journal de validation de Cassandra?

S'il vous plaît, quelqu'un clarifie pour moi de comprendre Commit Log et son utilisation.

Dans Cassandra, lors de l'écriture sur le disque, le journal de validation est le premier point d'entrée ou MemTables.

Si Memtables est ce qui est vidé sur le disque, à quoi sert le journal de validation, le seul but du journal de validation est-il de résoudre les problèmes de synchronisation du serveur si un nœud de données est en panne?

37
Satheesh

Vous pouvez considérer le journal de validation comme une optimisation, mais Cassandra serait incroyablement lent sans lui. Lorsque MemTables est écrit sur le disque, nous les appelons SSTables. SSTables sont immuables, ce qui signifie une fois Cassandra les écrit sur le disque, il ne les met pas à jour. Ainsi, lorsqu'une colonne change Cassandra doit écrire un nouveau SSTable sur le disque. Si Cassandra = écrivait ces SSTables sur le disque à chaque mise à jour, ce serait complètement IO lié et très lent.

Donc Cassandra utilise quelques astuces pour obtenir de meilleures performances. Au lieu d'écrire SSTables sur le disque à chaque mise à jour de colonne, il conserve les mises à jour en mémoire et vide périodiquement ces modifications sur le disque pour conserver le IO à un niveau raisonnable. Mais cela conduit au problème évident que si la machine tombe en panne ou Cassandra plante, vous perdriez des données sur ce nœud. Pour éviter de perdre des données, en plus de conserver les modifications récentes en mémoire, Cassandra écrit les modifications dans son CommitLog.

Vous demandez peut-être pourquoi l'écriture dans CommitLog est meilleure que la simple écriture des SSTables. Le CommitLog est optimisé pour l'écriture. Contrairement aux SSTables qui stockent les lignes dans l'ordre trié, le CommitLog stocke les mises à jour dans l'ordre dans lequel elles ont été traitées par Cassandra. Le CommitLog stocke également les modifications pour toutes les familles de colonnes dans un seul fichier, de sorte que le disque n'a pas besoin d'effectuer plusieurs recherches lorsqu'il reçoit des mises à jour pour plusieurs familles de colonnes en même temps.

Fondamentalement, l'écriture du CommitLog sur le disque est meilleure car il doit écrire moins de données que l'écriture de SSTables et il écrit toutes ces données à un seul endroit sur le disque.

Cassandra garde une trace des données qui ont été vidées dans SSTables et est capable de tronquer le journal de validation une fois que toutes les données antérieures à un certain point ont été écrites.

Lorsque Cassandra démarre, il doit lire le journal de validation à partir de ce dernier bon moment connu (le point auquel nous savons que toutes les écritures précédentes ont été écrites sur un SSTable). Il réapplique les modifications dans le journal de validation de ses MemTables afin qu'il puisse entrer dans le même état lorsqu'il s'est arrêté. Ce processus peut être lent, donc si vous arrêtez un nœud Cassandra pour la maintenance, c'est une bonne idée utiliser nodetool drain avant de l'arrêter, ce qui videra tout le contenu des MemTables vers SSTables et réduira la quantité de travail au démarrage.

62
psanford

Le chemin d'écriture dans cassandra fonctionne comme ceci:

Cassandra Node ---->Commitlog-----------------> Memtable
                         |                       |
                         |                       |
                         |---> Periodically      |---> Periodically
                              sync to  disk          flush to SSTable

Memtable et CommitLog sont PAS écrits (en quelque sorte) en parallèle. L'écriture dans CommitLog doit être terminée avant de commencer à écrire dans Memtable. La pile de code source associée est:

org.Apache.cassandra.service.StorageProxy.mutateMV:mutation.apply->
org.Apache.cassandra.db.Mutation.apply:Keyspace.open(keyspaceName).apply->
org.Apache.cassandra.db.Keyspace.apply->
org.Apache.cassandra.db.Keyspace.applyInternal{
    Tracing.trace("Appending to commitlog");
    commitLogPosition = CommitLog.instance.add(mutation)
    ...
    Tracing.trace("Adding to {} memtable",...
    ...
    upd.metadata().name(...);
    ...
    cfs.apply(...);
    ...
}

Le commitlog a pour but de pouvoir recréer la table mémoire après qu'un nœud se bloque ou soit redémarré. Ceci est important, car la table mémoire n'est vidée sur le disque que lorsqu'elle est `` pleine '' - ce qui signifie que la taille de la table mémoire configurée est dépassée - ou la vidange est effectuée par nodetool ou opscenter. Les données de memtable ne sont donc pas conservées directement.

Cela dit, une bonne chose avant de redémarrer un noeud est d'appeler "nodetool flush" pour vous assurer que votre mémoire est persistante. Cela réduira également le temps de lecture du journal de validation après la réapparition du nœud.

30
HashtagMarkus