2013-04-07 13 views
13

Ich habe vor kurzem begonnen, mit Cassandra-Datenbank zu arbeiten. Ich habe single node cluster in meiner lokalen Box installiert. Und ich arbeite mit Cassandra 1.2.3.commitLog und SSTables in Cassandra-Datenbank

Ich war im Internet den Artikel zu lesen und ich fand diese Leitungsausgangs-

Cassandra schreibt zuerst geschrieben werden in einer Log-commit (Haltbarkeit), und dann zu einer In-Memory-Strukturtabelle genannt Memtable. Ein Schreiben ist erfolgreich, sobald es in das Festschreibungsprotokoll und den Speicher geschrieben wird, so dass sehr minimale Datenträger-E/A zum Zeitpunkt des Schreibens ist. Die Schreibvorgänge werden in den Speicher getaktet und periodisch in eine persistente Tabelle geschrieben, die als SSTable (sortierte Stringtabelle) bezeichnet wird.

So die obigen Zeilen zu verstehen, habe ich ein einfaches Programm, das auf Cassandra Datenbank mit Pelops client schreiben. Und ich konnte die Daten in die Cassandra-Datenbank einfügen.

Und jetzt versuche ich zu sehen, wie meine Daten in commit log geschrieben wurden und wo das commit log file ist? Und auch wie SSTables generiert wird und wo ich das auch in meiner lokalen Box finde und was es auch enthält.

Ich wollte diese beiden Dateien sehen, damit ich mehr verstehe, wie Cassandra hinter den Kulissen arbeitet.

In meiner cassandra.yaml Datei, ich habe so etwas wie diese

# directories where Cassandra should store data on disk. 
data_file_directories: 
    - S:\Apache Cassandra\apache-cassandra-1.2.3\storage\data 

# commit log 
commitlog_directory: S:\Apache Cassandra\apache-cassandra-1.2.3\storage\commitlog 

# saved caches 
saved_caches_directory: S:\Apache Cassandra\apache-cassandra-1.2.3\storage\savedcaches 

Aber wenn ich commitLog geöffnet, vor allem hat es viele Daten so mein Notizblock ++ nicht in der Lage ist, es richtig zu öffnen und wenn es wird geöffnet, kann ich nicht richtig sehen wegen einer Codierung oder was. Und in meinem Datenordner kann ich nichts herausfinden?

diesen Ordner Bedeutung ist leer für me-

S:\Apache Cassandra\apache-cassandra-1.2.3\storage\data\my_keyspace\users 

Gibt es etwas, ich bin hier fehlt? Kann mir jemand erklären, wie ich die Dateien commitLog und SSTables lese und wo ich diese beiden Dateien finde? Und was passiert genau hinter den Kulissen, wenn ich in die Cassandra-Datenbank schreibe?

Aktualisiert: -

Code I in Cassandra Database-

public class MyPelops { 

    private static final Logger log = Logger.getLogger(MyPelops.class); 

    public static void main(String[] args) throws Exception { 


     // ------------------------------------------------------------- 
     // -- Nodes, Pool, Keyspace, Column Family --------------------- 
     // ------------------------------------------------------------- 

     // A comma separated List of Nodes 
     String NODES = "localhost"; 

     // Thrift Connection Pool 
     String THRIFT_CONNECTION_POOL = "Test Cluster"; 

     // Keyspace 
     String KEYSPACE = "my_keyspace"; 

     // Column Family 
     String COLUMN_FAMILY = "users"; 

     // ------------------------------------------------------------- 
     // -- Cluster -------------------------------------------------- 
     // ------------------------------------------------------------- 

     Cluster cluster = new Cluster(NODES, 9160); 

     Pelops.addPool(THRIFT_CONNECTION_POOL, cluster, KEYSPACE); 

     // ------------------------------------------------------------- 
     // -- Mutator -------------------------------------------------- 
     // ------------------------------------------------------------- 

     Mutator mutator = Pelops.createMutator(THRIFT_CONNECTION_POOL); 

     log.info("- Write Column -"); 

     mutator.writeColumn(
       COLUMN_FAMILY, 
       "Row1", 
       new Column().setName(" Name ".getBytes()).setValue(" Test One ".getBytes()).setTimestamp(new Date().getTime())); 

     mutator.writeColumn(
       COLUMN_FAMILY, 
       "Row1", 
       new Column().setName(" Work ".getBytes()).setValue(" Engineer ".getBytes()).setTimestamp(new Date().getTime())); 

     log.info("- Execute -"); 
     mutator.execute(ConsistencyLevel.ONE); 

     // ------------------------------------------------------------- 
     // -- Selector ------------------------------------------------- 
     // ------------------------------------------------------------- 

     Selector selector = Pelops.createSelector(THRIFT_CONNECTION_POOL); 

     int columnCount = selector.getColumnCount(COLUMN_FAMILY, "Row1", 
       ConsistencyLevel.ONE); 
     System.out.println("- Column Count = " + columnCount); 

     List<Column> columnList = selector 
       .getColumnsFromRow(COLUMN_FAMILY, "Row1", 
         Selector.newColumnsPredicateAll(true, 10), 
         ConsistencyLevel.ONE); 
     System.out.println("- Size of Column List = " + columnList.size()); 

     for (Column column : columnList) { 
      System.out.println("- Column: (" + new String(column.getName()) + "," 
        + new String(column.getValue()) + ")"); 
     } 

     System.out.println("- All Done. Exit -"); 
     System.exit(0); 
    } 

} 

