Комплексный запрос на кассандре - PullRequest
3 голосов
/ 21 апреля 2010

Я слышал о движке базы данных cassandra несколько дней назад и искал хорошую документацию по нему. после обучения на Кассандре я получил Кассандру, более масштабируемую, чем другой движок данных. Я также читал об Amazon SimpleDB, но поскольку SimpleDB имеет ограничение 10 ГБ / таблица и Google Datastore работает медленнее, чем Amazon SimpleDB, я предпочитаю не использовать их (Google Datastore, Amazon SimpleDB). Поэтому для того, чтобы наш сайт масштабировался с особенно высокой скоростью записи с большими объемами данных, мне нравится использовать Cassandra в качестве нашего механизма обработки данных.

Но перед тем, как начать использовать кассандру, я не совсем понимаю, как обрабатывать сложные данные, используя кассандру. Я даю вам структуру базы данных MySQL ниже. Пожалуйста, прочитайте это и дайте мне хорошее предложение.

Таблица пользователей
hasColum ID Primary
hasColum email Уникальный
hasColum FirstName
hasColum LastName

Таблица категорий
hasColum ID Primary
hasColum Parent
hasColum Категория

Таблица сообщений
Идентификатор hasColum Первичный
Внешний ключ индекса hasColum UID, связанный с пользователями-> ID
Внешний ключ индекса hasColum CID, связанный с Category-> ID
hasColum Title
Почтовый индекс hasColum
hasColum PunDate

Комментарии
Идентификатор hasColum первичный
Внешний ключ индекса UID hasColum, связанный с пользователями-> ID
Внешний ключ индекса hasColum PID, связанный с Posts-> ID
hasColum Комментарий

Группа пользователей
основной идентификатор hasColum
Имя hasColum

Таблица UserToGroup (только для многих со многими)
Внешний ключ hasColum UID, связанный с Users-> ID
Внешний ключ hasColum GID, связанный с Group-> ID

Наконец, для вашей информации, мне нравится использовать PHP-класс SimpleCassie http://code.google.com/p/simpletools-php/ Так что будет очень полезно, если вы можете привести пример с использованием SimpleCassie

Ответы [ 5 ]

5 голосов
/ 02 марта 2011

Я предполагаю, что у вас будет большая нагрузка и много данных, поступающих через вашу систему, и снова я буду предполагать, что вы пробовали реляционную базу данных и разбили под тяжелой нагрузкой, попали в миллионы строк, 10 000+ запросов в секунду и т.д.

После этих предположений я бы сказал вам, что вам нужно изменить способ мышления. Например, в своем вопросе вы записали структуру таблицы, которая действительно важна, когда вы думаете о реляционных базах данных. Но в хранилищах столбцов (таких как cassandra / hbase / etc) это не так важно, это типы запросов, которые имеют значение. Поскольку в хранилищах столбцов вы всегда можете добавить новые метаданные (дополнительный столбец, который вы не будете использовать в своих запросах, но в ответах) в новый столбец, вам не нужно изменять свой дизайн. Но в реляционных базах данных вам нужно изменить таблицу или даже получить другую таблицу с отношением pk-fk.

При использовании cassandra (или любой другой базы данных столбцов) у вас должны быть все api перед вами.

Пример:

если у вас есть getAllUserPosts($userId) в вашем API, вы должны иметь: UserPosts ColumnFamily или вторичный индекс для Posts ColumnFamily (который делает аналогичные вещи в фоновом режиме). Дальше как тебе нужен результат отсортированный? Да, это ключевой момент в дизайне, а если вы хотите, чтобы он сортировался по дате создания, то вам лучше использовать TimeUID в ключе или сторонний механизм для создания увеличивающихся uid для вас. Может быть, вы захотите отсортировать их по «последнему обновлению», тогда вам лучше поместить в них вторичный индекс.

Исходя из моего опыта, я бы сказал вам, что действительно здорово разрабатывать что-то с помощью cassandra, когда ваши API или то, что вам нужно из данных, предельно ясны, но когда вы захотите изменить большую функцию, у вас будут действительно большие задачи ты, будь осторожен. Также убедитесь, что вы понимаете основополагающую «в конечном итоге последовательность», которая делает Кассандру быстрой. Так как вам приходилось много раз биться головой о клавиатуру, чтобы заставить работать транзакцию (по крайней мере, я так и сделал). И, конечно, в какой-то момент вы захотите выполнить массовую операцию над огромными данными, имеющимися у вас на Кассандре: будьте готовы к использованию облачных вычислений. Hadoop.

PS: Я полагаю, что здесь есть много людей с большим опытом и знаниями, связанными с Кассандрой, которые помогли бы вам спроектировать вашу систему намного лучше, чем я. Я просто хотел поделиться тем, что я испытал и понял, когда использовал кассандру в производстве.

5 голосов
/ 08 мая 2010

Из справочника по вики-модели Кассандры :

В отличие от реляционных систем, где вы моделируете сущности и отношения, а затем просто добавляете индексы для поддержки любых запросов, которые необходимы, с Cassandra вам нужно заранее продумать, какие запросы вы хотите эффективно поддерживать, и соответствующим образом смоделировать. Поскольку нет автоматически предоставляемых индексов, вы будете гораздо ближе к одному ColumnFamily для каждого запроса, чем если бы были таблицы: запросы реляционные. Не бойтесь соответственно денормализовать;

Статья Гугла здесь .

Надеюсь, это поможет вам.

4 голосов
/ 21 апреля 2010

Денормализовать. См. Twissandra.com и документацию на http://github.com/ericflo/twissandra

Больше примеров на http://wiki.apache.org/cassandra/ArticlesAndPresentations

2 голосов
/ 24 мая 2010

Вот хорошая статья о Twissandra (клон Twitter на Cassandra), в которой обсуждается дизайн схемы на основе требований к доступу к данным. Вы можете найти это полезным http://www.rackspacecloud.com/blog/2010/05/12/cassandra-by-example/

0 голосов
/ 21 апреля 2010

Вы действительно конкурируете с Google и Amazon по объемам трафика? Я бы посоветовал начать с обновления вашей текущей инфраструктуры MySQL - сколько серверов баз данных вы сейчас используете в своем кластере (кластерах)? Разбиваете ли вы данные?

С

...