На каком узле Cassandra хранит данные?

Есть ли команда или вообще какой-либо способ узнать, какие данные хранятся на каких узлах Cassandra?

Я новичок в Кассандре, и мне не очень повезло с поиском этого вопроса.

Спасибо!


person user3376961    schedule 28.05.2015    source источник


Ответы (2)


Вы можете заставить Cassandra сказать вам, на каком узле (ах) находится конкретный ключ, с помощью getendpoints nodetool.

$ nodetool getendpoints mykeyspace tbl '8546200'
192.168.73.188
192.168.73.190

Не знаю, ищете ли вы этого или нет. AFAIK нет способа напрямую запросить ответственные узлы для всех строк в таблице или пространстве ключей. Но, как заметил Блейк, вашему приложению не нужно об этом беспокоиться.

Если вы действительно хотите узнать, вы можете запросить свою таблицу, используя функцию token в вашем ключе раздела. Вот пример использования схемы Блейка:

SELECT token(partition_key),partition_key FROM tbl;

Это будет перечислять хешированные токены с вашими ключами раздела. Затем вы можете запустить nodetool ring, чтобы перечислить диапазоны токенов для каждого узла и посмотреть, какие узлы отвечают за этот диапазон. Обратите внимание, что если вы используете vNodes, ваш вывод будет довольно большим (по умолчанию 256 строк для каждого).

person Aaron    schedule 28.05.2015
comment
Спасибо!! Это именно то, что я искал - person user3376961; 28.05.2015

Cassandra использует согласованное хеширование для ключа разделения строки, чтобы определить, где хранятся данные. Токены назначаются узлам, и согласованный хэш ключа раздела определяет, какой узел (узлы) будет хранить строку.

Ключ раздела - это первая часть ПЕРВИЧНОГО КЛЮЧА в определении таблицы или во вложенных скобках

CREATE TABLE tbl (
partition_key INT,
clus_key TEXT,
...,
PRIMARY KEY((partition_key), clus_key);

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

Во время запроса вам не нужно беспокоиться о том, на каком узле что есть. Ваш драйвер C * выберет узел координатора из предоставленного списка, который найдет строки на основе вашего запроса.

Если вы хотите увидеть подробную информацию о том, что делает запрос в CQLSH, попробуйте включить трассировку:

> TRACING ON;
> SELECT * FROM table; 

> Tracing session: 1f6b4440-050f-11e5-ba41-672ef88f159d
> ....
> <Details about the query>
> ....
person Blake Atkinson    schedule 28.05.2015
comment
Спасибо за быстрый ответ! Кольцо и последовательное хеширование имеют смысл, но есть ли способ увидеть все это за кадром. В частности, есть ли способ узнать, какие хеш-диапазоны назначены каждому узлу и какое хеш-значение получается из ключа раздела (чтобы затем знать, какие данные хранятся на каком узле)? - person user3376961; 28.05.2015
comment
Ответ Брайса содержит некоторые из этих ответов: nodetool getendpoints ‹Keyspace.Table› ‹PartitionKey› и функция token () в CQL. - person Blake Atkinson; 28.05.2015