Руководство по модели данных Cassandra

У меня вопрос по моделированию данных Cassandra. Извините за небольшой длинный пост.

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

  1. Учитывая идентификатор главного сервера, получите список подключенных к нему машин.
  2. Учитывая идентификатор машины, получите сведения о машине.
  3. Учитывая статус машины (ничего другого), получите список машин (одна или несколько)
  4. Учитывая флаг is_connected, получить список машин, подключенных к главному серверу?
  5. Учитывая флаг is_up получить список машин?

Итак, согласно Cassandra, мы должны создать семейство столбцов для каждого запроса (приблизительно). Меня беспокоит запрос № 3, № 4, № 5 выше, предложение where для этих запросов — это статус, is_connected и is_up соответственно, поэтому для удовлетворения этих запросов я должен создать таблицу, которая имеет эти флаги либо в качестве ключа раздела, либо в качестве ключей кластера.

CREATE TABLE server (
    server_id text,
    server_name text,
    status text,
    .
    .
    .
    .
    .
    other information,
    PRIMARY KEY (server_id))

CREATE TABLE machine (
    machine_id text,
    machine_name text,
    status boolean,
    is_connected boolean,
    is_up boolean,
    .
    .
    .
    .
    .
    other information,
    PRIMARY KEY (machine_id))

  CREATE TABLE machine_by_status (
      machine_id text,
      machine_name text,
      status boolean,
      is_connected boolean,
      is_up boolean,
      .
      .
      .
      .
      .
      other information,
      PRIMARY KEY (status, machine_id))

  CREATE TABLE machine_by_connected (
      machine_id text,
      machine_name text,
      status boolean,
      is_connected boolean,
      is_up boolean,
      .
      .
      .
      .
      .
      other information,
      PRIMARY KEY (is_connected, machine_id))

  CREATE TABLE machine_by_up_down (
      machine_id text,
      machine_name text,
      status boolean,
      is_connected boolean,
      is_up boolean,
      .
      .
      .
      .
      .
      other information,
      PRIMARY KEY (is_up, machine_id))

Но значение этих флагов может меняться с течением времени. Значений может быть несколько. Если они являются частью ключа раздела или ключей кластера, я не могу их обновить или изменить. Итак, как только мое семейство столбцов создано и добавлена ​​запись с некоторым значением флага, то для нового значения, как я могу обновить эту запись, или если я добавлю новую запись, то как я могу удалить старую запись? Я хочу избежать чтения перед записью.

Частота сбора данных может варьироваться, поэтому я не могу использовать фиксированное значение TTL, чтобы Cassandra могла удалить старое значение. Я понимаю, что у вышеуказанной модели есть проблемы, например, она может создавать горячие точки или может создавать дисбалансный кластер, и именно поэтому мне нужно руководство. Как я могу справиться с этой ситуацией. Мое клиентское приложение может выполнять запросы на основе этих флагов только на нескольких страницах. У клиента нет других данных для запроса.

Итак, как я могу создать семейство столбцов для удовлетворения запросов № 3, № 4, № 5? Ваше руководство поможет мне придумать хорошую модель данных в этом случае.

Заранее спасибо.


person Shashikant Kulkarni    schedule 28.08.2017    source источник
comment
Сколько машин может быть вставлено?   -  person Ashraful Islam    schedule 28.08.2017
comment
@AshrafulIslam количество машин может вырасти до 2 миллионов, а может и больше   -  person Shashikant Kulkarni    schedule 28.08.2017
comment
Статус флага, is_connected, is_up — все они являются столбцами с низкой кардинальностью. Допустим, вся машина работает, поэтому все ваши данные будут в одном разделе (на одном узле), создадут точку доступа, не будут масштабироваться и т. д. Это очень плохой дизайн в cassandra.   -  person Ashraful Islam    schedule 28.08.2017
comment
Для запроса № 3, № 4, № 5 ваш клиент может как-то предоставить вам server_id ?   -  person Ashraful Islam    schedule 28.08.2017
comment
@AshrafulIslam Я понимаю это. Вот почему я здесь, чтобы получить некоторые указания. Я вижу, может ли клиент отправить server_id или machine_id, но предположим, у меня есть экран, на котором я хочу перечислить все машины, которые имеют is_connected как true?   -  person Shashikant Kulkarni    schedule 29.08.2017
comment
Если у вас есть экран, на котором вы хотите перечислить все машины, для которых is_connected true, вы не будете отображать все 2 миллиона машин одновременно, верно? Итак, вам нужно как-то разделить данные   -  person Ashraful Islam    schedule 29.08.2017
comment
@AshrafulIslam да, я не буду отображать все записи. Но мне может понадобиться подсчет этих записей на основе is_connected. Итак, по какому параметру я должен разбивать данные? Какие-нибудь рекомендации?   -  person Shashikant Kulkarni    schedule 29.08.2017
comment
Вам просто нужен только счет?   -  person Ashraful Islam    schedule 29.08.2017
comment
@AshrafulIslam не всегда, но говорит на странице панели инструментов   -  person Shashikant Kulkarni    schedule 29.08.2017
comment
В cassandra count(*) запрос очень затратный. Рекомендуется использовать встречный стол. docs.datastax.com/en/cql/3.3/cql/ cql_using/   -  person Ashraful Islam    schedule 29.08.2017
comment
@AshrafulIslam хорошо. Я проверю это. Возвращаясь к моему первоначальному запросу, как и что я могу внести изменения в свою модель данных? Я думаю о том, как я могу разделить данные для таких значений динамического поля?   -  person Shashikant Kulkarni    schedule 29.08.2017
comment
Давайте продолжим это обсуждение в чате.   -  person Ashraful Islam    schedule 29.08.2017


Ответы (1)


Флаги status, is_connected, is_up все они представляют собой разделы с низкой кардинальностью.

Предположим, что вся машина работает, поэтому все ваши данные будут в одном разделе (на одном узле), создадут точку доступа, не будут масштабироваться и т. д.

Поэтому вместо того, чтобы делать столбец с низкой кардинальностью (status, is_connected, is_up) в качестве ключа раздела. Создайте отдельную таблицу для каждого значения флага.

Пример is_up :

CREATE TABLE up_machines ( 
    machine_id text PRIMARY KEY, 
    machine_name text, 
); 

CREATE TABLE down_machines ( 
    machine_id text PRIMARY KEY, 
    machine_name text, 
); 

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

Другое дело, вместо того, чтобы выбирать все записи по одной, используйте систему пагинации драйвера.

https://docs.datastax.com/en/developer/java-driver/2.1/manual/paging/

Примечание. Если статус машины изменился, необходимо удалить данные из одной таблицы и вставить в другую. Удаление записей создает надгробную плиту. Если это часто случается, может быть сгенерировано огромное надгробие. Об удалениях и надгробиях в Cassandra

person Ashraful Islam    schedule 29.08.2017
comment
Спасибо @ashrafulIslam - person Shashikant Kulkarni; 29.08.2017