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';
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
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
@TechGeeky siehe Update-Abschnitt – abhi