Проблема масштабирования со структурой CassandraDB - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь создать почтовый сервер на основе базы данных. Для этого я решил использовать CassandraDB. Основная проблема: чем больше почты у меня в таблице, тем длиннее ответ таблицы (это нормально, но масштабно). В настоящее время я получил только 20000 писем, и Кассандра прислала мне тайм-аут (очевидно, по умолчанию установлен на 5 сек). Цель состоит в том, чтобы каждый пользователь мог найти почту в моей таблице, содержащую более 500 тысяч писем, с возможностью фильтрации своих писем.

Вот моя структура таблицы:

CREATE TABLE mail__mail (
    accountid uuid,
    date timestamp,
    id uuid,
    attachment set<uuid>,
    categories set<uuid>,
    content text,
    dateadded timestamp,
    folderid uuid,
    hash text,
    isconfidential boolean,
    isdeleted boolean,
    isimportant boolean,
    isseen boolean,
    mailcc text,
    mailfrom text,
    mailid text,
    mailto text,
    size bigint,
    subject text,
    PRIMARY KEY (accountid, date, id)
) WITH CLUSTERING ORDER BY (date DESC,id ASC);

CREATE CUSTOM INDEX mailFromIndex ON mail__mail (mailfrom) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS','analyzed': 'true', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive': 'false'};
CREATE CUSTOM INDEX subjectIndex ON mail__mail (subject) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS','analyzed': 'true', 'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 'case_sensitive': 'false'};

Я почти уверен, что моя структура плохая из-за моих слабых навыков в CassandraDB.

Вот операции, которые я хочу получить с помощью этой таблицы:

  • ОБНОВЛЕНИЕ: isImportant, isConfidential, isDeleted, isSeen, mailId, folderId, категории
  • УДАЛИТЬ: по id, по folderId, accountId
  • SELECT: по id, по folderId, по accountId

И я хотел бы выбрать с этим фильтром:

  • ЗАКАЗАТЬ ПО: дата, размер, mailFrom (ASC и DESC)
  • СОДЕРЖИТ: категории (я могу назначить некоторым категориям свою почту, и я хочу отфильтровать всю электронную почту в одной или нескольких категориях)
  • LIKE '% search %': mailFrom, подлежит фильтрации почты, содержащей мой поиск
  • Равно: isConfidential, isImportant, isDeleted, isSeen, чтобы получить всю конфиденциальную, важную, удаленную или просмотренную почту.

Моя таблица работает с несколькими строками (она работает с 7k электронными письмами приблизительно за 1000 мс), но я думаю, что это может быть быстрее с хорошей структурой и хорошим запросом (без РАЗРЕШЕНИЯ НА ФИЛЬТР).

Более того, я, очевидно, не могу использовать CONTAINS и LIKE '% text %' в том же запросе, он дал мне код ошибки 1300. Так что я сделал этот шаг в python, но, на мой взгляд, это падение производительности, было бы здорово, если бы я мог делать все с помощью cassandra.

Для запроса моего CassandraDB я использую драйвер Cassandra Python3.5, но я не думаю, что эта информация актуальна.

Скажите, если вам нужна дополнительная информация, заранее спасибо!

РЕДАКТИРОВАТЬ: В качестве решения я следую тому, что вы, ребята, сказали мне, я развертываю новый сервер с Elassandra (ElasticSeach + Cassandra). Я постараюсь дать вам результат, который я получу, как можно скорее.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Я согласен с @shutty, вы можете использовать cassandra для своего хранилища данных вместе с ES для поиска.

0 голосов
/ 12 сентября 2018

Я согласен с предложением @Lohfink о другом взгляде на моделирование базы данных C *, начиная с самих запросов. Но в соответствии с вашими требованиями, C * может не подходить идеально. Вы можете изменить схему следующим образом:

  • нет запросов с разрешить фильтрацию, так как он выполняет сканирование таблицы.
  • та же схема mail__mail, но с id и date, объединенными с timeuuid для упрощения.
  • вместо создания тонны вторичных индексов (из-за проблем с данными с большим количеством элементов) и материализованных представлений (из-за копирования данных), вы можете использовать либо внешний ElasticSearch, либо использовать его в качестве плагина для C * для выполнения фактических поисков.
...