Самый простой способ масштабировать Монго с ограниченными ресурсами? - PullRequest
1 голос
/ 28 февраля 2012

У меня есть веб-сервер (40 гигабайт hd, 1 гигабайт оперативной памяти), на котором запущено Mongo и приложение Rails.

База данных Mongo - это хранилище документов твитов и пользователей Twitter, которое имеет несколько миллионов записей.Я выполняю запросы сокращения данных для данных, чтобы извлечь такие вещи, как самые распространенные хэштеги, слова, упоминания и т. Д. (Очень стандартные вещи).Мета-данные каждого твита уже сохранены, поэтому сокращение карты действительно так же эффективно, как и один сбор.

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

Какой самый быстрый и дешевый способ масштабирования монго, особенно в плане снижения производительности карт?Я могу настроить дополнительный сервер и разделить нагрузку, но мне интересно, стоит ли мне использовать шардинг, репликацию или и то, и другое?В этой ситуации шардинг может быть излишним.

Хотелось бы получить некоторую информацию о моем соединении mysql-mongo.MySQL содержит профили Twitter, которые хранят идентификаторы Twitter для каждого профиля.каждый раз, когда выполняется уменьшение карты, она собирает все идентификаторы, которые должны быть переданы в качестве параметров в mapreduce, например:

@profile_tweet_ids = current_profile_tweet_ids # array of ids
@daily_trend = TwitterTweet.daily_trend :query => {:twitter_id => {"$in" => @profile_tweet_ids}}

Функция mapreduce в TwitterTweet выглядит следующим образом:

def daily_trend(options={})
  options[:out] = "daily_trend"

  map = %Q( function(){
                if (this.created_at != null)
                {
                  emit(this.created_at.toDateString(), 1);
                }
            })

  result = collection.map_reduce(map, standard_reduce, options)
  normalize_results(result)
end

Любой советценится!

Ответы [ 5 ]

2 голосов
/ 10 мая 2012

Похоже, ваш вариант использования больше в линиях онлайн-потока / обработки событий. Вы можете использовать mongo или другой продукт баз данных / кеширования для хранения справочных данных, а также среду обработки событий для получения и обработки событий. Есть несколько инструментов, которые могут помочь вам в этом - вот некоторые из них: Twitter Storm, Apache S4, GigaSpaces XAP (отказ от ответственности - я работаю для GigaSpaces) и GridGain.

2 голосов
/ 28 февраля 2012

Если вы делаете простые подсчеты, суммы, уникальные и т. Д., Вы можете полностью отказаться от использования карты. Вы можете использовать оператор $ inc, чтобы получить большую часть необходимого вам в реальном времени. Я подробно объяснил это в своем блоге о аналитике в реальном времени с MongoDB .

0 голосов
/ 14 декабря 2013

Именно связи между различными элементами данных являются наиболее ценными для них (они позволяют общественности выполнять работу по классификации данных, чтобы сделать их ценными) и, следовательно, также наиболее опасными для вас http://indresult.com

0 голосов
/ 28 февраля 2012

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

Кроме того, вы также можете воспользоваться новой структурой агрегирования (http://www.mongodb.org/display/DOCS/Aggregation+Framework),, как только она будет доступна в следующем выпуске.

Чтобы ответить на более общий вопрос о том, как масштабировать MapReduce, добавление нового сервера может не помочь, если вы просто собираетесь добавить его в качестве вторичного, так как в качестве вторичного он не сможет хранить ваши M / R. результаты в коллекции, так что встроенный это ваш единственный вариант. Если вам не нужно хранить результаты в коллекции, то это ваш самый простой путь вперед. Для получения дополнительной информации см. Подробное обсуждение здесь: http://groups.google.com/group/mongodb-user/browse_thread/thread/bd8f5734dc64117a

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

0 голосов
/ 28 февраля 2012

Используйте один из облачных сервисов, таких как MongoLab .. Зависит от вашего определения дешевого хотя ..

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