Подтвердить что ты не робот

CommitLog и SSTables в базе данных Cassandra

Недавно я начал работать с базой данных Cassandra. Я установил single node cluster в своем локальном поле. И я работаю с Cassandra 1.2.3.

Я читал статью в Интернете, и я нашел эту строку -

Запись Cassandra сначала записывается в журнал фиксации (для долговечности), а затем в структуру таблицы в памяти, называемую memtable. Запись успешно после того, как он будет записан в журнал фиксации и память, так что очень минимальный диск ввода/вывода во время записи. Записи записываются в память и периодически записывается на диск в постоянную таблицу структура, называемая SSTable (отсортированная таблица строк).

Итак, чтобы понять приведенные выше строки, я написал простую программу, которая будет писать в Cassandra Database с помощью Pelops client. И мне удалось вставить данные в базу данных Cassandra.

И теперь я пытаюсь посмотреть, как мои данные были записаны в commit log и где это commit log file? А также, как создается SSTables, и где я могу найти это также в моем локальном поле и том, что он содержит.

Мне хотелось увидеть эти два файла, чтобы я мог больше понять, как Кассандра работает за кулисами.

В моем файле cassandra.yaml у меня есть что-то вроде этого

# 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

Но когда я открыл commitLog, в первую очередь у него много данных, поэтому мой блокнот ++ не может его правильно открыть, и если он открывается, я не могу правильно видеть из-за некоторой кодировки или чего-то еще. И в моей папке с данными я ничего не могу узнать?

Значение этой папки для меня пуста -

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

Есть ли что-нибудь, чего я здесь не вижу? Может ли кто-нибудь объяснить мне, как читать файлы commitLog и SSTables и где я могу найти эти два файла? А также, что именно происходит за кулисами всякий раз, когда я пишу в базу данных Cassandra.

Обновлено: -

Код, который я использую для вставки в базу данных Cassandra -

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

}

Семейство ключей и столбцов, которые я создал -

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';
4b9b3361

Ответ 1

Ты почти в своем понимании. Тем не менее, пропустите несколько минутных деталей.

Итак, объясняя вещи структурированным способом, жизненный цикл записи кассандры делится на эти шаги

  • commitlog write
  • memtable write
  • sstable write

Cassandra пишет сначала записывается в журнал фиксации (для долговечности), а затем в структуру таблиц в памяти, называемую memtable. Запись считается успешной, как только она записывается в журнал фиксации и память, поэтому на момент записи очень минимальный дисковый ввод-вывод. Когда когда-либо пространство памяти заканчивается в пространстве, то есть когда количество ключей превышает определенный предел (по умолчанию 128) или когда оно достигает продолжительности времени (часы кластера), оно сохраняется в sstable, неизменяемое пространство (этот механизм называется Промывка). Когда записи выполняются в SSTable, вы можете увидеть соответствующие данные в папке с данными, в вашем случае - S:\Apache Cassandra\apache-cassandra-1.2.3\storage\data. Каждый SSTable состоит в основном из 2 файлов - индексный файл и файл данных

  • Индексный файл содержит - Фильтр цветения и пары "Ключ-смещение"

    • Фильтр Bloom: фильтр Bloom - это пространственно-эффективная вероятностная структура данных, которая используется для проверки того, является ли элемент элементом набора. Возможны ложные срабатывания, но ложных негативов нет. Cassandra использует фильтры цветения для сохранения ввода-вывода при выполнении ключевого поиска: каждый SSTable имеет связанный с ним фильтр цветения, который Cassandra проверяет перед тем, как делать какие-либо запросы на диск, делая запросы для ключей, которые не существуют почти бесплатно.
    • (ключевые, смещенные) пары (точки в файле данных)
  • Файл данных содержит фактические данные столбца

И в отношении файлов commitlog это зашифрованные файлы, которые по существу поддерживаются Cassandra, для которых вы не можете ничего увидеть правильно.

ОБНОВЛЕНИЕ:

Memtable - это кеш в памяти, содержимое которого хранится как ключ/столбец (данные сортируются по ключу). Каждое семейство столбцов имеет отдельный Memtable и извлекает данные столбца из ключа. Поэтому теперь я надеюсь, что вы в явном состоянии, чтобы понять факт, почему мы не можем найти их на нашем диске.

В вашем случае ваша память не заполнена, так как пороги памяти не отбеливаются, но не смываются. Вы можете узнать больше о MemtableThresholds здесь, хотя рекомендуется не прикасаться к этому циферблату.

SSTableStructure:

  • Ваша папка с данными
    • пространство ключей
      • CF
        • CompressionInfo.db
        • Data.db
        • Filter.db
        • Index.db
        • Statistics.db
        • моментальные снимки//если снимок сделан

Для получения дополнительной информации см. sstable