Обычно о масштабировании начинают думать тогда, когда один сервер не справляется с возложенной на него работой. С чем именно он не справляется? Работа любого web-сервера по большому счету сводится к основному занятию компьютеров - обработке данных. Ответ на HTTP (или любой другой) запрос подразумевает проведение некоторых операций над некими данными. Соответственно, у нас есть две основные сущности - это данные (характеризуемые своим объемом) и вычисления (характеризуемые сложностью). Сервер может не справляться со своей работой по причине большого объема данных (они могут физически не помещаться на сервере), либо по причине большой вычислительной нагрузки. Речь здесь идет, конечно, о суммарной нагрузке - сложность обработки одного запроса может быть невелика, но большое их количество может “завалить” сервер.
В основном мы будем говорить о масштабировании на примере типичного растущего web-проекта, однако описанные здесь принципы подходят и для других областей применения. Сначала мы рассмотрим архитектуру проекта и простое распределение ее составных частей на несколько серверов, а затем поговорим о масштабировании вычислений и данных.
(more…)