Автор оригинальной статьи до того, как основал FriendFeed, работал в Google в команде, которая занимается App Engine. Нереляционное хранилище Datastore из App Engine выглядит для программиста почти так же, как и решение из статьи. Только вместо MySQL в основе Datastore лежил распределенный BigTable.
На самом деле ничего необычного. Просто решили построить на основе MySQL key-value базу данных.
Хорошо это или плохо — на этот счет могут быть разные мнения. Я предпочитаю использовать вещи по назначению. Есть отличные вещи, например, Redis, которые гораздо быстрей мускула (т.к. не реализуют много лишнего функционала, который предлагает мускул, а используют быструю событийную epoll-based архитектуру), и для них архитектура key-value родная, поэтому не прийдется писать своего кода на уровне приложения.
Ну если уж очень хотелось использовать реляционное хранилище, то тогда уже можно было использовать Drizzle. Drizzle динамически развивающийся проект, который изначально заточен под хранение данных в вебе.
Прелесть MySQL в том, что он стабилен, уже отработаны процедуры работы с ним (масштабирование, бекап и т.д.). Как раз на это часто жалуются разработчики, попробовавшие альтернативы из движения NoSQL.
Для майтов с малым и средним посещениями и объемом хранимых данных — MySQL, либо другая СУРБД вполне приемлемый вариант.
Для сайтов, которые имеют проблемы, описанные в статье MySQL вообще не подходит. В частности потому что очень плохо масштабируется горизонтально. (Если это вообще можно назвать возможностью масштабирования)
Для подобных сайтов нужно использовать нереляционные подходы, key-value в частности.
Фигурировало даже число в 2000 серверов сускула.
Но не стоит путать. Они используют мускул как персистент сторидж, не более и не менне.
Они не выполняют чтений оттуда, т.к. 99,9% чтений выполняются из кешей (мемкеш). Изменения данных, тоже не сразу пишутся. Запись идет булками в какое-то время или по какому-то событию. Это просто сторидж.
Притом какой там мускул тоже сложно сказать. Думаю, что-то больше похожее на Drizzle, чем на обычный мускул. Исходя из интервью, ссылку на которое я дал выше, данные о каждом пользователе лежат на разные БД серверах, т.е. это уже шардинг. Шардинг на уровне БД или приложения (если по userid выбирается сервер БД на который коннектиться) тоже сложно сказать.
Для построения же дерева связей, естественно, ни о каком MySQL речи быть не может. Думаю, для этого испосльзуют касандру. Хотя пруфлинков не нашел.
Ну а про специально оьбученых людей, тут совсем не серьезно… Вы же при выборе технологии не полагаетесь на каких-то абстрактных людей.
Известность технологии, возможность найти опытных разработчиков — один из важных принципов ее выбора. Если нет разработчиков, то явно нужно будет обучать. С новичками в технологии увеличиваются риски срыва сроков. А это (обучение и увеличение вероятности срыва сроков) не для всех типов проектов подходит.
MySQL был изначально проектирован, имея возможность только вертикального масштабирования. Золотой закон — чем больше памяти, тем лучше для MySQL. Сейчас MySQL уже, слава богу, начал лучше насштабироваться на многоядерные системы, т.к. еще до недавнего времени наилучшие результаты были на четырех ядрах.
Ну о чем говорить, если в мускуле даже шардинга нет? Есть только унылый партишенинг, который в абсолютном большинстве случаев не поможет.
Или вы репликацию называете надежной схемой масштабирования? А как же масштабирование записи? Пока единственно возможно решение это мастер-мастер (активно-пассивный режим, активно-активный). Если вы предлагаете репликацию кольцом, то ИМХО, key-value решения гораздо безопасней и отказоустойчивей.
В частности, изменение схемы базы данных или добавление индексов к существующим 10-20 миллионов записей приводили к полной блокировке сервера на несколько часов.
Да, это исключительно особенность MySQL. Ни одна другая база не работает с индексами настолько медленно. Решать проблему плохого инструмента с помощью смены концепции — это вариант, но мне он не нравится.
Существует множество проектов, призванных решить проблему хранения данных с гибкой схемой и построением индексов на лету (например CouchDB). Однако, по-видимому ни один из них не используется крупными сайтами.
Это неправда. Достаточно посмотреть, откуда взялась Cassandra и кто использует Tokyo Cabinet, чтобы убедится в обратном.
Кстати, в статье Bred и его коллеги по сути превратили MySQL в BDB.
entites — это объект с primary key added_id, а все остальные таблицы-индексы — это secondary key. На том уровне, на котором он поведал — BDB отлично справляется с задачей.
Единственное «но» — если им всё-таки понадобится выполнить один sql запрос — их решение справится, а вот BDB — увы.
Тогда как объясните это: «You define column families in your storage-conf.xml file, and cannot modify them (or add new column families) without restarting your Cassandra process.»
A column family is a container for columns, analogous to the table in a relational system.
То есть вы задаете только коллекции столбцов, а не конкретный их набор.
Не понял. Допустим, я делаю анкету из 10 вопросов — коллекция из 10 столбцов. Чтобы добавить новый, одиннадцатый, мне надо перезапустить систему, или я не прав?
Я сейчас как раз озабочен проектированием БД для 30-ти сущностей, раздумываю над тем чтобы остановится на 2-х универсальных таблицах — таблице объектов и таблице их отношений
FriendFeed использовал так называемый Scheme-less подход, полгода назад было упоминание на Хабре, сразу заинтересовало.
Я где-то даже видел статью об инструментах проектирования БД на основе хранения XML в полях, но сейчас не могу ее найти, да и вообще, как-то мало информации по этой тематике, к сожалению.
К этому гениальному решению приходят, в какой-то момент, все. Если вам нужен безсхемный подход, возьмите безсхемную базу данных, не пытайтесь натянуть чужую парадигму на SQL-базу.
Использовал похожее решение в билинге, когда потребовалось добавить два индекса на одно поле на большой таблице MySQL. Этот костыль дался малой кровью только потому, что позволила специфика (в билинге записи после создания не меняются и их индексирование можно отложить).
Но в общем случае, синхронизацию базовой таблицы и индексов довольно сложно реализовать. Я думаю, это главный из недостатков такой схемы.
практически в каждом случае они просматривали существующие решения только для того, чтобы спроектировать собственный велосипед: сервер Торнадо, фреймворк на нем, теперь по сути NoSQl поверх MySQL.
это мир технологий так беден, или просто у программистов руки чесались до проектирования велосипедов?
На вершине горы всегда одиноко. Большинство решений и технологий — все же для масс-рынка. Вырвавшимся вперед поневоле приходится изобретать что-то свое. Как минимум для сохранения конкурентного преимущества.
да как сказать… вот, к примеру, те же фреймворки или сервера.
на их поддержку и развитие требуется довольно много ресурсов, времени, проектирования. При необходимости поддерживать еще и сам продукт, опирающийся на технологию, усилия команды начинают распыляться.
с другой стороны, появляется возможность принимать архитектурные решения исходя из нужд конкретного проекта.
Но надстройки над БД… Не знаю, мне nosql кажется очень разумным решением, когда вся мощность sql попросту не нужна, а нужна масштабируемость и скорость.
baluev'у наверное было интересно ваше личное впечатление, в вашем проекте. Мне бы тоже, если честно, хотелось бы послушать человека используюещего монго в продакшне.
я не единственный, кто использует его в продакшене. из особенностей — обязательно нужно использовать репликацию, databaserepair, при больших объемах данных может длиться довольно долго. от кривых map-reduce запросов сервер падает(к счастью, падает в 100% случаев)
Как FriendFeed использует MySQL для хранения данных без схемы