Schlüsselraum und Spalte Familie einzufügen verwenden, die ich created-

create keyspace my_keyspace with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' and strategy_options = {replication_factor:1}; 
use my_keyspace; 
create column family users with column_type = 'Standard' and comparator = 'UTF8Type'; 

Antwort

34

Sie sind fast da habe in deinem Verständnis. Allerdings fehlen einige winzige Details.

So Dinge in einer strukturierten Art und Weise, cassandra Schreiboperation Lebenszyklus zu erklären in diesen Schritten unterteilt ist

  • commitlog
  • memTable Schreib
  • sstable Schreib

Cassandra schreibt zu schreiben sind erste in ein Commit-Protokoll (für die Dauerhaftigkeit) geschrieben und dann in eine speicherinterne Tabellenstruktur, die als memable bezeichnet wird. Ein Schreiben wird als erfolgreich bezeichnet, sobald es in das Festschreibungsprotokoll und den Speicher geschrieben ist, so dass zum Zeitpunkt des Schreibens sehr wenig Platten-E/A vorhanden ist. Wann immer die memTable der Platz ausgeht, das heißt, wenn die Anzahl der Tasten bestimmte Grenze überschreitet (128 Standard ist), oder wenn es die Zeitdauer (Clustertakt) erreicht, wird es in sstable, unveränderlichen Raum gespeichert wird (dieser Mechanismus aufgerufen wird Flushing). Sobald die Schreibvorgänge auf SSTable ausgeführt wurden, können Sie die entsprechenden Daten im Datenordner sehen, in Ihrem Fall S:\Apache Cassandra\apache-cassandra-1.2.3\storage\data. Jeder SSTable setzt sich zusammen aus hauptsächlich zwei Dateien - Index-Datei und Daten

  • Index-Datei enthält Datei - Filter Bloom und Key-Offset-Paare

    • Bloom Filter: Ein Bloom-Filter, ist eine platzsparende probabilistische Datenstruktur, mit der getestet wird, ob ein Element Mitglied eines Sets ist. Falsche Positive sind möglich, falsche Negative hingegen nicht. Cassandra verwendet Blüte Filter IO zu speichern, wenn ein Schlüssel-Lookup ausführen: jeder SSTable hat einen Bloom-Filter mit ihm verbunden, dass Cassandra überprüft, bevor sie eine Platte zu tun sucht, Abfragen für Schlüssel, die
    • (Key, Offset) nicht fast frei existieren Paare (Punkte in Datendatei)
  • Datendatei, die die tatsächliche Spaltendaten enthält

Und commitlog Dateien enthalten, werden diese verschlüsselten Dateien intrinsisch durch Cassandra beibehalten, für die Sie nicht in der Lage sind zu sehen, alles richtig.

UPDATE:

memTable ist ein In-Cache-Speicher mit Inhalt als Schlüssel/Spalte gespeichert (Daten, die durch Schlüssel sortiert werden). Jede Spaltenfamilie verfügt über separate Memtable- und Abrufspalten-Daten vom Schlüssel. So, jetzt hoffe ich, dass Sie in einem klaren Geisteszustand sind, um die Tatsache zu verstehen, warum wir sie nicht auf unserer Festplatte finden können.

In Ihrem Fall ist Ihr memTable nicht voll als memTable Schwellen noch resultieren keine Spülung nicht gebleicht werden. Sie können mehr über MemtableThresholds here erfahren, obwohl es empfohlen wird, das Dial nicht zu berühren.

SSTableStructure:

  • Ihre Datenordner
    • KEYSPACE
      • CF
        • CompressionInfo.db
        • Data.db
        • Filter.db
        • Index.db
        • Statistics.db
        • Schnappschüsse // wenn Snapshots genommen

Für weitere Informationen siehe sstable

+0

Vielen Dank für die detaillierte Erklärung. Das löste die meisten meiner Zweifel auf, stieß aber auf eine weitere Frage. :). Hoffe, dass es Ihnen nichts ausmacht, auch diese zu beantworten. Zuerst haben Sie erwähnt, dass es zu einer speicherinternen Tabellenstruktur geht, die als memtable bezeichnet wird. Gibt es einen Ort dieser "Tabellenstruktur", in dem ich sehen kann, wie er aussieht? Und was enthält es eigentlich? Zweitens haben Sie erwähnt, dass es nur dann in sstable geschrieben wird, wenn auf dem memtable kein Platz mehr ist. In meinem Fall kann ich nicht sehen, dass sstable im Datenordner erstellt wird. Ich habe 'Benutzer' als die Spaltenfamilie erstellt und ich habe zwei Zeilen darin eingefügt. – ferhan

+0

Fortsetzung, von oben. Es ist möglich, dass memtable in meinem Fall nicht voll ist, da ich zwei Zeilen eingefügt habe und deshalb nicht zu SSTable geleert wurde, oder? Und ich habe meine Frage mit dem Code aktualisiert, mit dem ich arbeite, um sie in die Cassandra-Datenbank einzufügen. Drittens, in meinem Fall, wenn ich 'SSTable' sehen muss und wie es aussieht und was es enthält? dann muss ich sicherstellen, dass 'memtable' voll ist, dann wird es nur nach SSTable ausgespült und dann wird es im Datenordner erstellt. Wenn ja, wie kann ich sicherstellen, dass Memtable von meinem Programm voll ist? – ferhan

+0

@TechGeeky siehe Update-Abschnitt – abhi