Горизонтальное масштабирование¶
Горизонтальное масштабирование (горизонтальное расширение, англ. horizontal scaling, scale-out) — это метод увеличения производительности и ёмкости вычислительной системы путём добавления новых однотипных узлов (серверов, инстансов, контейнеров) в распределённую архитектуру, в отличие от вертикального масштабирования (scale-up), которое предполагает замену существующего узла на более мощный. Основной принцип горизонтального масштабирования заключается в распределении нагрузки между множеством независимых узлов, работающих параллельно, что позволяет повысить отказоустойчивость и пропускную способность системы без замены оборудования на более дорогостоящее.
¶История и развитие
Концепция горизонтального масштабирования возникла в 1960–1970-х годах с развитием распределённых вычислений и кластерных систем. Одним из ранних примеров является проект Berkeley Network of Workstations (NOW) в 1980-х годах, где исследователи объединяли обычные рабочие станции для выполнения параллельных задач. Однако широкое распространение метод получил с ростом интернет-сервисов в конце 1990-х — начале 2000-х годов, когда компании, такие как Google, Amazon и eBay, столкнулись с необходимостью обрабатывать миллионы запросов в секунду при ограниченном бюджете на суперкомпьютеры.
Ключевым драйвером стало развитие облачных технологий (Amazon Web Services, 2006; Microsoft Azure, 2010; Google Cloud Platform, 2008), которые позволили арендовать вычислительные ресурсы по требованию и автоматически добавлять узлы при росте нагрузки. В 2010-х годах горизонтальное масштабирование стало стандартом для веб-приложений, баз данных (NoSQL, NewSQL) и микросервисной архитектуры.
¶Принципы работы
Горизонтальное масштабирование основано на трёх ключевых принципах:
- Распределение нагрузки: запросы от клиентов распределяются между узлами с помощью балансировщика нагрузки (например, Nginx, HAProxy, AWS ELB). Балансировщик может использовать алгоритмы round-robin, least connections или взвешенное распределение.
- Отсутствие общего состояния: каждый узел должен быть независимым и не хранить критичные данные, которые могут быть потеряны при отказе узла. Для этого используется внешнее хранилище (базы данных, кэш, очереди сообщений) или репликация данных.
- Автоматическое обнаружение и добавление узлов: система должна поддерживать динамическое добавление и удаление узлов без остановки работы (горизонтальное масштабирование в реальном времени). Это реализуется через оркестраторы (Kubernetes, Docker Swarm) или облачные группы автомасштабирования (Auto Scaling в AWS).
¶Сравнение с вертикальным масштабированием
| Характеристика | Горизонтальное масштабирование | Вертикальное масштабирование |
|---|---|---|
| Стоимость | Низкая начальная (использование дешёвых узлов), но высокая сложность управления | Высокая начальная (дорогое оборудование), но проще в управлении |
| Отказоустойчивость | Высокая (отказ одного узла не останавливает систему) | Низкая (отказ одного узла — полный сбой) |
| Производительность | Растёт линейно с добавлением узлов (до предела сети) | Ограничена максимальной мощностью одного узла |
| Сложность | Требует распределённого ПО, балансировки, управления состоянием | Проще в реализации (замена сервера) |
| Примеры | Веб-серверы (Nginx + Apache), базы данных (Cassandra, MongoDB), микросервисы | Монолитные приложения, базы данных (Oracle, MySQL) |
¶Области применения
¶Веб-серверы и приложения
Наиболее распространённая область — горизонтальное масштабирование веб-серверов. Например, при росте трафика на сайт добавляются новые экземпляры веб-сервера (Apache, Nginx, IIS) за балансировщиком нагрузки. Это позволяет обрабатывать миллионы запросов в секунду, как это делают сервисы Google, Facebook (принадлежит компании Meta, признанной экстремистской и запрещённой в РФ) и «Яндекс».
¶Базы данных
Горизонтальное масштабирование баз данных реализуется через шардинг (разделение данных по узлам) или репликацию (копирование данных на несколько узлов). Примеры:
- NoSQL: Cassandra, MongoDB, Couchbase — изначально спроектированы для горизонтального масштабирования.
- NewSQL: CockroachDB, TiDB — сочетают ACID-транзакции с масштабируемостью NoSQL.
- SQL: MySQL Cluster, PostgreSQL с Citus — позволяют шардировать реляционные базы данных.
¶Микросервисная архитектура
В микросервисах каждый сервис масштабируется независимо. Например, сервис аутентификации может иметь 3 узла, а сервис поиска — 10 узлов, в зависимости от нагрузки. Оркестраторы (Kubernetes) автоматически добавляют или удаляют узлы на основе метрик (CPU, память, количество запросов).
¶Обработка больших данных
Фреймворки, такие как Apache Hadoop и Apache Spark, используют горизонтальное масштабирование для распределения вычислений на кластерах из сотен или тысяч узлов. Данные разбиваются на блоки (HDFS) и обрабатываются параллельно.
¶Технические ограничения и проблемы
- Согласованность данных: в распределённых системах сложно обеспечить строгую согласованность (ACID) из-за задержек сети. Используются модели BASE (Basically Available, Soft state, Eventual consistency) или алгоритмы консенсуса (Raft, Paxos).
- Сетевая задержка: при большом количестве узлов время на передачу данных между ними может стать узким местом. Для снижения задержек применяются высокоскоростные сети (InfiniBand, 100GbE) и географическое размещение узлов.
- Сложность управления: требуется мониторинг (Prometheus, Grafana), логирование (ELK Stack), автоматизация развёртывания (Ansible, Terraform) и управление конфигурациями (Consul, etcd).
- Стоимость сети: при большом количестве узлов растут затраты на сетевое оборудование, межсоединения и трафик.
¶Примеры реализации
- Amazon Web Services (AWS): сервис Auto Scaling позволяет автоматически добавлять или удалять EC2-инстансы на основе CloudWatch-метрик. Балансировщик нагрузки (ALB/NLB) распределяет трафик.
- Kubernetes: встроенный механизм Horizontal Pod Autoscaler (HPA) масштабирует количество подов (контейнеров) на основе загрузки CPU или пользовательских метрик. Например, при увеличении числа запросов к веб-приложению HPA создаёт новые поды, а при снижении — удаляет.
- База данных Cassandra: данные шардируются по кольцевой топологии, каждый узел отвечает за определённый диапазон ключей. При добавлении нового узла данные автоматически перераспределяются.
- «Яндекс.Облако»: сервис Yandex Managed Service for Kubernetes поддерживает автомасштабирование групп узлов, а Yandex Load Balancer распределяет трафик между виртуальными машинами.
¶Интересные факты
- Закон Амдала: максимальное ускорение при горизонтальном масштабировании ограничено долей последовательного кода в программе. Если 10% операций не могут быть распараллелены, то даже при бесконечном количестве узлов ускорение не превысит 10 раз.
- Масштабирование до нуля: в облачных средах (AWS Lambda, Google Cloud Functions) возможно масштабирование до нуля узлов при отсутствии нагрузки, что снижает затраты до нуля.
- Термин «scale-out» впервые использован в 1990-х годах в контексте кластеров баз данных, а популяризирован компанией Google в 2000-х.
¶Критика
- Избыточность: горизонтальное масштабирование часто требует в 2–3 раза больше узлов, чем вертикальное, для достижения той же производительности из-за накладных расходов на координацию.
- Сложность отладки: распределённые системы сложнее отлаживать и тестировать, так как ошибки могут проявляться только при определённых условиях (гонки, тайм-ауты).
- Энергопотребление: при большом количестве узлов энергопотребление может быть выше, чем у одного мощного сервера, особенно если узлы не оптимизированы для низкого энергопотребления.
¶Источники
- Dean, J., Ghemawat, S. (2004). «MapReduce: Simplified Data Processing on Large Clusters». OSDI.
- Brewer, E. (2000). «Towards Robust Distributed Systems». PODC.
- Kleppmann, M. (2017). «Designing Data-Intensive Applications». O'Reilly Media.
- AWS Documentation (2024). «Amazon EC2 Auto Scaling».
- Kubernetes Documentation (2024). «Horizontal Pod Autoscaler».
- Cassandra Documentation (2024). «Data Distribution and Replication».
- Яндекс.Облако (2024). «Документация по Managed Service for Kubernetes».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


