2016-09-15 7 views
1

У нас есть таблица, в которой хранятся наши данные, разделенные файлами. Один файл от 200MB до 8GB в json - но, очевидно, много накладных расходов. Уплотнение необработанных данных резко снизит. Я проглотил около 35 ГБ данных json, и только один узел получил несколько более 800 МБ данных. Возможно, это связано с «написанием горячих точек», но мы пишем только один раз и только для чтения. Мы не обновляем данные. В настоящее время у нас есть один раздел на файл.Один большой раздел или несколько меньших, но более распределенных разделов для запросов диапазона в Кассандре?

Используя вторичные индексы, мы ищем разделы в базе данных, которые содержат определенную геолокацию (= первый запрос), а затем берут результат этого запроса для запроса диапазона временного диапазона найденных разделов (= второй запрос). Это может быть даже весь файл, если необходимо, но в 95% запросов запрашиваются только куски раздела.

У нас есть коэффициент репликации 2 на кластере из 6 узлов. Данные довольно равномерно распределены, каждый узел владеет 31,9% до 35,7% (эффективными) данными в соответствии с nodetool status *tablename*.

Хорошее качество чтения является ключевым для нас.

Мои вопросы:

  1. Насколько велика слишком велик для раздела с точки зрения объема или строки размера? Есть ли правило для этого?
  2. Для производительности диапазона запросов: лучше ли разделять наши «большие» разделы, чтобы иметь более мелкие разделы? Мы построили нашу схему с «большими» разделами, потому что мы думали, что когда мы будем задавать запросы на раздел, было бы хорошо иметь все это на одном узле, чтобы данные могли быть легко извлечены. Обратите внимание, что данные также доступны на одной реплики в связи с РФ 2.

ответ

1
  1. C * поддерживает очень большие строки, но это не значит, что это хорошая идея, чтобы перейти к этому уровню. Ограничение справа зависит от конкретных случаев использования, но хорошее значение для шара может составлять от 10 до 50 тысяч. Конечно, все это компромисс, поэтому, если у вас есть «огромные» (с точки зрения байтов) строки, они сильно ограничивают количество строк в каждом разделе. Если у вас есть «маленькие» (с точки зрения байтов) строки, вы можете немного расслабиться. Это связано с тем, что один раздел означает один узел только из-за вашего RF = 1, поэтому весь ваш запрос для определенного раздела ударит только по одному узлу.
  2. Запросы диапазона в идеале должны идти только на один раздел. Запрос диапазона означает последовательное сканирование вашего раздела на узле, получающем запрос. Тем не менее, вы ограничитесь пропускной способностью этого узла. Если вы разделите запросы диапазона между большим количеством узлов (то есть вы измените способ разбивки своих данных, добавив что-то вроде bucket), вам также необходимо получить данные от разных узлов, а также выполнить параллельные запросы, напрямую увеличивая общую пропускную способность , Конечно, вы потеряете порядок своих записей в разных ведрах, поэтому, если порядок в вашем разделе имеет значение, тогда это невозможно.
+0

Извините, я неправильно использовал коэффициент репликации слов. На самом деле у нас есть RF 2 ('CREATE KEYSPACE, что бы ни было с репликацией = {'class': 'NetworkTopologyStrategy', 'dc1': '2'} AND durable_writes = true;'). Я отредактировал вопрос соответствующим образом. Будет ли чтение перенаправлено на реплику, если «главный» узел уже находится под давлением? – j9dy

+1

RF = 2 просто означает, что 2 (прочитанные) запросы на одном и том же разделе могут попасть в 2 разных узла. Если это произойдет, зависит от вашего драйвера C *.Однако это не приведет к увеличению пропускной способности ** одного запроса **. – xmas79

+0

Спасибо за разъяснение. Я думаю, что это отлично подходит для нашего использования. Наш первый запрос (см. Выше) обычно возвращает несколько файлов (= разделы), которые содержат искомое поле. Поскольку они (идеально) расположены на разных узлах, мы ударим несколько узлов в последующем запросе. Драйвер, который знает о репликации, может перенаправить запрос на реплика вместо этого, когда другой узел получил запрос для выполнения уже. Вы знаете, является ли драйвер Datastax C * «репликой»? – j9dy