Возможно ли построить модель данных, которая упростит запрос выборки, даже если он, вероятно, создал точки доступа в кластере?Моделирование данных 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 собирается сделать или сломать что угодно.
Спасибо за ваши мысли.
Спасибо @gsteiner. Я не думал о проблемах с использованием предложения IN, спасибо за то, что указал мне в этом направлении. Когда уровень доступа к данным выполняет много запросов, мы все еще хотим уклониться от него, это просто странно (возможно, это реляционный мир, в котором мы так долго говорили). Я, конечно же, проведу стресс-тестирование с данными, чтобы увидеть, как это работает. Мне бы хотелось услышать больше о bucketing. Я немного почитал об этом, и, похоже, я все еще выполняю несколько запросов на уровне доступа к данным, получая нужные ведра, а затем запрашиваю их. – ammills01
Это очень «реляционная» вещь, которая не хочет делать много запросов. Кассандра на самом деле работает лучше с большим количеством запросов, поскольку каждый запрос будет использовать узел координатора, который лучше всего подходит для этого запроса. Yup, с ведрами вам все равно нужно будет выполнять несколько запросов, но это будет меньше запросов, чем Model 1. Просто зависит от вашего размера ведра. – gsteiner