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

189
задан 33 revs, 5 users 83% 28 March 2013 в 15:58
поделиться

10 ответов

Пытались ли вы вообще не изменять файл test.cpp, но при компиляции также сказать:

-I/usr/include/gfc2/
-121--4349257-

Это не эквивалентно JOIN.

Если у вас есть несколько строк в TABLE2 для каждой строки в TABLE1, вы не получите их. Для каждой строки в TABLE1 вы получаете один вывод строки, так что вы не можете получить несколько из TABLE2.

Вот почему я бы использовал «JOIN»: чтобы убедиться, что я получил данные, которые я хотел...

После вашего обновления: я редко использую корреляцию, кроме как с EXISTS...

-121--3777310-

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

Около 2 лет назад мы выпустили самостоятельно написанное программное обеспечение на http://www.ubuntuusers.de/ (который, вероятно, является крупнейшим немецким веб-сайтом сообщества Linux). Сайт написан на Python, и мы добавили промежуточное программное обеспечение WSGI, которое смогло уловить все исключения и отправить их на другой небольшой веб-сайт на базе MySQL. Этот небольшой веб-сайт использовал хэш для определения различных ошибок и сохранял количество вхождений и последнее вхождение.

К сожалению, вскоре после выхода сайт traceback-logger больше не отвечает. У нас были некоторые проблемы с блокировкой производственной базы данных нашего основного сайта, которая выбрасывала исключения почти по каждому запросу, а также несколько других ошибок, которые мы не исследовали на этапе тестирования. Серверный кластер нашего основного сайта, называемый traceback-logger отправить страницу несколько k раз в секунду. И это было слишком путь для небольшого сервера, на котором размещался регистратор traceback (это уже был старый сервер, который использовался только для целей разработки).

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

Интересно то, что ранее решение работало на старом выделенном сервере, где новый сайт на базе CouchDB, с другой стороны, работал только на общем экземпляре xen с очень ограниченными ресурсами. И я даже не использовал силу магазинов ключевых ценностей для горизонтального масштабирования. Способность CouchDB/Erlang OTP обрабатывать параллельные запросы без блокировки уже была достаточной для удовлетворения потребностей.

Теперь быстро написанный журнал CouchDB-traceback все еще работает и является полезным способом изучения ошибок на основном веб-сайте. В любом случае, примерно раз в месяц база данных становится слишком большой, и процесс CouchDB погибает. Но затем, команда compact-db CouchDB уменьшает размер с нескольких ГБ до некоторых КБ снова, и база данных работает снова (может быть, я должен рассмотреть возможность добавления cronjob там... 0o).

Таким образом, CouchDB, безусловно, был лучшим выбором (или, по крайней мере, лучший выбор, чем MySQL) для этого подпроекта и он хорошо выполняет свою работу.

49
ответ дан 23 November 2019 в 05:40
поделиться

Фактически, мой текущий проект.

Хранение 18 000 объектов в нормализованной структуре: 90 000 строк в 8 различных таблицах. Потребовалась 1 минута, чтобы получить и сопоставить их с нашей объектной моделью Java, при этом все правильно проиндексировано и т. Д.

Сохранение их в виде пар ключ / значение с использованием облегченного текстового представления: 1 таблица, 18 000 строк, 3 секунды, чтобы получить их все и реконструировать объекты Java.

С точки зрения бизнеса: первый вариант не представлялся возможным. Второй вариант означает, что наше приложение работает.

Сведения о технологии: работает на MySQL как для SQL, так и для NoSQL! Придерживаясь MySQL для хорошей поддержки транзакций, производительности и проверенной репутации, чтобы не повредить данные, достаточно хорошо масштабировать, поддерживать кластеризацию и т. Д.

Наша модель данных в MySQL теперь состоит только из ключевых полей (целых чисел) и большого «значения» поле: просто большое ТЕКСТОВОЕ поле.

Мы не выбрали ни одного из новых проигрывателей (CouchDB, Cassandra, MongoDB и т. Д.), Потому что, хотя каждый из них предлагает отличные функции / производительность сам по себе, всегда были недостатки для наших обстоятельств (например, отсутствующая / незрелая поддержка Java ).

Дополнительное преимущество (ab) использования MySQL - части нашей модели, которые выполняют реляционную работу, могут быть легко связаны с данными нашего хранилища ключей / значений.

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

Name=An Example Product
Type=CategoryAProduct
Colour=Blue
Size=Large
Flavours={nice,lovely,unpleasant,foul}
Contains=[
Name=Product2
Type=CategoryBProduct
Size=medium
Flavours={yuck}
------
Name=Product3
Type=CategoryCProduct
Size=Small
Flavours={sublime}
]
50
ответ дан 23 November 2019 в 05:40
поделиться

