динамично горизонтальное масштабируемое хранилище значения ключа

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

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

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

Спасибо

Zubair

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

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

Riak - Это - то, которое я изучаю сам, но у меня еще нет результатов

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

@shaman предложил Cassandra - определенно один я изучаю

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

9
задан skaffman 29 August 2010 в 09:42
поделиться

8 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

17
ответ дан 4 December 2019 в 06:16
поделиться

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

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

Создать два пользовательских стручка для хранения BackbLaze ( Link ) и запустить могилефы поверх него.

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

2
ответ дан 4 December 2019 в 06:16
поделиться

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

2
ответ дан 4 December 2019 в 06:16
поделиться

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

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

5
ответ дан 4 December 2019 в 06:16
поделиться

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

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

2
ответ дан 4 December 2019 в 06:16
поделиться

Вы можете взглянуть на MongoDB .

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

Возможно, вы захотите взглянуть на распределенные файловые системы, такие как MOUSEFS или Глястерник и сохранить ваши данные в качестве файлов. Обе системы являются неисправными и распределены (вы можете поместить и вынимать узлы, как вам нравится), и оба прозрачны для клиентов (построены сверху предохранителя) - вы используете простую файловую систему ops. Это покрывает следующие функции: 1), 2), 3), 4), 6), 7), 8). Мы используем MOOSEFS для хранения цифровых фильмов с чем-то AROUNG 1,5 PB хранения и загрузки / загрузки так же быстро, как позволяет нажатием сети (поэтому производительность - зависимый от ввода / вывода, а не протокол или зависит от реализации). У вас не будет запросов (функция 5) в вашем списке), но вы можете соединить такую ​​файловую систему с чем-то вроде Mongodb или даже некоторую поисковую систему, такую ​​как Lucene (она имеет кластеризованные индексы), чтобы запросить данные, хранящиеся в файловой системе Отказ

1
ответ дан 4 December 2019 в 06:16
поделиться

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

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

4
ответ дан 4 December 2019 в 06:16
поделиться

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

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

4
ответ дан 4 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: