Pull to refresh

Comments 29

Если кассандра — это всё ради скорости, а в заголовке Oracle — у вас есть боевые тесты сравнения того же оракла и кассандры?
И да, реально пересоздать таблицу с новыми ключами, если в старую уже льётся 500000 вставок/сек?
Пересоздать != переналить.
Скорее всего придется импровизировать на уровне приложения с переключением потока данных и потом доливкой из старых таблиц.
За ошибки архитектора БД Cassandra платят сисадмины и программисты, запомню.
А как добавлять новые шарды в нагруженный работающий кластер?
На новый шард, как понимаю, сначала должны перелиться данные от соседей и в это же время будут добавляться и новые, сеть с дисками не просядут?
PS и как быстро меняется умершая нода или диск? Буден нужен?
ну обычно программист, который собирается ее использовать, должен представлять — как и зачем, потому что база проектируется от запросов в первую очередь. Там нельзя потом будет просто так взять и шевельнуть, это так сказать плата за производительность.

Добавить очень просто.
Поднять ноду, сконфигурировать, добавить в кольцо (указать в конфигурации топологии что она теперь есть).
Все. В зависимости от величины нагрузки конечно просядут, но не сильно. Однако если мы льем миллион рпс то возможно лучше делать это в то время суток, когда нагрузка поменьше.
Собственно при добавлении ноды нужно все равно потом cleanup делать, чтобы удалить на всех остальных нодах диапазон неиспользуемых кластеров.
Лучше конечно назначит эти работы на время с низкой нагрузкой.

Тем не менее даже если предположить худший случай, что у нас 3 ноды и мы добавляем четвертую (а потом пятую в перспективе) и уровень согласованности у нас везде кворум — то это означает что и для записи и для удаления нам нужно 2 из трех подтверждения, при этом нод с данными 3 и разливка их на четвертую не будет _фатально_ тормозить чтение запись.

Другой вопрос если кластер уже задыхается под нагрузкой и заметили это по метрикам не год — два назад а внезапно вот сейчас — тогда да, возможна просадка. Но это я не знаю как надо постараться. Типа внезапно проморгать десятикратный рост трафика и потом под ним внезапно решить начать масштабироваться?
*грустно*: сначала денег не было/прохождения финансовых комитетов, потом — тендер, потом — поставка затянулась… Короче, отстать месяцев на 6-9 от потребностей — легко.
Спасибо за полезные ответы!
не совсем понимаю проблему?
типа на этапе проектирования можно не представлять что именно ты проектируешь? ну тогда это боль да.
Тем не менее кассандра довольно специфична с точки зрения области применения. То есть обычно понятно: вот тут нужны ACID транзакции, а вот тут нужно хранить и писать огромное число примитивных данных ну и тд и тп.
Последнее, что я хотел бы — продавать идею что кассандра может заменить оракл.
Я про *внезапное* масштабирование прода, которое может растянуться на годик из-за согласований и комитетов.
и как быстро меняется умершая нода или диск? Буден нужен?

Настолько быстро, насколько быстрое железо. С учетом репликации удаление ноды остается незамеченным для клиентов. JBOD настраивать можно, но в основном рекомендации (особенно для Scylla, которая является cassandra на С++) делать все таки RAID0. И тут уже нода или диска умер значения не имеет.
Нубский вопрос: А нельзя разрулить это отдельными таблицами индексов? Ну т.е. у тебя есть одна большая таблица со всеми данными, предположим 50 колонок, и к ней 10 таблиц с индексами по выбранным колонкам, для которых требуется возможность фильтровать записи. Таким образом из индексов получаем список нужных ключей, удовлетворяющих фильтрам, а потом уже лезем по этим ключам в нужные ноды за данными (если запрос требует что-то, что не покрыто индексами)?
Или это слишком по-SQL-ному?
В кассандре джойнов нет))
Можно и так делают. Проблема здесь — это требует двух запросов. Это увеличивает нагрузку на базу и время ответа т.к. их можно послать только последовательно. Поэтому в основном рекомендация — запихивать все нужные данные в одну таблицу, чтобы одним запросом получить их все, а не рассылать десять запросов, чтобы по кусочкам собрать один несчастный объект. В этом и суть денормализации — одни и теже данные лежат в куче таблиц.
Ну и плюс консистентность. «индекс» таблицу некому поддерживать, foreign ключей нет, constraint нет. Об этом надо сразу думать, когда проектируется база. Может ли приложение переварить конфликты и как.
И второй вопрос:
если нам нужно 100 разными способами забрать одни и те же данные, значит у нас будет 100 разных таблиц.

