У меня вопрос по моделированию данных Cassandra. Извините за небольшой длинный пост.
Я беру гипотетическую ситуацию здесь. Допустим, у меня есть главный сервер, который собирает данные с машин (одной или многих) в сети. Данные других машин представлены в виде сведений о машине, статусе, подключен или нет, включен или выключен, настольный компьютер или ноутбук, что-то в этом роде. у меня такие запросы
- Учитывая идентификатор главного сервера, получите список подключенных к нему машин.
- Учитывая идентификатор машины, получите сведения о машине.
- Учитывая статус машины (ничего другого), получите список машин (одна или несколько)
- Учитывая флаг is_connected, получить список машин, подключенных к главному серверу?
- Учитывая флаг 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? Ваше руководство поможет мне придумать хорошую модель данных в этом случае.
Заранее спасибо.