2016-05-29 2 views
0

Сейчас я изучаю Кассандру, и я понимаю, что должен составлять таблицу для каждого запроса. Я не уверен, когда я должен делать отдельные таблицы или материализованные представления. Например, у меня есть следующие вопросы для пользователей и сообщений:Когда использовать материализованные виды?

users_by_id users_by_email users_by_session_key

posts_by_id posts_by_category posts_by_user

Должен ли я всегда использовать материализованные представления?

Мне кажется, что если вы хотите, чтобы сообщения или пользователи были согласованы по всем запросам, я должен использовать материализованные представления. Однако материализованные представления, которые я читаю, имеют задержку read before write.

С другой стороны, если я использую разные таблицы, я должен делать 3 вставки каждый раз, когда создается новое сообщение? Я заметил, что получаю ошибку batch with conditions cannot span multiple tables, что означает, что я должен вставлять ее по одному в каждую отдельную таблицу, что может вызвать проблемы согласованности, если один из запросов не удался. (Оператор партии, не смог бы все 3, если один из них не удался).

Итак, поскольку имеет смысл иметь согласованность, то мне кажется, что я всегда буду хотеть использовать материализованные виды и должен принять штраф read before write.

Я предполагаю, что мой другой вопрос - когда это будет когда-нибудь, если данные будут непоследовательными?

Так надеясь, что кто-то может предоставить мне больше ясности за то, как обрабатывать несколько запросов в кассандре на «теоретической модели», такой как «Пользователи» или «Сообщения». Должен ли я использовать материализованные представления? Если я использую 3 разных таблицы для каждой модели, как я могу их поддерживать? Просто надеюсь, что все 3 вставки не подведут? Кажется неправдой.

ответ

0

Нет, вы не должны всегда использовать материализованные виды. Идеальное решение - это интерфейс для вашей базы данных. В этом приложении вы обрабатываете все свои разные таблицы. Но есть и некоторые предпосылки для материализованных представлений: если у вас нет времени для этого приложения, но вам нужна эта функция, используйте материализованные представления. У вас есть компромисс производительности, но в этом случае время более важно. Если вам также нужны реальные обновления вместо upserts во всех таблицах: используйте материализованные представления.

Пакет полезен для буферизации или установки наборов данных с тем же ключом раздела. Например: у вас есть приложение для ввода данных с высокой пропускной способностью. Между вашими биениями или между выполнением другого запроса с QUORUM вы получили еще 10 событий с одним и тем же ключом раздела. Но вы не будете их исполнять, потому что ожидаете успешного ответа. Если успех вернется, вы выполните пакетный запрос. Но имейте в виду: используйте только партию для тех же разделов.

Как правило, помните одну важную вещь: у Cassandra есть модель согласованности. Это означает: если вы используете qourum, у вас будет последовательность, но не каждый раз. Если ваше приложение нуждается в полной согласованности, не только в конечном итоге используйте другое решение. Например. SQL с sharding. Cassandra оптимизирован для записи, и вы будете довольны только тем, что используете функции cassandra.

Некоторые рекомендации по производительности: Если вам нужна лучшая консистенция: используйте QUORUM, никогда не используйте ВСЕ. И, как правило, пишите ваши запросы отдельно. Иногда пакет полезен. Не выполняйте запросы с помощью ALLOW FILTERING. Не используйте диапазоны токенов или оператор IN на ключах разделов :)

+0

В вашем первом абзаце вы упомянули, что компромисс - это время против производительности. У меня есть время, поэтому я хотел бы сделать эти 3 разных таблицы вместо материализованных представлений. Однако Im все еще путает то, что является правильным способом сохранить данные в таблице 3 Posts. (Btw i не означает согласованность между репликами, когда я говорю о согласованности, но согласованность данных для таблиц 3 Posts). Я беспокоюсь, что мой сервер делает 3 вставки для создания сообщения, но в какой-то момент мой сервер терпит неудачу. Теперь у меня есть «posts_by_id», но нет таблицы «posts_By_category». Итак, как бы я обрабатывал согласованность данных из 3 таблиц? –

+0

Вы можете сделать две вещи: использовать QUOURUM или создать процесс пакетного восстановления. Первый из них прост в реализации: https://docs.datastax.com/en/cassandra/2.0/cassandra/dml/dml_config_consistency_c.html Для второго вам нужна система очереди сообщений, такая как kafka. Вы создаете приложение для быстрой обработки потока. Второе приложение в поточном потоке выполняет только одно: восстановление сломанных таблиц. Второе решение действительно быстрое, приятное для аналитики в реальном времени, но первое из них более безопасно. Я думаю, в вашем случае первый вариант - лучший выбор. –

2

Прочитайте мое сообщение в блоге о глубоком погружении для всех компромиссов при использовании материализованных представлений.Как только вы поймете компромиссы, выбирайте с умом: http://www.doanduyhai.com/blog/?p=1930

Смежные вопросы