Т.е. мы должны будем одну операцию инсерта превратить в 100 операций? И все они должны быть гарантированно согласованны. Как это обеспечивается, и не становится ли инсерт слишком долгим?
это утрирование, но в целом да. Есть батчинг операций. Не становится :)
Ну то есть редко речь идет прям о сотне таблиц, все-таки это признак того, что что-то было не совсем верно спроектировано.
Тем не менее денормолизация в 5 — 10 таблиц это вполне окей.
А чем обеспечивается согласованность данных в этих 10 таблицах, если речь идет о представлении одних и тех же данных, но в разных видах для удобства выборки?
вообще обычно если в них согласовано записали то согласовано и прочитают.

Я в Кассандре ни разу не разбираюсь, но мне кажется, что факт того, что она noSQL означает, что у неё плохо с реляционностью данных между таблицами. Иными словами – согласованность поддерживается корректным кодом, БД же заточена под быстроту.


Один из ответов на stackoverflow говорит, что Кассандра может быть только AP, либо P. И там же есть ссылка на статью, которая ссылается на хабр.


Но опять же, я не настоящий сварщик. :)

Ничем. Кассандра не уповает на консистентность. Это проблему должен решать код для себя сам и обрабатывать возможные проблемы. Есть materialized view, которые эти таблицы синхронизируют автоматически, но это тоже гарантий не дает. Просто снимает с приложение необходимость слать эти 100 запросов.
Инсерты надо делать параллельно. Чем больше параллельных запросов, тем лучше для касандры. Надо пользоваться тем фактом, что у нас несколько серверов. Батчинг есть, но работает нормально и дает реальный профит по скорости только в определенных условиях (partition key у всех строк одинаковый). Тоже самое с выборками. Надо 100 таблиц прочитать — шлем 100 запросов одновременно. Доходит до того, что WHERE id IN (...) медленнее, чем послать для каждого значения в IN запрос параллельно.
Небольшая неточность
PRIMARY KEY((year), salary, user_id)

Так делать не требуется. Первое значение это всегда partition key. Такая запись эквивалентна
PRIMARY KEY(year, salary, user_id)


Скобки используют, чтобы сделать составной partition key
Скобки я добавил для того, чтобы визуально подчеркнуть (препроцессор языка все равно с ними справится) где в данном случае будет какая часть ключа.
Эти сладйы использовались и для живого доклада на Qiwi Server Party, по каким-то причинам мне захотелось показать что с помощью скобок мы не только делаем составные ключи, но и можем использовать их чтобы визуально подчеркнуть части ключа.
А еще Кассандра делает задержки на каждый отдельный запрос до 150мс, рандомно похоже.
Если надо малое время задержки, используйте aerospike.
А еще Кассандра делает задержки на каждый отдельный запрос до 150мс, рандомно похоже.

Cassandra написана на Java. Рандомные тормоза — это похоже на GC.
Как альтернативу моэно еще рассмотреть Scylla, случайных задержек не заметил. Плюс производительность выше, т.к. написана на c++.
Преимуществом перед aerospike будет то, что Scylla, за редким исключением, полностью совместима с драйверами и языком cassandra.
Если бы. GC то работает непостоянно. А там постоянно под нагрузкой такое.
Не, не тормоза. Она выдает 100-200к, но задержки ненормированные. На том же железе кластер aerospike дает задержку меньше 5мс и 600к запросов.
Это очень странное утверждение, потому что без каких-то дополнительных исследований оно невозможно. Потому что в идеале не должна. Так то у меня был случай, что иногда рандомные запросы вызывали рост MUTATION DROP, росло рандомно время выполнения и число спекулятивных ретраев. Кассандра оказалась не при чем, больной порт на свиче корраптил примерно 0.7 процента случайных пакетов.
Оп, привет с QIWI server party, было интересно слушать это вживую)
Прошли те времена, когда мы экономили место на винте

Информация на винте — мёртвый груз. Прежде чем с ней можно будет что-то сделать, надо загрузить её в ОЗУ и дать команды процессору на обработку (это очень упрощенно). Ваши 100 копий одних и тех же данных при параллельной обработке будут вытеснять друг друга из ОЗУ и постоянно вновь и вновь туда считываться с диска, а это не быстро, даже для SSD. Если мы говорим о больших данных и больших нагрузках, то могут быть проблемы с таким отношением к размеру БД

При параллельной обработке все эти 100 копий читать и не нужно. В идеале берется одна таблица, распиливается по token range между воркерами и делается все, что угодно. А так, это как раз основной кейс работы касандры — держать все на диске и эффективно это вычитывать. Какие бы старые и никогда не используемые данные не запрашивались, задержка будет в районе нескольких миллисекунд. От того и модель данных так сильно ограничивает, чтобы так можно было.
И что только ни придумают люди, лишь бы не учить SQL ))))
Sign up to leave a comment.