Есть NodeJS приложение размещенное на ubuntu server. В качестве базы данных использую MongoDB. Хочу попробовать его масштабировать, организовав несколько копий + балансировщик нагрузки. Посоветуйте какие-нибудь туториалы, статьи, скринкасты, ну в общем все что есть или поделитесь своим опытом создания кластера для NodeJS приложений.
1) Не используйте node.js в качестве балансировщика, для этого есть haproxy, nginx
2) Попробуйте github.com/nodejitsu/haibu или github.com/substack/fleet (мне понравился больше)
3) Не используйте mongo для сессий и хранения простых данный key/value, для этого есть redis, leveldb
Вообще вам нужно понять для чего вы хотите масштабировать, для отказоустойчивости или для производительности.
что такое "хранение простых данный key/value"? Является ли случай: Таблица Posts и вложенная в нее Comments этим случаем, в котором противопоказано использование MongoDb?
nodejs.org/api/cluster.html (в пределах одной машины). Можно добавить nginx (http://wiki.nginx.org/HttpUpstreamModule) в качестве прокси, если машин несколько.
P.S.: на практике не запиливал, но должно работать хорошо.
в любом случае сначала следует понять где узкое место. и вот это узкое место масштабировать. если проблема с хранилищем данных — значит делать шардинг. Если все правильно сделано сначала, то это не приведет к существенным изменениям в приложении. Если узкое место это сама вебная часть — то правильное решение поднять несколько вебсерверов и их балансировать через nginx UpStream, как вы и отметили. Но всё опять же зависит от того, где узкое место, что это за приложение и какие задачи оно выполняет.
Если задача «проверить масштабируемость моего приложения», то предстоит опять же ответить на вопрос: какое место в обозримом будущем может стать узким и как скоро. Если приложение не требовательное к update/insert в базе, то база станет узким местом не так-то скоро. Если есть сомнения — провести нагрузочный тест и, кстати, многое для себя узнать об архитектуре своего сервиса. Когда повалят странные ошибки, окажется что неправильно настроено логирование и так далее. Пофиксить эти проблемы сейчас — значит подойти к технической возможности осуществления масштабирования.
Сразу кину булыжник в ваш огород! Скажите честно, а вы смотрели код cluster или просто взяли и поехали? Вы знаете, что при больших нагрузках cluster теряет пакеты? Вы же знакомы с udp?(https://github.com/joyent/node/blob/master/lib/clu... Попробуйте нагрузить эту финтифлюшку и вы увидите как оно феерически теряет пакеты, потому что затыкается на коде который нифига не io - вобщем, для баловства сойдет, но в продакшен с хорошей нагрузкой вы стреляете себе в ногу!