Допустим, мы начинаем проект, который предназначен для обслуживания по всему миру.
Как мне распределить нагрузку на базу данных и сервер, а также увеличить (оптимизировать) сервис для большой аудитории?
Я знаю об обратном прокси, балансировке нагрузки, использовании DNS для поддоменов для нацеливания на несколько IP-адресов, которые могут обслуживать один и тот же контент.
В настоящее время меня интересует, есть ли какой-либо простой способ распределить всю мою базу данных и службу (на данный момент это одна виртуальная машина) для распределения нагрузки.
Некоторые из идей / вопросов, которые у меня возникли
Я не думаю, что на это легко ответить, поэтому, вероятно, лучший способ ответить - указать мне на некоторые официальные документы, связанные с этой темой.
Это очень широкий вопрос, и серебряной пули для решения этой проблемы не существует. Самая большая проблема при настройке нескольких сайтов - это база данных, особенно базы данных с несколькими мастерами. Mysql и несколько баз данных nosql действительно поддерживают репликацию с несколькими мастерами, вам нужно будет оценить и выяснить, какая из них лучше всего соответствует вашим требованиям.
Слегка не по теме, но какая задержка допустима в вашей настройке? CDN, обратные прокси могут помочь ускорить работу вашего сайта. Подобные Google / Yahoo / Facebook обслуживают динамический контент на разных континентах без особых задержек.
простой способ распространить всю мою базу данных
Подумай о запирание на секунду. Когда два клиента хотят записать в одну и ту же строку в базе данных, база данных использует блокировки записи, чтобы избежать условий гонки и недопустимых данных. В сценарии с «распределенной базой данных» необходимо распределить сами действия по получению и снятию блокировки. Как бы вы это сделали, как бы вы создали эффективную систему блокировки, когда другие узлы могут быть на расстоянии до 0,300 секунд?
На этот вопрос нет хорошего ответа, это одна из самых сложных проблем в информатике. Для введения вы можете прочитать теорема CAP.
один сервер и использует только CDN для доставки статических ресурсов
Да, это самый распространенный метод. Храните все свои динамические данные в одном центре обработки данных (то есть серверы веб-приложений и серверы баз данных, размещенные в одном объекте), а затем используйте глобальный CDN для статических битов. Об этой настройке легко рассуждать, и в целом она работает хорошо.
- это любая платформа, где я могу разделить слои M-V-C, поэтому каждый будет работать на отдельном сервере или может быть оптимизирован, распределен отдельно
В непосредственной близости друг от друга, где сетевые соединения очень быстрые и стабильно низкие задержки: нет проблем. В географически распределенном режиме, когда сетевые ссылки медленные, это невозможно.
разместить мое приложение в каком-то облачном сервисе, который будет обрабатывать возрастающую нагрузку и распространять сервис
В некоторой степени это делает Google App Engine. ИМХО, это главное, что дает вам App Engine. Чтобы достичь этого, вам придется программировать с использованием очень упрощенной модели данных App Engine (т.е. без SQL, только BigTable), которая имеет значительные отрицательные компромиссы.
Ваш вопрос возникает повсюду, а проблема сложна - поэтому непросто просто указать вам на одну книгу, которую нужно прочитать.