Проектирование системы - горизонтальное и вертикальное масштабирование
Если вы разработчик, то создание веб-сайта и его дальнейшее обслуживание может быть для вас самым приятным делом. В конце концов, вы много работали и пытались создать что-то ценное для пользователей. Когда вы видите, что огромное количество пользователей начали использовать ваш проект, и день за днем их число растет, вы действительно чувствуете себя потрясающе и начинаете думать о том, чтобы вывести свои услуги на новый уровень. Вам приятно видеть растущее число пользователей, но вскоре вы понимаете, что ваша система или сервер больше не может обрабатывать такие объемы запросов и может перестать отвечать в любой момент. Теперь вам нужно найти решение для масштабирования вашего приложения и обработки огромного количества запросов. Как бы вы решили эту проблему? Какой подход вы будете использовать для масштабирования приложения?
Неважно, в какой компании вы работаете или какой веб-сайт вы создаете, большую часть времени вы будете сталкиваться с подобным сценарием, и, будучи разработчиком, вы обязаны найти решение этой проблемы. Вам нужно будет расширить доступность, мощность и присутствие вашего приложения. Вы можете решить эту проблему, добавив дополнительное оборудование или обновив текущую конфигурацию системы, что называется масштабируемостью. В этой статье мы поговорим о масштабировании приложения, которое также является важной концепцией цикла собеседований по проектированию системы. Если ваша цель - попасть в крупную технологическую компанию-гиганта, вам следует очень хорошо знать эту концепцию для прохождения собеседования.
Варианты масштабирования приложения можно разделить на две основные категории:
- Вертикальное масштабирование
- Горизонтальное масштабирование
1. Вертикальное масштабирование
Проще говоря, увеличение мощности одного мервера или переход на новый сервер с большей мощностью называется вертикальным масштабированием. Вы можете увеличить мощность своего сервера, добавив более совершенные процессоры, увеличив объем оперативной памяти или используя другие настройки для увеличения мощности. Вертикального масштабирования можно легко добиться, переключившись с маленьких серверов на большие, но помните, что это влечет за собой простои. Вы можете расширить возможности своего сервера, не внося изменений в код.
- Этот подход также называют подходом «увеличения масштаба».
- При этом не требуется никакого разделения данных, и весь трафик находится на одном узле с большей емкостью.
- Простая реализация.
- Меньше административных усилий, так как вам нужно управлять только одной системой.
- Совместимость приложений сохраняется.
- В основном используется в малых и средних компаниях.
- MySQL и Amazon RDS - хороший пример вертикального масштабирования.
Недостатки
- Ограниченное масштабирование.
- Ограниченный потенциал для улучшения сетевого ввода-вывода или дискового ввода-вывода.
- При таком подходе замена сервера потребует простоя.
- Повышенный риск простоев и отказов оборудования.
- Конечные возможности модернизации в будущем.
- Стоимость внедрения дорогая.
2. Горизонтальное масштабирование
Этот подход - лучшее решение для проектов, которым требуется высокая доступность или отказоустойчивость. При горизонтальном масштабировании мы повышаем производительность сервера, добавляя больше машин в сеть, разделяя рабочую нагрузку обработки и памяти между несколькими устройствами. Мы просто добавляем дополнительные экземпляры сервера к существующему пулу серверов и распределяем нагрузку между этими серверами. При таком подходе нет необходимости изменять мощность сервера или заменять сервер. Кроме того, как и при вертикальном масштабировании, при добавлении дополнительных серверов в сеть нет простоев. Большинство организаций выбирают этот подход, потому что он включает увеличение параллелизма ввода-вывода, снижение нагрузки на существующие узлы и увеличение емкости диска.
- Этот подход также называют подходом «горизонтального масштабирования».
- Горизонтальная масштабируемость может быть достигнута с помощью распределенной файловой системы, кластеризации и балансировки нагрузки.
- Движением можно эффективно управлять.
- Проще добиться отказоустойчивости.
- Легко обновить.
- Мгновенная и постоянная доступность.
- Легко изменить размер и размер в соответствии с вашими потребностями.
- Стоимость внедрения меньше по сравнению с вертикальным масштабированием.
- Google с его Gmail и YouTube, Yahoo, Facebook, eBay, Amazon и т.д. Активно используют горизонтальное масштабирование.
- Cassandra и MongoDB - хороший пример вертикального масштабирования.
Недостатки
- Сложный архитектурный дизайн.
- Высокие лицензионные сборы.
- Высокие расходы на сервера.
- Требоуется дополнительное сетевое оборудование, такое как маршрутизаторы и коммутаторы.
Краткое сравнение
Мы рассмотрели принцип работы двух основных способов масштабирования приложений. Мы также рассказали некоторые плюсы и минусы каждого из них. Давайте теперь сравним эти два подхода на основе их плюсов и минусов:
Горизонтальное масштабирование |
Вертикальное масштабирование |
---|---|
Требуется балансировка нагрузки | Балансировка нагрузки не требуется |
Устойчивость к системным сбоям | Единая точка отказа |
Использует сетевые вызовы | Межпроцессное взаимодействие |
Несогласованность данных | Данные согласованы |
Хорошо масштабируется | Предел оборудования |
- Балансировка нагрузки: горизонтальное масштабирование требует балансировки нагрузки для распределения трафика между несколькими машинами. В вертикальной машине есть только одна машина для обработки груза, поэтому ей не требуется балансировщик нагрузки.
- Устойчивость к сбоям : горизонтальное масштабирование более устойчиво к сбоям системы. Если одна из машин выходит из строя, вы можете перенаправить запрос на другую машину, и в приложении не будет простой. Однако, этого не получится в случае вертикального масштабирования, у него всего один сервер, поэтому при появлении проблем это может статьть точкой отказа. Все это означает, что при горизонтальном масштабировании вы можете достичь отсутствия простоев, но при вертикальном масштабировании DB все еще работает на одном устройстве, поэтому это никак не повысит доступность приложения.
- Машинная связь: горизонтальное масштабирование требует сетевой связи или вызовов между серверами. Сетевые вызовы медленные и более подвержены сбоям. Этого не будет в случае вертикального масштабирования. Вертикальное масштабирование работает при межпроцессном взаимодействии, которое происходит довольно быстро.
- Согласованность данных: данные несовместимы при горизонтальном масштабировании, потому что разные сервера обрабатывают разные запросы, что может привести к рассинхронизации данных, которые необходимо адресовать. С другой стороны, вертикальные машины имеют только однин сервер, на который будут перенаправляться все запросы, поэтому при вертикальном масштабировании нет проблемы несогласованности данных.
- Ограничения: в зависимости от бюджета, места или требований вы можете добавить столько серверов, сколько захотите, при горизонтальном масштабировании и масштабировать свое приложение столько, сколько захотите. Однако, это не получится сделать в случае вертикального масштабирования. Существует конечный предел емкости, достижимой при вертикальном масштабировании. Масштабирование сверх этой емкости приводит к простою и имеет верхний предел. Таким образом, отдельную машину можно улучшать только до тех пор, пока она не достигнет нынешних ограничений вычислительной мощности.
Какой из них подходит для приложения?
После четкого понимания обоих вариантов мы можем видеть, что у обоих есть свои плюсы и минусы. Всегда будут некоторые компромиссы, поэтому разработчикам может быть немного сложнее решить, какой из них лучше для приложения. Здесь нужно принять разумное решение. Во-первых, вы должны определить свои требования, бизнес-цели и области, в которых мы хотели бы повысить ценность. Затем принимайте важные дизайнерские решения, задавая вопросы самим себе, разрабатывая прототипы и улучшая дизайн. Для лучшего понимания бизнес-целей или требований важно учитывать определенные факторы. Ниже мы привели некоторые из них:
- Требования к производительности или характеристики производительности приложения.
- Пропускная способность системы.
- Время отклика системы.
- Требование доступности системы.
- Отказоустойчива ли система? Если да, то до какой степени?
- Надежна ли конструкция?
- Какой уровень согласованности данных нас интересует?
- Какова цель масштабируемости приложения (у вас может быть какая-то краткосрочная или ближайшая цель, но что произойдет в долгосрочной перспективе?)
Все вышеперечисленные факторы помогут вам определить бизнес-цель и требования к вашему приложению. Какой бы вариант вы ни выбрали, в идеале он должен отвечать на вышеуказанные и многие другие подобные вопросы. У вас должно быть четкое понимание различий между этими двумя подходами к масштабированию. Определите, что соответствует вашим требованиям, и посмотрите, действительно ли приложение соответствует выбранной вами модели. Если ваша цель - добиться высочайшей производительности, вы можете использовать вертикальное масштабирование или горизонтальное масштабирование либо и то, и другое в облачной среде.
Если вам интересно узнать, что крупные технологические компании используют при масштабировании своих систем, то ответ будет и тем, и другим. Большую часть времени в крупных организациях инженеры используют хорошие качества вертикального масштабирования и некоторые хорошие качества горизонтального масштабирования. Они следуют гибридному подходу, сочетающему скорость и согласованность вертикального масштабирования с гибкостью и бесконечной масштабируемостью горизонтального масштабирования.
Простое добавление нового оборудования и добавление дополнительных узлов или машин - не лучший вариант. Прежде чем принимать решение, вы должны внимательно соблюдать требования вашего приложения. Если требования могут быть выполнены за счет увеличения производительности или настройки характеристик отдельной машины, тогда используйте вертикальное масштабирование (особенно для стартапов), но как только пользователи начнут быстро расти и вам потребуется часто заменять систему, используйте горизонтальное масштабирование или их комбинация.