Как сравнить содержимое двух пространств ключей Cassandra

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

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

Замечания (сомнения):

  1. В этих пространствах ключей много данных, поэтому я бы хотел избежать сканирования всех строк из обоих пространств ключей и их сравнения.
  2. Могу ли я как-то сравнить файлы sstable (*Data.db)? Пространства ключей имеют точно такую ​​же структуру, поэтому, возможно, файлы * Data.db должны быть одинаковыми (или почти одинаковыми)?
  3. Может есть другой действенный способ?

person pWoz    schedule 27.04.2017    source источник


Ответы (1)


Помимо сравнения каждого ключа, существующего в другом, которого вы хотите избежать, на самом деле нет другого пути. Файлы данных не будут одинаковыми, потому что при очистке и сжатии не всегда будут записываться одни и те же ключи разделов в одни и те же файлы.

Вы можете использовать nodetool cfstats для сравнения предполагаемого количества ключей, но это даст вам только указание

Сказав это, запрос таблицы по ключу раздела — очень быстрая операция, поэтому для данной таблицы, где col1 — это ключ, SELECT col1 from MYTABLE where col1=<key to check> должен выполняться довольно быстро. Если вы используете один из драйверов, вы можете воспользоваться функциями разбиения по страницам, чтобы ограничить наборы результатов управляемыми фрагментами.

Как видно из примера, для драйвера Python вы можете сделать что-то подобное (обратите внимание Я не проверял это!)

from cassandra.query import SimpleStatement
query1 = "SELECT key FROM keyspace1.table1"
statement1 = SimpleStatement(query1, fetch_size=1000)
for row1 in session.execute(statement1):
    # search second table here

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

Надеюсь это поможет

person markc    schedule 27.04.2017
comment
Но строки упорядочены в файле на основе ключей кластеризации. Итак, если предположить, что все данные сброшены и сжаты, файлы данных должны быть почти одинаковыми, верно? Может быть, есть способ проверить только соответствующие части файлов? - person pWoz; 27.04.2017
comment
@pWoz, вы могли бы попробовать, но я такого не видел. вам нужно декодировать файл, используя sstable2json (более ранние версии) или sstabledump (более поздние версии 3.0). Файлы также не обязательно будут иметь одинаковое имя. - person markc; 28.04.2017