Для немного фона - этот вопрос касается проекта, запущенного на одном маленьком экземпляре EC2, и собирается перейти на среднюю. Основными компонентами являются Django, MySQL и большое количество инструментов для пользовательского анализа, написанных на языке python и java, которые делают тяжелые лифтинг. На той же машине работает Apache.
Модель данных выглядит следующим образом: большое количество данных в реальном времени поступает из разных сетевых датчиков, и в идеале я бы хотел установить подход с более высоким уровнем опроса, а не текущий опрос каждые 15 минут ( ограничение вычислительной статистики и запись в базу данных). После ввода данных я сохраняю исходную версию в MySQL, пусть инструменты анализа освободятся от этих данных и хранят статистику в нескольких других таблицах. Все это отображается с помощью Django.
Реляционные функции, которые мне нужны -
- Заказ [SliceRange в Cassandra API, похоже, удовлетворяет этому]
- Группа
- Многие отношения между несколькими таблицами [Cassandra SuperColumns, похоже, преуспевают для одного-многих]
- Sphinx на этом дает мне хороший текстовый движок, так что это тоже необходимо. [На Кассандре проект Lucandra, похоже, удовлетворяет эту потребность]
Моя основная проблема заключается в том, что чтение данных чрезвычайно медленное (и записи тоже не горячие). Я не хочу сейчас бросать на него много денег и оборудования, и я бы предпочел что-то, что может легко масштабироваться со временем. Вертикальное масштабирование MySQL в этом смысле не является тривиальным (или дешевым).
По сути, после того, как я много читал о NOSQL и экспериментировал с такими вещами, как MongoDB, Cassandra и Voldemort, мои вопросы:
-
На средстве EC2, , я получу какие-либо преимущества при чтении/записи, перейдя на что-то вроде Cassandra? Эта статья (pdf) определенно, похоже, предполагает это. В настоящее время я бы сказал, что несколько сотен записей в минуту будут нормой. Для чтения - поскольку данные изменяются каждые 5 минут или около того, кэш-недействительность должна произойти довольно быстро. В какой-то момент он должен иметь возможность обрабатывать большое количество одновременно работающих пользователей. Производительность приложения в настоящее время убивается, когда MySQL выполняет некоторые объединения на больших таблицах, даже если индексы создаются - что-то порядка 32 тыс. Строк занимает больше минуты, чтобы отобразить. (Это может быть артефактом виртуализованного ввода-вывода EC2). Размер таблиц составляет около 4-5 миллионов строк, а их около 5.
-
Все говорят об использовании Cassandra на нескольких узлах, учитывая теорему CAP и возможную согласованность. Но для проекта, который только начинает расти, имеет смысл для развертывания одного node сервера cassandra? Есть ли какие-либо оговорки? Например, может ли он заменить MySQL в качестве backend для Django? [Это рекомендуется?]
-
Если я смену, я предполагаю, что мне придется переписать части приложения, чтобы сделать намного больше "административной", так как мне придется делать несколько поисков для извлечения строк.
-
Будет ли смысл использовать MySQL как хранилище ключевых значений, а не реляционный движок, и пойти с этим? Таким образом, я мог бы использовать большое количество стабильных API-интерфейсов, а также стабильный движок (и по мере необходимости переходить к реляционным). (Сообщение Бретта Тейлора от Friendfeed на этом - http://bret.appspot.com/entry/how-friendfeed-uses-mysql)
Любые идеи людей, сделавших смену, будут очень благодарны!
Спасибо.