На сайте Тодда Хоффа highscalability.com есть много интересного о NoSQL, включая некоторые тематические исследования.

Коммерческая колоночная СУБД Vertica может подойти для ваших целей (даже несмотря на поддержку SQL): она очень быстра по сравнению с традиционными реляционными СУБД для аналитических запросов. См. недавний доклад Стоунбрейкера и др. на CACM, в котором Vertica противопоставляется map-reduce.

Обновление: И Twitter выбрал Cassandra вместо нескольких других, включая HBase, Voldemort, MongoDB, MemcacheDB, Redis и HyperTable.

Обновление 2: Рик Кэттелл только что опубликовал сравнение нескольких систем NoSQL в Высокопроизводительных хранилищах данных. А на сайте highscalability.com статья Рика опубликована здесь.

22
ответ дан 23 November 2019 в 05:40
поделиться

Я использовал redis для хранения сообщений журнала на разных машинах. Это было очень легко реализовать и очень полезно. Redis действительно крут

2
ответ дан 23 November 2019 в 05:40
поделиться

Не хочу. Я хотел бы использовать простое и бесплатное хранилище ключевых значений, которое я мог бы вызывать в процессе, но такой вещи не существует afaik на платформе Windows. Сейчас я использую Sqlite, но я хотел бы использовать что-то вроде Tokyo Cabinet. У BerkeleyDB есть лицензионные "проблемы".

Однако если вы хотите использовать ОС Windows, ваш выбор баз данных NoSQL ограничен. И не всегда есть поставщик C#

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

2
ответ дан 23 November 2019 в 05:40
поделиться

У меня нет непосредственного опыта, но я нашел эту запись в блоге довольно интересной.

4
ответ дан 23 November 2019 в 05:40
поделиться

Мы заменили базу данных postgres на базу данных документов CouchDB, потому что отсутствие фиксированной схемы было для нас большим преимуществом. . Каждый документ имеет переменное количество индексов, используемых для доступа к этому документу.

2
ответ дан 23 November 2019 в 05:40
поделиться

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

CouchDB: конкретный пример

По сути, приложение textme использовало CouchDB для решения проблемы растущих данных. Они обнаружили, что SQL был слишком медленным для работы с большими объемами архивных данных, и перешли на CouchDB. Это отличное чтение, и он обсуждает весь процесс выяснения того, какие проблемы может решить CouchDB и как они в итоге их решили.

5
ответ дан 23 November 2019 в 05:40
поделиться

Мы перенесли часть наших данных с mysql на mongodb, не столько для масштабируемости, сколько потому, что она лучше подходит для файлов и нетабличных данных.

В настоящее время мы храним:

  • 25 тысяч файлов (60 ГБ)
  • 130 миллионов других "документов" (350 ГБ)

с ежедневным оборотом около 10 ГБ.

База данных развернута в "парной" конфигурации на двух узлах (6x450GB sas raid10) с apache/wsgi/python клиентами, использующими mongodb python api (pymongo). Дисковая установка, вероятно, избыточна, но это то, что мы используем для mysql.

Не считая некоторых проблем с потоковыми пулами pymongo и блокирующей природой сервера mongodb, это был хороший опыт.

8
ответ дан 23 November 2019 в 05:40
поделиться

Мы переместили некоторые данные, которые мы использовали для хранения в Postgresql и Memcached, в Redis . Хранилища значений ключей намного лучше подходят для хранения данных иерархических объектов. Вы можете хранить данные больших двоичных объектов намного быстрее и с гораздо меньшими затратами времени и усилий на разработку, чем использование ORM для сопоставления большого двоичного объекта с РСУБД.

У меня есть клиент c # redis с открытым исходным кодом , который позволяет сохранять и извлекать любые объекты POCO с одной строкой:

var customers = redis.Lists["customers"]; //Implements IList<Customer>
customers.Add(new Customer { Name = "Mr Customer" });

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

Я считаю Redis «управляемым текстовым файлом» на стероидах, который обеспечивает быстрый, одновременный и атомарный доступ для нескольких клиентов, поэтому все, что я использовал для использования текстового файла или встроенной базы данных, теперь использую Redis. например Чтобы получить в режиме реального времени объединенный журнал ошибок для всех наших служб (что, как известно, было для нас сложной задачей), теперь можно выполнить всего за пару строк, просто предварительно отложив ошибку в списке на стороне сервера Redis, а затем обрезка списка, чтобы сохранить только последние 1000, например:

var errors = redis.List["combined:errors"];
errors.Insert(0, new Error { Name = ex.GetType().Name, Message = ex.Message, StackTrace = ex.StackTrace});
redis.TrimList(errors, 1000);
5
ответ дан 23 November 2019 в 05:40
поделиться
Другие вопросы по тегам:

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