Сериализация с буферами протокола в базе данных без схемы

Мы используем MySQL для хранения данных без схемы (см. Использование реляционной базы данных для данных без схемы для решения, вдохновленного тем, как FriendFeed использует MySQL для хранения данных без схемы).

Одна большая таблица содержит все сущности для нашего приложения:

CREATE TABLE entities (
  added_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
, id BINARY(16) NOT NULL
, body MEDIUMBLOB
, UNIQUE KEY (id)
) ENGINE=InnoDB ;

Немного подробностей:

  • Единственное обязательное свойство хранимых объектов - это id, 16-байтовый UUID. Остальная часть объекта непрозрачна для базы данных. Мы можем изменить «схему», просто сохранив новые свойства в body.

  • Столбец added_id присутствует, потому что InnoDB физически хранит строки данных в порядке первичного ключа. Первичный ключ AUTO_INCREMENT гарантирует, что новые сущности записываются на диск последовательно после старых сущностей, что помогает для локальности чтения / записи (новые сущности читаются чаще, чем старые).

  • Наша база данных хранит наши бессхемные данные в body. ‹- Это тема этого вопроса.

  • Множество других интересных деталей, таких как "доступ" к данным body для построения асинхронных материализованных представлений (индексы - это просто таблицы, которые создаются в автономном режиме), но они не имеют отношения к текущему обсуждению ...

Как мы должны сериализовать структурированные данные (пары ключ-значение) в body?

JSON или BSON были бы простыми, поскольку имена полей повторяются для каждой строки. Это дает ему преимущество в гибкости, но также и большой недостаток в эффективности использования пространства (накладные расходы для каждой строки для имен полей в сериализованных данных). Мы стараемся хранить вещи в памяти, и здесь важно минимизировать объем памяти и сети. Чем больше записей мы поместим в одно и то же пространство, тем быстрее будут выполняться наши запросы. Мы предпочитаем относительно длинные описательные имена полей, и сокращать их, чтобы моя база данных работала быстрее, неправильно!

В конце концов, JSON / BSON неприменим для наших целей, если мы не сделаем более сложным и не сопоставим маленькие ключи с более описательными ключами в драйвере приложения, который общается с базой данных. Что заставило нас задуматься ...

Хотя наша база данных не имеет схемы, на самом деле: 1) не так много разных типов сущностей, 2) версии одного и того же типа сущностей не часто меняются и 3) когда они меняются, обычно просто добавляется другое поле. JSON / BSON не имеют встроенной поддержки управления версиями.

Буферы протоколов и экономия средств намного сложнее, когда дело доходит до управления версиями и изменений определения данных. И Thrift, и Protocol Buffers являются отличными кандидатами для сериализации данных в базы данных, а Thrift спроектирован таким образом, что формат кодирования является расширяемым.

Буферы протоколов выглядят как отличный выбор для сериализации данных в бессхемной базе данных.

CouchDB и MongoDB (две самые популярные базы данных без схемы?) Используют JSON и BSON соответственно, но мы не можем найти ничего об использовании чего-то более продвинутого, например протокольных буферов, в качестве формата сериализации для хранения данных без схемы. . Существуют продукты, которые хранят версию объектов определенного языка (например, хранят внешние объекты Java в сетке данных или выполняют NoSQL с MySQL в Ruby), но это проблема (попробуйте получить к ним доступ с других платформ или даже из самого MySQL, и забудьте о версиях).

Кто-нибудь хранит более функционально совместимые буферы протоколов в своей базе данных или какой-либо другой расширенный формат сериализации в своей базе данных без схемы? Это вопрос о том, есть ли другие варианты, кроме простой сериализации для каждой строки JSON / BSON / XML или сериализации объектов определенного языка. Это вообще возможно? Мы что-то упускаем? извините за повествование в стиле потока сознания!


person Évariste Galois    schedule 25.11.2010    source источник
comment
Спасибо за ссылку Friendfeed и подробности в этом вопросе. Я заметил одну вещь: Friendfeed не использовал буферы протоколов в своей бессхемной реализации MySQL, даже если они были получены от Google ... Интересно, почему? Прошло много времени с момента вашего сообщения - просто интересно, что вы решили сделать и как это для вас обернулось (особенно если вы решили использовать буферы протокола).   -  person TaiwanGrapefruitTea    schedule 01.08.2013
comment
Спасибо. У меня был очень похожий вопрос, хотя он был немного более общим: stackoverflow.com/questions/17441428/. Я надеюсь, что мы увидим что-то, что позволит разработчикам систем создавать более строгую, но масштабируемую схему для наших реализаций NoSQL. Буферы протокола кажутся очень хорошим началом для разработки механизмов определения схемы и контроля версий.   -  person Timothy C. Quinn    schedule 15.08.2014


Ответы (4)


Как вы узнали, MongoDB и CouchDB придерживаются твердого мнения о том, как вы храните свои данные. Если вы ищете подход, не зависящий от хранилища, вам нужно сделать что-то вроде того, что предлагает @Joshua, и посмотреть на Cassandra или HBase. Даже у этих двух хранилищ есть мнения о том, как следует хранить данные (они оба основаны на Bigtable от Google) и хранить данные в семействах столбцов .

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

