динамически горизонтальное масштабируемое хранилище значений ключей - PullRequest
9 голосов
/ 19 января 2010

Есть ли хранилище значений ключей, которое даст мне следующее:

  • Позвольте мне просто добавлять и удалять узлы и автоматически распространять данные
  • Позвольте мне удалить узлы и при этом иметь 2 дополнительных узла данных для обеспечения избыточности
  • Разрешить хранить текст или изображения размером до 1 ГБ
  • Может хранить данные небольшого размера до 100 ТБ данных
  • Быстро (поэтому разрешит выполнение запросов поверх него)
  • Сделайте все это прозрачным для клиента
  • Работает на Ubuntu / FreeBSD или Mac
  • Бесплатный или открытый исходный код

Мне в основном нужно что-то, что я могу использовать как "одиночный", и мне не нужно беспокоиться о наличии memcached, db и нескольких компонентов хранилища, так что да, я хочу, чтобы вы сказали "серебряную пулю" базы данных.

Спасибо

Зубайр

Ответы пока: MogileFS поверх BackBlaze - насколько я вижу, это просто файловая система, и после некоторых исследований она кажется подходящей только для больших файлов изображений

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

Riak - это тот, который я смотрю в себя, но у меня пока нет результатов

Amazon S3. Кто-нибудь использует это в качестве своего единственного постоянного слоя в производстве? Из того, что я видел, похоже, что оно используется для хранения изображений, поскольку сложные запросы слишком дороги

@ шаман предложил Кассандру - определенно, которую я изучаю

Пока что кажется, что нет базы данных или хранилища значений ключей, которые бы соответствовали упомянутым мною критериям, даже после предложения 100 баллов на вопрос был получен ответ!

Ответы [ 12 ]

17 голосов
/ 29 августа 2010

Вы слишком много просите от программного обеспечения с открытым исходным кодом.

Если у вас в бюджете есть пара сотен тысяч долларов для какого-либо программного обеспечения корпоративного класса, есть пара решений. Ничто не будет делать то, что вы хотите из коробки, но есть компании, у которых есть продукты, которые близки к тому, что вы ищете.

«Быстро (так, что запросы будут выполняться поверх него)»

Если у вас есть хранилище ключей, все должно быть очень быстро. Однако проблема заключается в том, что без онтологии или схемы данных, построенной поверх хранилища значения ключа, вы в конечном итоге пройдете всю базу данных для каждого запроса. Вам нужен индекс, содержащий ключ для каждого «типа» данных, которые вы хотите сохранить.

В этом случае вы обычно можете выполнять запросы параллельно со всеми ~ 15 000 компьютеров. Узким местом является то, что дешевые жесткие диски работают со скоростью 50 запросов в секунду. Если ваш набор данных помещается в ОЗУ, ваша производительность будет чрезвычайно высокой. Однако, если ключи хранятся в ОЗУ, но не хватает ОЗУ для хранения значений, система перейдет на диск почти во всех поисках значений ключей. Каждая из клавиш расположена в произвольном положении на диске.

Это ограничивает вас до 50 поисков значений ключа в секунду на сервер. Принимая во внимание, что, когда пары ключ-значение хранятся в ОЗУ, нет ничего необычного в том, чтобы получать 100 тыс. Операций в секунду на сервер на аппаратном оборудовании (например, Redis).

Однако производительность чтения последовательного диска чрезвычайно высока. Я ищу приводы goto 50 МБ / с (800 МБ / с) при последовательном чтении Поэтому, если вы храните значения на диске, вы должны структурировать хранилище так, чтобы значения, которые должны быть считаны с диска, могли считываться последовательно.

В этом проблема. Невозможно добиться хорошей производительности в хранилище значений ключей ванили, если вы не сохраните пары ключ-значение полностью в ОЗУ (или ключи в ОЗУ со значениями на дисках SSD) или если вы не определите какой-либо тип схемы или тип системы поверх ключей, а затем кластеризовать данные на диске, чтобы все ключи данного типа можно было легко найти через считывание последовательного диска.

Если ключ имеет несколько типов (например, если у вас есть отношения наследования типов данных в базе данных), тогда ключ будет элементом нескольких индексных таблиц. В этом случае вам придется сделать компромисс между временем и пространством, чтобы структурировать значения так, чтобы они могли последовательно считываться с диска. Это влечет за собой хранение избыточных копий значения для ключа.

То, что вы хотите, будет немного более продвинутым, чем хранилище значений ключей, особенно если вы собираетесь выполнять запросы. Однако проблема хранения больших файлов не является проблемой. Притвориться, что ваша система может набирать ключи до 50 мег. Затем вы просто разбиваете файл объемом 1 гигабайт на сегменты по 50 мегабайт и связываете ключ с каждым значением сегмента. Используя простой сервер, легко перевести нужную часть файла в операцию поиска значения ключа.

Проблема достижения избыточности является более сложной. Очень просто «кодировать фонтан» или «файл детали» таблицы ключ-значение для сервера, так что данные сервера могут быть восстановлены со скоростью соединения (1 Гбит / с) на резервный сервер, если конкретный сервер умирает. Обычно вы можете обнаружить смерть сервера, используя систему «сердцебиения», которая срабатывает, если сервер не отвечает в течение 10 секунд. Можно даже выполнить поиск по значению ключа в таблицах значений ключа, закодированных в файле детали, но это неэффективно, но все равно дает резервную копию на случай сбоя сервера. При больших проблемах практически невозможно поддерживать резервную копию в актуальном состоянии, а данным может быть 3 минуты. Если вы выполняете много операций записи, функция резервного копирования может привести к некоторому снижению производительности, но она будет незначительной, если ваша система в основном выполняет чтение.

