2016-09-06 5 views
1

Возможно ли построить модель данных, которая упростит запрос выборки, даже если он, вероятно, создал точки доступа в кластере?Моделирование данных Cassandra - Я выбираю горячие точки, чтобы сделать запрос проще?

При чтении, пожалуйста, имейте в виду, что я не работаю с Solr прямо сейчас и учитывая частоту, к которой будут доступны данные. Я не думал, что использование spark-sql будет уместным. Я хотел бы сохранить это как чистую Кассандру.

У нас есть транзакции, которые моделируются с использованием UUID в качестве ключа раздела, так что данные распределяются равномерно по кластеру. Один из наших шаблонов доступа требует, чтобы интерфейс получить все записи для данного пользователя и диапазона дат, запрос следующим образом:

select * from transactions_by_user_and_day where user_id = ? and created_date_time > ?; 

Первая модель, которую я построил использует user_id и CREATED_DATE (день была создана транзакция, всегда устанавливаются до полуночи):

CREATE transactions_by_user_and_day (
    user_ id int, 
    created_date timestamp, 
    created_date_time timestamp, 
    transaction_id uuid, 
    PRIMARY KEY ((user_id, created_date), created_date_time) 
) WITH CLUSTERING ORDER BY (created_date_time DESC); 

Этот стол, кажется, хорошо работает. Использование created_date как части PK позволяет пользователям распределять вокруг кластера более равномерно, чтобы предотвратить горячие точки. Однако, с точки зрения доступа, он делает уровень доступа к данным немного более полезным, чем мы хотели бы. Он заканчивает того, чтобы создать оператор с использованием всех дней в указанном диапазоне, вместо того, чтобы дать дату и больше, чем оператор:

select * from transactions_by_user_and_day where user_id = ? and created_date in (?, ?, …) and created_date_time > ?; 

Чтобы упростить работу, чтобы быть сделано на уровне доступа к данным, я считал моделирование данные следующим образом:

CREATE transactions_by_user_and_day (
    user_id int, 
    created_date_time timestamp, 
    transaction_id uuid, 
    PRIMARY KEY ((user_global_id), created_date_time) 
) WITH CLUSTERING ORDER BY (created_date_time DESC); 

с помощью данной модели, уровень доступа к данным может принести в TRANSACTION_ID для пользователя и фильтра на определенный диапазон дат в Кассандре. Тем не менее, это создает вероятность наличия горячих точек внутри кластера. Пользователи с долговечностью и/или высокой громкостью создадут еще несколько столбцов в строке. Мы намерены предоставить TTL данные, поэтому ничего более 60 дней. Кроме того, я проанализировал размер данных и 60-дневную стоимость данных для наших пользователей с самым высоким объемом менее 2 МБ. Выполняя математику, если мы предположим, что все 40 000 пользователей (это число не будет значительно расти) распределяются равномерно по 3-х узловому кластеру и 2 МБ данных для каждого пользователя, в итоге вы получаете максимум чуть более 26 ГБ на узел ((13333,33 * 2)/1024). На самом деле, вы не получите в итоге 1/3 ваших пользователей, которые будут делать этот объем, и вам нужно будет действительно не повезло, если бы Cassandra, используя V-Nodes, разместил всех этих пользователей на одном узле. С точки зрения ресурсов, я не думаю, что 26 GB собирается сделать или сломать что угодно.

Спасибо за ваши мысли.

ответ

1

Дата Модель 1: Что-то еще, что вы могли бы сделать, это изменить уровень доступа к данным для выполнения запроса для каждого идентификатора отдельно, вместо использования предложения IN. Проверьте эту страницу, чтобы понять, почему это было бы лучше.

https://lostechies.com/ryansvihla/2014/09/22/cassandra-query-patterns-not-using-the-in-query-for-multiple-partitions/

модель данных 2: 26GB данных на узел, кажется, не так много, но получить бонус в 2MB кажется немного большим. Конечно, если это выброс, то я не вижу проблемы с этим. Вы можете попробовать настроить работу по кассандре, чтобы проверить модель. Пока большинство ваших разделов меньше 2 МБ, это должно быть хорошо.

Другим решением было бы использовать Data Model 2 с Bucketing. Это даст вам больше накладных расходов на записи, так как вам придется поддерживать таблицу поиска в виде ковша. Дайте мне знать, если мне понадобится более подробно остановиться на этом подходе.

+0

Спасибо @gsteiner. Я не думал о проблемах с использованием предложения IN, спасибо за то, что указал мне в этом направлении. Когда уровень доступа к данным выполняет много запросов, мы все еще хотим уклониться от него, это просто странно (возможно, это реляционный мир, в котором мы так долго говорили). Я, конечно же, проведу стресс-тестирование с данными, чтобы увидеть, как это работает. Мне бы хотелось услышать больше о bucketing. Я немного почитал об этом, и, похоже, я все еще выполняю несколько запросов на уровне доступа к данным, получая нужные ведра, а затем запрашиваю их. – ammills01

+1

Это очень «реляционная» вещь, которая не хочет делать много запросов. Кассандра на самом деле работает лучше с большим количеством запросов, поскольку каждый запрос будет использовать узел координатора, который лучше всего подходит для этого запроса. Yup, с ведрами вам все равно нужно будет выполнять несколько запросов, но это будет меньше запросов, чем Model 1. Просто зависит от вашего размера ведра. – gsteiner