person Jeremiah Peschka    schedule 30.11.2010
comment
Прочтите, пожалуйста, вопрос. Он спрашивает, как это сделать с MySQL. - person Pacerier; 23.11.2014
comment
Да, тогда я прочитал остальную часть вопроса. В том числе. Хранит ли кто-нибудь более функционально совместимые буферы протоколов в своей базе данных или какой-либо другой расширенный формат сериализации в своей базе данных без схемы? - person Jeremiah Peschka; 23.11.2014
comment
Итак, вы поняли, что он запрашивает какой-то другой расширенный формат сериализации в базе данных MySQL без схемы. Когда контекст вопроса установлен, модификатор существительного для подлежащих может быть опущен. Люди, которые перейдут к последнему абзацу, не прочитав весь вопрос, дадут ответ вне контекста, как ваш. - person Pacerier; 23.11.2014
comment
Ты прав. Я подвел человечество. Я должен уйти, моим людям нужно, чтобы я прошел дополнительную подготовку, чтобы научиться проявлять педантичность. - person Jeremiah Peschka; 23.11.2014
comment
Обучение, которое вам требуется, заключается в том, чтобы просто прочитать весь вопрос, прежде чем опубликовать ответ. Это та часть, которую вы потерпели. - person Pacerier; 23.11.2014

Возможно, вы захотите изучить что-то вроде Cassandra или HBase для хранения ваших данных. Проблема с непрозрачным большим двоичным объектом данных заключается в том, что вы не можете запрашивать на его основе свою схему MySQL здесь. Если вы что-то ищете, вам придется прочитать каждую каплю и проверить это. Если это действительно неважно для того, как вы выполняете поиск (т.е. вы всегда являетесь ключом), я бы предложил использовать буферы протокола для сериализации данных, возможно, сжимая с помощью zlib или LZO-сжатия.

Буферы протокола позволяют вам создать простую структуру данных, которая может принимать дополнительные поля по мере развития ваших данных. Имена полей хранятся в виде чисел, а код для работы со структурами генерируется автоматически из вашего файла .proto. Производительность хорошая, а объемы данных остаются небольшими. При желании вы можете сжать данные с помощью MySQL compress () или одной из обобщенных здесь библиотек сжатия в реальном времени (не только Java):

Быстрое сжатие в Java?

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

person Joshua Martell    schedule 25.11.2010
comment
Он заявил, что Cassandra / HBase не являются допустимыми вариантами. - person Pacerier; 23.11.2014
comment
Он только заявил, что CouchDB и MongoDB не работают из-за использования JSON / BSON. Его исследование технологий NoSQL подразумевает готовность переключиться, если выгода будет уместной. - person Joshua Martell; 23.11.2014
comment
Вообще-то, нет. Он хочет построить бессхемное решение на основе надежной СУБД, также известное как достижение NoSQL с MySQL. Прочтите весь вопрос и пройдите по ссылкам. - person Pacerier; 23.11.2014

PostgreSQL теперь имеет тип JSON: http://www.postgresql.org/docs/9.3/static/datatype-json.html

Вы можете делать запросы, где вы «доходите» до этих значений.

Преобразовать Protobuf в JSON должно быть довольно легко.

person uldall    schedule 06.03.2014
comment
Это вопрос MySQL. - person Pacerier; 23.11.2014

Я отсылаю вас к ответу, который я выдвинул несколько месяцев назад на похожую тему. Мы используем MySQL и специальный текстовый формат, который оказался быстрее, чем форматы XML или JSON:

С какими проблемами масштабируемости вы столкнулись используете хранилище данных NoSQL?

Хорошо работает для нас. Тем не менее, не пробовал протокол буферов.

person Brian    schedule 30.11.2010
comment
Вероятно, вы используете плохой синтаксический анализатор JSON или XML - накладные расходы при хорошем impl должны быть достаточно низкими, чтобы пользовательские форматы были непрактичными. - person StaxMan; 11.03.2011
comment
Нет, я не думаю, что мы это сделали, я думаю, честно говоря, наша конкретная проблема была наиболее эффективно решена с использованием специального формата. У этого есть и другие недостатки, но одна только производительность не является одним из них. - person Brian; 11.03.2011
comment
Из любопытства, на каком это языке / платформе? Мой опыт работы с Java. И я не говорю, что нестандартный формат не может быть быстрым (конечно, может), просто сложно быть значительно быстрее. - person StaxMan; 13.03.2011
comment
Да, это тоже Java. Пользовательский текстовый формат - для нашего очень конкретного диапазона десериализаций, т.е.объекты содержат только небольшое количество дочерних возможностей - был быстрее, чем XML, JSON и даже двоичная десериализация. Частично из-за простого размера: в то время как двоичные и XML-строки в БД могут иметь размер, скажем, 10000 x 1,5 КБ, с соответствующим дисковым вводом-выводом, наш настраиваемый формат может быть только 10000 x 0,6 КБ. - person Brian; 14.03.2011
comment
В порядке. Спасибо за подробности - я только что видел, как многие разработчики для начала используют неоптимальные инструменты, которые могут давать некоторую искаженную базовую линию (например, использовать DOM для обработки xml или пакет org.json) - person StaxMan; 15.03.2011