Способы организации ключей строк для сканирования диапазона в Кассандре - PullRequest
1 голос
/ 31 января 2012

Я пытаюсь найти хороший способ организации моих ключей строк для выполнения сканирования диапазонов на них без создания моих собственных списков индексов.

У меня есть база данных MySQL с в настоящее время около 15.000 баз данных, каждая ~50 таблиц = 75 000 таблиц.Поскольку 99% данных всегда читаются с уникальным идентификатором, эти данные планируется переместить в кластер Cassandra.

Для некоторого обслуживания (перечисление содержимого полной таблицы, удаление полной таблицы или удаление базы данных).) дела, мне нужно получить содержимое полной таблицы или даже базы данных.Range-Scans, кажется, идеально подходят для этого.

В настоящее время я планирую сгенерировать UUID для каждой части старой структуры и собрать их вместе, разделив их | (DB + Table + Id = UUID1| UUID2 | UUID2).

Пример:

07424eaa-4761-11e1-ac67-12313c033ac4|0619a6ec-4525-11e1-906e-12313c033ac4|0619a6ec-4795-12e9-906e-78313c033ac4

CF с данными должен быть отсортирован по org.apache.cassandra.db.marshal.AsciiType.

В качестве клиента я использую phpcassa.

Для сканирования диапазона я хочу использовать UUID| в качестве клавиши начала и в качестве конца диапазона, ту же клавишу, но с добавлением chr(255) или z.Значение ascii для обоих символов больше любых других символов UUID, следующих за этими клавишами.

Является ли это надежным подходом, позволяющим мне достичь объясненных целей для сканирования диапазона?

1 Ответ

5 голосов
/ 01 февраля 2012

Лучшей практикой Cassandra является использование RandomPartitioner - это дает вам «бесплатную» балансировку нагрузки, если ваши токены распределены равномерно.К сожалению, со случайным разделителем запросы на диапазон строк (т.е. get_range_slices) возвращают ключи в случайном порядке.

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

Один из способов решить эту проблему - использовать широкие строки и составные столбцы.Например, семейство столбцов, которое выглядит следующим образом:

{ 
  row1 -> {column1: value1, column2: value2},
  row2 -> {column3: value3, column4: value4},
  ... 
}

будет транспонировано, чтобы выглядеть так:

{
  row1-10 -> {
              [row1, column1]: value1, [row1, column2]: value2,
              [row2, column3]: value3, [row2, column4]: value4,
              ...
             }
  ...
}

И вы можете выполнить запрос диапазона, выполнив фрагмент столбца (get_slice) в правой строке, между правыми столбцами.т. е.

get_range_slice(start=row1, end=row2)

становится:

get_slice(row=row1-10, start=[row1, null], end=[row2, null])

Обратите внимание на нулевое второе измерение на ключах столбцов.

Хитрость заключается в том, чтобы выбрать ключи строк ('bucket')так, что ваши столбцы не станут слишком большими (это будет плохо работать для обычной Cassandra), но при этом ваши запросы не будут нуждаться в слишком большом количестве строк.Это будет зависеть от вашего среднего размера запроса и распределения ваших uuids, но хорошим кандидатом может быть использование UUID1 в качестве ключей строки и [UUID2, UUID3] в качестве первых измерений ключей столбца.

...