Моделирование данных Cassandra менее 1000 записей для размещения в одной строке

У нас есть некоторая сущность, однозначно идентифицируемая сгенерированным UUID. Нам нужна поддержка поиска по имени запроса. Также нам нужно поддерживать сортировку по имени.

Мы знаем, что будет не более 1000 сущностей этого типа, которые идеально поместятся в одну строку. Является ли жизнеспособной идея жестко закодировать первичный ключ, использовать имя в качестве ключа кластеризации и идентификатор в качестве ключа кластеризации, чтобы удовлетворить уникальность. Допустим, нам нужна школьная организация. Вот пример:

CREATE TABLE school (
  constant text,
  name text,
  id uuid,
  description text,
  location text,
  PRIMARY KEY ((constant), name, id)
);

Начальное состояние было бы дать мне все школы, а затем произойдет фильтрация по точному имени. Наша причина заключалась в том, чтобы поместить все школы в одну строку для быстрого доступа, иметь имя в качестве столбца кластеризации для фильтрации и иметь идентификатор в качестве столбца кластеризации, чтобы гарантировать уникальность. Мы можем использовать constant = school как известное жестко заданное значение для доступа к этой строке.

Что мне нравится в этом решении, так это то, что все значения находятся в одной строке, и мы получаем быстрое чтение. Также мы можем легко решить сортировку с помощью кластеризации столбца. Что мне не нравится, так это жестко запрограммированное значение для constant, что кажется странным. Мы могли бы использовать name в качестве PK, но тогда у нас было бы 1000 записей, разбросанных по паре разделов, вероятно, найти все без имени было бы медленнее и не сортировалось бы.

Вопрос 1

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

Вопрос 2

Имя является редактируемым полем, оно, вероятно, будет редко меняться (кто-то может сделать опечатку или школа может изменить имя), но оно может измениться. Каков наилучший способ добиться этого? Удалить вставку внутри пакета (LTE можно применить к той же строке с условным предложением)?


person Nenad Bozic    schedule 30.08.2015    source источник


Ответы (2)


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

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

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

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

person Jim Meyer    schedule 30.08.2015
comment
Спасибо за обстоятельный ответ и замечание по многим клиентам, об этом не подумал. У меня есть еще один вопрос по этому поводу, название школы можно редактировать, какая для этого лучшая стратегия? Меняться будет редко, но кто-то может сделать опечатку, удалить вставить? - person Nenad Bozic; 31.08.2015
comment
Я также добавил эту часть к вопросу 2. Ваш ответ охватывает все, поэтому я соглашусь, это как бонус, если у вас есть мнение по этому поводу, и заранее спасибо! - person Nenad Bozic; 31.08.2015
comment
Да, чтобы изменить имя, вам нужно удалить старое имя и вставить новое имя, поскольку обновление ключевого столбца запрещено. - person Jim Meyer; 31.08.2015

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

Ранее в этом году я кратко рассмотрел этот тип решения для моделирования в своей статье: У нас Порядок! Это так называемый "фиктивный ключ", когда каждая строка имеет один и тот же ключ раздела. Это ярлык, который позволяет легко упорядочить все ваши строки (на несвязанном SELECT *) путем кластеризации столбцов.

Проблемы с этим решением:

  • Cassandra допускает не более 2 миллиардов значений столбцов на ключ секции. При использовании фиктивного ключа раздела вы будете приближаться к этому пределу с каждым добавляемым значением.

  • Все ваши данные будут храниться в одном разделе, что создаст «горячую точку» (большие группы данных) в вашем кластере. Это означает, что ваша модель данных немедленно лишит вас одного из основных преимуществ Cassandra... распределения данных. Это также усложнит балансировку нагрузки (одни и те же узлы и диапазоны будут продолжать обслуживать все ваши запросы).

  • Я вижу, что ваша модель построена вокруг запроса SELECT *. Cassandra работает лучше всего, когда вы можете дать ей определенные ключи для запроса. Несвязанные запросы SELECT * (запросы без предложений WHERE) не рекомендуется выполнять с Cassandra, поскольку они могут привести к тайм-аутам (по мере роста ваших данных).

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

Тогда я должен задаться вопросом: почему вы используете Cassandra? Как Cassandra MVP, я не часто задаю этот вопрос. Но у вас нет особенно большого набора данных (для работы с которым предназначена Cassandra). Полагаться на этот факт как на причину для неправильного использования продукта — не лучшее решение.

Честно говоря, я собираюсь порекомендовать вам избавить себя от некоторых сложностей и вместо этого использовать СУБД. Это будет соответствовать вашему варианту использования значительно лучше, чем Cassandra. Затем вы можете обновлять и упорядочивать любые поля, которые вы хотите.

person Aaron    schedule 01.09.2015
comment
Спасибо за ответ. Это всего лишь одна таблица в наборе данных. Мы используем его для аналитики и платформы для голосования, которая собирает пару тысяч голосов в день. Итак, у нас есть жизнеспособный вариант использования. Мы знаем, что некоторые из наших данных лучше принадлежат РСУБД, но мы решили, что стоимость обслуживания и интеграции для двух источников хранения больше, чем использование cassandra для некоторых таблиц не по книге. Использование 2 или даже 3 решений для хранения, вероятно, является правильным ответом, но это продукт MVP (скорость важна). - person Nenad Bozic; 01.09.2015
comment
Также звездочка SELECT * — это использование панели администратора, которая будет использоваться редко, в части внешнего интерфейса у нас будут users_by_school и schools_by_user, которые будут идти в отдельных таблицах. Поиск школы по названию - это только помощь администратору, чтобы быстрее перейти к нужной школе и внести изменения. Думайте, что наиболее правильное моделирование - это school_by_id, и выполняйте фильтрацию имен на уровне приложения. - person Nenad Bozic; 02.09.2015
comment
Только что закончил курс моделирования datastax academy.datastax.com/courses/ds220-data-modeling, в 3-й главе с конца (Случаи использования: данные датчика) есть пример, подобный моему, и Джейми Кинг предлагает использовать ведро (искусственный столбец в качестве ключа) для данных, которые будут иметь небольшое количество значений, чтобы один запрос попал в одну часть. Это создаст горячие точки, но это есть в официальном учебном материале для сертификации cassandra. Это чем хорошая идея или нет? - person Nenad Bozic; 07.09.2015