Комментарии 29
И да, реально пересоздать таблицу с новыми ключами, если в старую уже льётся 500000 вставок/сек?
Скорее всего придется импровизировать на уровне приложения с переключением потока данных и потом доливкой из старых таблиц.
А как добавлять новые шарды в нагруженный работающий кластер?
На новый шард, как понимаю, сначала должны перелиться данные от соседей и в это же время будут добавляться и новые, сеть с дисками не просядут?
PS и как быстро меняется умершая нода или диск? Буден нужен?
Добавить очень просто.
Поднять ноду, сконфигурировать, добавить в кольцо (указать в конфигурации топологии что она теперь есть).
Все. В зависимости от величины нагрузки конечно просядут, но не сильно. Однако если мы льем миллион рпс то возможно лучше делать это в то время суток, когда нагрузка поменьше.
Собственно при добавлении ноды нужно все равно потом cleanup делать, чтобы удалить на всех остальных нодах диапазон неиспользуемых кластеров.
Лучше конечно назначит эти работы на время с низкой нагрузкой.
Тем не менее даже если предположить худший случай, что у нас 3 ноды и мы добавляем четвертую (а потом пятую в перспективе) и уровень согласованности у нас везде кворум — то это означает что и для записи и для удаления нам нужно 2 из трех подтверждения, при этом нод с данными 3 и разливка их на четвертую не будет _фатально_ тормозить чтение запись.
Другой вопрос если кластер уже задыхается под нагрузкой и заметили это по метрикам не год — два назад а внезапно вот сейчас — тогда да, возможна просадка. Но это я не знаю как надо постараться. Типа внезапно проморгать десятикратный рост трафика и потом под ним внезапно решить начать масштабироваться?
Спасибо за полезные ответы!
типа на этапе проектирования можно не представлять что именно ты проектируешь? ну тогда это боль да.
Тем не менее кассандра довольно специфична с точки зрения области применения. То есть обычно понятно: вот тут нужны ACID транзакции, а вот тут нужно хранить и писать огромное число примитивных данных ну и тд и тп.
Последнее, что я хотел бы — продавать идею что кассандра может заменить оракл.
и как быстро меняется умершая нода или диск? Буден нужен?
Настолько быстро, насколько быстрое железо. С учетом репликации удаление ноды остается незамеченным для клиентов. JBOD настраивать можно, но в основном рекомендации (особенно для Scylla, которая является cassandra на С++) делать все таки RAID0. И тут уже нода или диска умер значения не имеет.
Или это слишком по-SQL-ному?
Ну и плюс консистентность. «индекс» таблицу некому поддерживать, foreign ключей нет, constraint нет. Об этом надо сразу думать, когда проектируется база. Может ли приложение переварить конфликты и как.
если нам нужно 100 разными способами забрать одни и те же данные, значит у нас будет 100 разных таблиц.
Т.е. мы должны будем одну операцию инсерта превратить в 100 операций? И все они должны быть гарантированно согласованны. Как это обеспечивается, и не становится ли инсерт слишком долгим?
Ну то есть редко речь идет прям о сотне таблиц, все-таки это признак того, что что-то было не совсем верно спроектировано.
Тем не менее денормолизация в 5 — 10 таблиц это вполне окей.
Я в Кассандре ни разу не разбираюсь, но мне кажется, что факт того, что она noSQL означает, что у неё плохо с реляционностью данных между таблицами. Иными словами – согласованность поддерживается корректным кодом, БД же заточена под быстроту.
Один из ответов на stackoverflow говорит, что Кассандра может быть только AP, либо P. И там же есть ссылка на статью, которая ссылается на хабр.
Но опять же, я не настоящий сварщик. :)
PRIMARY KEY((year), salary, user_id)
Так делать не требуется. Первое значение это всегда partition key. Такая запись эквивалентна
PRIMARY KEY(year, salary, user_id)
Скобки используют, чтобы сделать составной partition key
Эти сладйы использовались и для живого доклада на Qiwi Server Party, по каким-то причинам мне захотелось показать что с помощью скобок мы не только делаем составные ключи, но и можем использовать их чтобы визуально подчеркнуть части ключа.
Если надо малое время задержки, используйте aerospike.
А еще Кассандра делает задержки на каждый отдельный запрос до 150мс, рандомно похоже.
Cassandra написана на Java. Рандомные тормоза — это похоже на GC.
Как альтернативу моэно еще рассмотреть Scylla, случайных задержек не заметил. Плюс производительность выше, т.к. написана на c++.
Преимуществом перед aerospike будет то, что Scylla, за редким исключением, полностью совместима с драйверами и языком cassandra.
Прошли те времена, когда мы экономили место на винте
Информация на винте — мёртвый груз. Прежде чем с ней можно будет что-то сделать, надо загрузить её в ОЗУ и дать команды процессору на обработку (это очень упрощенно). Ваши 100 копий одних и тех же данных при параллельной обработке будут вытеснять друг друга из ОЗУ и постоянно вновь и вновь туда считываться с диска, а это не быстро, даже для SSD. Если мы говорим о больших данных и больших нагрузках, то могут быть проблемы с таким отношением к размеру БД
Cassandra. Как не умереть, если знаешь только Oracle