У меня есть веб-сервер (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
Любой советценится!