Я не являюсь экспертом по поддержанию согласованности и целостности базы данных в режимах сбоев, поэтому я не уверен, какие проблемы могут возникнуть из-за этого требования. Если вам не нужно беспокоиться об этом, это значительно упрощает проект системы и ее требования.

Быстро (поэтому разрешит выполнение запросов поверх него)

Во-первых, забудьте о объединениях или любой операции, которая масштабируется быстрее, чем n * log (n), когда ваша база данных настолько велика. Есть две вещи, которые вы можете сделать, чтобы заменить функциональность, обычно реализуемую объединениями. Вы можете либо структурировать данные так, чтобы вам не нужно было выполнять объединения, либо вы можете «предварительно скомпилировать» запросы, которые вы делаете, и сделать компромисс во времени и пространстве, предварительно вычислить объединения и сохранить их для предварительного просмотра. .

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

Для систем этого типа, если у вас есть дополнительная оперативная память или место для хранения, лучше всего использовать ее для предварительного вычисления и сохранения результатов общих подзапросов по соображениям производительности вместо добавления дополнительной избыточности к значению ключа хранить. Предварительно вычисляйте результаты и упорядочивайте их по ключам, к которым вы будете обращаться, чтобы превратить соединение n ^ 2 в поиск в журнале (n). Любой запрос или подзапрос, который масштабируется хуже, чем n * log (n), - это то, результаты которого необходимо выполнить и кэшировать в хранилище значений ключей.

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

Добро пожаловать в ад. Вы не должны ожидать, что получите такую ​​систему бесплатно еще 20 лет.

Пока что кажется, что нет базы данных или хранилища значений ключей, которые бы соответствовали критериям, которые я упомянул, даже после предложения 100 баллов на вопрос был получен ответ!

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

5 голосов
/ 29 января 2010

Amazon S3 - это решение для хранения, а не база данных.

Если вам нужен только простой ключ / значение, лучше всего использовать Amazon SimpleDB в сочетании с S3.Большие файлы хранятся на S3, а метаданные для поиска хранятся в SimpleDB.это дает вам горизонтально масштабируемую систему ключ / значение с прямым доступом к S3.

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

HBase и HDFS вместе отвечают большинству этих требований. HBase может использоваться для хранения и извлечения небольших объектов. HDFS может использоваться для хранения больших объектов. HBase уплотняет мелкие объекты и сохраняет их как большие объекты в HDFS. Скорость относительна - HBase не так быстро при случайном чтении с диска, как mysql (например) - но довольно быстро обслуживает чтения из памяти (аналогично Cassandra). Имеет отличную производительность записи. HDFS, базовый уровень хранения, полностью устойчив к потере нескольких узлов. Он дублирует стойки и позволяет проводить техническое обслуживание на уровне стойки. Это стек на основе Java с лицензией Apache - работает практически во всех ОС.

Основными недостатками этого стека являются неоптимальная производительность чтения с произвольного диска и недостаточная поддержка центров обработки данных (что находится в стадии разработки).

4 голосов
/ 26 февраля 2010

Есть еще одно решение, которое, кажется, именно то, что вы ищете: проект Apache Cassandra: http://incubator.apache.org/cassandra/

В настоящее время твиттер переключается на Cassandra из кластера memcached + mysql

2 голосов
/ 29 января 2010

Из того, что я вижу в вашем вопросе Проект Волдеморт кажется наиболее близким. Взгляните на их страницу дизайна .

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

2 голосов
/ 22 января 2010

Взгляните на Токийский тиран .Это очень легкий, высокопроизводительный реплицирующий демон, экспортирующий в сеть хранилище ключей Tokyo Cabinet .Я слышал хорошие новости об этом.

2 голосов
/ 21 января 2010

Я могу предложить вам два возможных решения:

1) Купить сервис Amazon (Amazon S3). За 100 ТБ это будет стоить 14 512 долларов в месяц.
2) гораздо более дешевое решение:

Создайте два пользовательских модуля хранения Backblaze ( ссылка ) и запустите MogileFS поверх него.

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

1 голос
/ 31 мая 2013

Выезд BigCouch .Это CouchDB, но оптимизированный для кластеров (и для всех кластеров проблем больших данных подходят).BigCouch объединяется в проект CouchDB , как мы говорим, от пользователей Cloudant , многие из которых являются основными приверженцами CouchDB.

Краткое изложение ваших требований:

Позвольте мне просто добавлять и удалять узлы и автоматически распространять данные

Позвольте мне удалять узлы и иметь еще 2 дополнительных узла данных для обеспечения избыточности

Да.BigCouch использует концепцию «Кворума» в «Динамо», чтобы установить, сколько узлов хранит количество копий ваших данных.

Позвольте мне хранить текст или изображения размером до 1 ГБ

Да,Как и CouchDB, вы можете передавать потоковые объекты (например, файлы) произвольного размера в базу данных.

Может хранить данные небольшого размера до 100 ТБ данных

Да.Команда, которая создала BigCouch, сделала это потому, что столкнулась с системой, генерирующей петабайты данных в секунду.

Быстро (поэтому можно будет выполнять запросы поверх нее)

Да.Запросы выполняются MapReduce в O (log n) время .

Сделать все это прозрачным для клиента

Работает на Ubuntu / FreeBSD или Mac

Бесплатный или открытый исходный код

Да!Открытый исходный код под лицензией Apache 2.0.Инструкции по установке по умолчанию относятся к системе Debian, например, к Ubuntu.

1 голос
/ 05 октября 2011

В дополнение к тому, что упоминали другие - вы можете взглянуть на OrientDB - http://code.google.com/p/orient/ документ и K / V хранилище, которое выглядит очень многообещающе.

1 голос
/ 24 июля 2011

MarkLogic идет в этом направлении. Хотя совсем не бесплатно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...