2013-04-07 15 views
13

Niedawno rozpocząłem pracę z bazą danych Cassandra. Zainstalowałem single node cluster w moim lokalnym pudełku. Pracuję z Cassandra 1.2.3.commitLog i SSTables w bazie danych Cassandra

Czytałam artykuł w internecie i znalazłem ten line-

Cassandra pisze są najpierw zapisywane w dzienniku commit (dla trwałości), a następnie do struktury tabeli w pamięci nazywa się memtable. Po pomyślnym zapisaniu w dzienniku zatwierdzania i w pamięci zapis jest pomyślny: jest bardzo minimalnym we/wy dysku w momencie zapisu. Zapisy są grupowane w pamięci i okresowo zapisywane na dysku do trwałej tabeli o nazwie SSTable (posortowany ciąg tabel).

Tak więc, aby zrozumieć powyższe linie, napisałem prosty program, który napisze do bazy danych Cassandra za pomocą Pelops client. I mogłem wstawić dane do bazy danych Cassandra.

A teraz próbuję zobaczyć, jak moje dane zostały zapisane w commit log i gdzie to jest commit log file? A także, jak generowane jest SSTables i gdzie mogę znaleźć to również w moim lokalnym polu i co zawiera również.

Chciałem zobaczyć te dwa pliki, aby lepiej zrozumieć, jak Cassandra pracuje za kulisami.

W moim pliku cassandra.yaml, mam coś takiego

# 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 

Ale kiedy otworzyłem commitlog przede wszystkim ma dużo danych, więc mój Notepad ++ nie jest w stanie go otworzyć prawidłowo i jeśli to zostaje otwarty, nie widzę poprawnie z powodu jakiegoś kodowania lub czegoś. A w moim folderze danych nie mogę niczego znaleźć?

Znaczenie ten folder jest pusty Me

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

Czy jest coś jestem brakujące tutaj? Czy ktoś może mi wyjaśnić, jak czytać pliki commitLog i SSTables i gdzie mogę znaleźć te dwa pliki? A także co dokładnie dzieje się za kulisami, gdy piszę do bazy danych Cassandry.

Aktualizacja: -

Kod używam wstawić do Cassandra od bazy danych

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); 
    } 

} 

KEYSPACE i kolumny rodzinę, że mam 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'; 

Odpowiedz

34

Jesteś prawie tam w twoim zrozumieniu. Brakuje jednak kilku drobnych szczegółów.

Więc wyjaśniania rzeczy w sposób uporządkowany, cykl Cassandra zapisu życie operacja jest podzielona na tych etapach

  • commitlog napisać
  • memtable zapisu
  • sstable zapisu

Cassandra pisze to pierwszy zapisywane w dzienniku zatwierdzania (dla trwałości), a następnie w strukturze tabeli w pamięci zwanej memtable. Mówi się, że zapis zakończył się powodzeniem, gdy zostanie zapisany w dzienniku zatwierdzania i pamięci, więc w momencie zapisywania jest bardzo minimalna liczba operacji wejścia/wyjścia dysku. Kiedykolwiek w pamięci kończy się przestrzeń, tj. Gdy liczba kluczy przekracza określony limit (domyślnie 128) lub gdy osiągnie czas trwania (zegar klastrowy), jest on przechowywany w stabilnej, niezmiennej przestrzeni (Ten mechanizm nazywa się Flushing). Gdy zapisy zostaną wykonane na SSTable, możesz zobaczyć odpowiednie dane w folderze danych, w twoim przypadku S:\Apache Cassandra\apache-cassandra-1.2.3\storage\data. Każdy SSTable komponuje się głównie z 2 pliki - plik indeksu i dane pliku

  • plik Index zawiera - filtr Bloom i key-offset par

    • Bloom filtra: Filtr Bloom, jest przestrzenią efektywny probabilistyczny struktura danych używana do testowania, czy element jest członkiem zbioru. Możliwe są fałszywe alarmy, ale fałszywe negatywy nie. Cassandra używa filtrów kwitnienia, aby zapisać IO podczas wykonywania wyszukiwania kluczowego: każdy SSTable posiada filtr kwitnący związany z tym, który Cassandra sprawdza przed wykonaniem jakiegokolwiek dysku szuka, czyniąc zapytania dla kluczy, które nie istnieją prawie całkowicie
    • (klucz, offset) par (punkty na pliku danych)
  • plik danych zawiera aktualne dane kolumn

i dotyczące plików commitlog, są zaszyfrowane pliki utrzymywane wewnętrznie przez Cassandrę, dla których nie są w stanie zobaczyć wszystko poprawnie.

UPDATE:

Memtable jest w pamięci podręcznej z zawartością przechowywane jako klucz/kolumnie (dane posortowane według klucza). Każda rodzina kolumn ma osobne dane modułu Memtable i pobierania z klucza. Mam nadzieję, że masz jasny umysł, aby zrozumieć fakt, dlaczego nie możemy ich zlokalizować na naszym dysku.

W twoim przypadku, twoja notatka nie jest pełna, ponieważ zadeklarowane progi nie są wybielane, ale nie powodują spłukiwania. Możesz dowiedzieć się więcej o MemtableThresholds here, jednak zaleca się, aby nie dotykać tej tarczy.

SSTableStructure:

  • Folder Dane
    • KEYSPACE
      • CF
        • CompressionInfo.db
        • Data.db
        • Filter.db
        • Index.db
        • Statistics.db
        • Migawki Migawki // jeśli są brane

Aby uzyskać więcej informacji, zobacz sstable

+0

Bardzo dziękuję za szczegółowe wyjaśnienie. To usuwa większość moich wątpliwości, ale natrafiłem na jeszcze jedno pytanie. :). Mam nadzieję, że nie będziesz miał nic przeciwko odpowiadaniu na te pytania. Po pierwsze, wspomniałeś, że idzie do "struktury pamięci w pamięci zwanej memtable". Czy jest jakaś lokalizacja tych "struktur tabeli", gdzie mogę zobaczyć, jak to wygląda? I co to właściwie zawiera? Po drugie, wspomniałeś, że zostanie zapisany do sstable tylko, gdy memtable zabraknie miejsca. Tak więc w moim przypadku nie mogę zobaczyć, że sstable jest tworzone w folderze danych. Stworzyłem 'users' jako rodzinę kolumn i wstawiłem do tego dwa wiersze. – ferhan

+0

Kontynuacja, z góry. Może być możliwe, że memtable nie jest pełny w moim przypadku, ponieważ wstawiłem dwa wiersze i dlatego nie jest on przepłukiwany do SSTable, prawda? I zaktualizowałem swoje pytanie za pomocą kodu, nad którym pracuję, aby wstawić do bazy danych Cassandra. Po trzecie, w moim przypadku, jeśli muszę zobaczyć "SSTable" i jak to wygląda i co zawiera? następnie muszę upewnić się, że 'memtable' jest pełny, a następnie wypróżni się tylko do SSTable, a następnie zostanie utworzony w folderze danych? Jeśli tak, jak mogę się upewnić, że memtable jest pełne z mojego programu? – ferhan

+0

@ TechGeeky zobacz dział aktualizacji – abhi

Powiązane problemy