Я думаю, что это заслуживает обновления, так как Cassandra 1.2 вышел недавно.
Я использую Cassandra в производстве в течение 18 месяцев для социальных игр.
Мое изобретение заключается в том, что для его сильных сторон необходимо использовать Кассандру.Поэтому хорошее понимание того, что и как оно делает, необходимо увидеть, какая модель данных использовать или даже определить, является ли другое решение для БД более полезным для вас.
OrderedPartitioner полезен только если ваше приложение полагаться на ключевых запросах диапазона, но вы отказываетесь на одном из самых мощных возможностей Кассандры для этого: автоматического сегментирования и балансировка нагрузки. Вместо запросов к рядам ключевых строк попытайтесь реализовать те же функции, которые вам нужны, используя диапазоны имен столбцов в одной строке. TL; DR чтение/запись НЕ будет сбалансировано между узлами, используя это.
RandomPartioner (md5 хеширования) и MurmurPartitioner (Шумы хеширование, лучше и быстрее) является способом вы должны пойти, если вы хотите, чтобы поддерживать большие данные и частоты высокого доступа. Единственное, что вы бросаете, - это ключевые запросы диапазона. Все, что находится в одной строке, все еще находится на одном узле кластера, и вы можете использовать запросы диапазона компаратора и столбца. TL; DR: ИСПОЛЬЗУЙТЕ ЭТО ДЛЯ СВОБОДНОГО БАЛАНСИРОВАНИЯ, вы не сдадите ничего крупного.
Вещи вы должны знать о Кассандре:
Cassandra, в конечном счете соответствует. Cassandra решила торговать Consistency для высокой доступности и отличной разбивки (http://en.wikipedia.org/wiki/CAP_theorem). НО вы можете получить согласованность от cassandra, это все о политике Consistency, когда вы читаете и пишете. Это довольно важная и сложная тема, когда мы говорим об использовании cassandra, но вы можете прочитать об этом подробнее здесь http://www.datastax.com/docs/1.2/dml/data_consistency.
Как правило, (и чтобы это было просто), я читаю и пишу в QUORUM ConsistencyLevel (поскольку в моих приложениях чтение имеет тот же порядок частот, что и записи). Если ваше приложение сильно пишет тяжело, и чтение происходит гораздо реже, то используйте write on ONE и читайте ВСЕ. Или, если ваш вариант использования - наоборот (записи намного реже, чем чтение), вы можете попробовать прочитать ONE и написать на ALL. Использование ANY в качестве уровня консистенции для записей - это не отличная идея, если согласованность - это то, что вы пытаетесь решить, поскольку оно гарантирует, что мутация достигла кластера, но не была написана где угодно. Это единственный случай, когда я получаю записи, которые молча проваливаются на кассандре.
Это простые правила, позволяющие легко начать работу с разработкой cassandra. Чтобы получить как можно больше последовательности и производительности от производственного кластера, вы должны внимательно изучить эту тему и понять ее сами.
Если вам нужна человекочитаемая датамодель со сложными отношениями между сущностями (таблицами), то я не думаю, что Кассандра для вас. MySQL и, возможно, NewSQL могут быть более полезными для вашего использования.
Хорошая вещь, чтобы знать, как, грубо говоря, cassandra сохраняет и считывает данные. Всякий раз, когда вы пишете (удаляет на самом деле запись значения «надгробного камня» в cassandra), система добавит новое значение и отметку времени в новое физическое местоположение.
Когда вы читаете, cassandra пытается вытащить все записи для определенного местоположения key/column_name и возвращает вам самое последнее, что он мог найти (тот, у которого самая высокая отметка времени, предоставленная клиентом). Таким образом, память, необходимая узлу, напрямую зависит от частоты записи. В кассандре происходит процесс уплотнения, который заботится о чистке старых мутаций. Cassandra имеет внутренний кеш, который обновляется при чтении с последним значением местоположения.
Слияние/сжатие на диске SSTables (структуры данных, которые сохраняют данные) могут быть вызваны чтением, но лучше не рассчитывать на него. Очистка надгробных камней и столбцов с истекшим сроком действия (с использованием функциональных возможностей «время жизни») - это другой механизм, управляемый сборщиком мусора (подробнее см. Настройку льготного времени GC).
Это приводит меня к последнему пункту, который я хочу сделать: убедитесь, что ваши записи и чтение будут сбалансированы в вашем кластере!
Предположим, что всем вашим пользователям необходимо обновлять одно местоположение очень часто.
НЕ НАПРАВЛЯЙТЕ это теоретическое единственное место только к одной строке! Это заставит все ваши записи упасть только на один узел в вашем кластере. Если это не сбивает все (потому что у вас есть систопы rockstar), это по крайней мере сильно повредит производительности кластера.
Мой совет состоит в том, чтобы хранить ваши записи в достаточно разных клавишах строк, которые будут распространяться на всех узлах кластера. Чтобы получить все данные для этого единственного теоретического местоположения, используйте multi_get во всех «подстрочных клавишах».
Пример:
Я хочу иметь список всех активных сеансов http (которые присвоены uuid). Не сохраняйте все в одной строке «сеанс». То, что я использую в качестве ключа строки для моего кластера cassandra из 6 узлов: _sessions. Затем у меня есть маленький 16 ключей multi_get для извлечения всех активных сеансов, или я все еще могу сказать, активен ли сеанс, просто используя простой get (если я знаю его uuid, конечно). Если ваш кластер намного больше, вы можете использовать хэш-функцию для генерации ключей ведра.
Предлагаю вам получить дополнительную информацию о моделировании данных в Кассандре. Я читал http://www.cs.wayne.edu/andrey/papers/TR-BIGDATA-05-2015-CKL.pdf и http://www.datastax.com/dev/blog/basic-rules- в качестве полезных статей в этом случае. Они помогут вам разобраться в моделировании таблиц на основе ваших запросов (методология, основанная на Query-Driven) и дублировании данных и ее преимуществах/недостатках. – Elnaz