Разница между масштабированием по горизонтали и вертикали для баз данных
Я сталкивался со многими базами данных NoSQL и базами данных SQL. Существуют различные параметры для измерения силы и слабости этих баз данных, и масштабируемость является одним из них. В чем разница между горизонтальным и вертикальным масштабированием этих баз данных?
9 ответов
Горизонтальное масштабирование означает, что вы масштабируете, добавляя больше машин в ваш пул ресурсов, тогда как вертикальное масштабирование означает, что вы масштабируете, добавляя больше мощности (ЦП, ОЗУ) к существующей машине.
Простой способ запомнить это - подумать о машине в серверной стойке, мы добавляем больше машин в горизонтальном направлении и добавляем больше ресурсов в машину в вертикальном направлении.
В мире баз данных горизонтальное масштабирование часто основано на разделении данных, т.е. каждый узел содержит только часть данных, при вертикальном масштабировании данные находятся на одном узле, а масштабирование выполняется с помощью многоядерности, то есть распределения нагрузки между ресурсы процессора и оперативной памяти этой машины.
При горизонтальном масштабировании часто проще динамически масштабировать, добавляя больше машин в существующий пул. Вертикальное масштабирование часто ограничивается мощностью одной машины, масштабирование сверх этой емкости часто приводит к простою и имеет верхний предел.
Хорошими примерами горизонтального масштабирования являются Cassandra, MongoDB, Google Cloud Spanner... и хорошим примером вертикального масштабирования является MySQL - Amazon RDS (облачная версия MySQL). Он обеспечивает простой способ вертикального масштабирования путем переключения с небольших на большие машины. Этот процесс часто включает простои.
Сетки данных в памяти, такие как GigaSpaces XAP, Coherence и т. Д., Часто оптимизируются как для горизонтального, так и вертикального масштабирования просто потому, что они не привязаны к диску. Горизонтальное масштабирование с помощью разделения и вертикальное масштабирование благодаря поддержке многоядерных процессоров.
Вы можете прочитать больше на эту тему в моих предыдущих постах: Масштабирование против Масштабирования и Общие принципы позади альтернатив NOSQL
Простыми словами
масштабирование по горизонтали ===> Все тысячи миньонов вместе делают всю работу за вас
масштабирование по вертикали ===> Один большой халк сделает всю работу за вас.
Горизонтальная масштабируемость - это возможность увеличить емкость путем подключения нескольких аппаратных или программных объектов, чтобы они работали как единое логическое устройство.
Когда серверы кластеризованы, исходный сервер масштабируется по горизонтали. Если кластеру требуется больше ресурсов для повышения производительности и обеспечения высокой доступности (HA), администратор может масштабироваться, добавляя дополнительные серверы в кластер.
Важным преимуществом горизонтальной масштабируемости является то, что она может предоставить администраторам возможность наращивать емкость на лету. Другое преимущество состоит в том, что в теории горизонтальная масштабируемость ограничена только тем, сколько объектов может быть успешно подключено. Например, распределенная система хранения Cassandra работает на сотнях товарных узлов, распределенных по разным центрам обработки данных. Поскольку товарное оборудование масштабируется по горизонтали, Cassandra отказоустойчива и не имеет единой точки отказа (SPoF).
Вертикальная масштабируемость, с другой стороны, увеличивает емкость, добавляя к машине больше ресурсов, таких как больший объем памяти или дополнительный процессор. Вертикальное масштабирование, которое также называется масштабированием, обычно требует времени простоя, пока добавляются новые ресурсы, и имеет ограничения, которые определяются аппаратными средствами. Например, когда пользователям Amazon RDS необходимо масштабировать по вертикали, они могут переключаться с меньшего компьютера на больший, но самый большой экземпляр Amazon RDS имеет только 68 ГБ памяти.
Горизонтальное масштабирование имеет как преимущества, так и недостатки. Например, добавление недорогих обычных компьютеров в кластер может показаться экономически эффективным решением на первый взгляд, но для администратора важно знать, будут ли затраты на лицензирование для этих дополнительных серверов, дополнительные эксплуатационные расходы на питание и охлаждение и большая площадь, занимаемая ими в центре обработки данных, действительно делает горизонтальное масштабирование лучшим выбором, чем вертикальное.
Горизонтальное масштабирование - также называемое "масштабированием" - это, по сути, добавление большего количества машин или настройка кластера или распределенной среды для вашей программной системы. Обычно для этого требуется программа балансировки нагрузки, которая является промежуточным компонентом в стандартной трехуровневой архитектуре клиент-сервер.
Балансировщик нагрузки отвечает за распределение пользовательских запросов (нагрузки) между различными внутренними системами / машинами / узлами в кластере. Каждый из этих внутренних компьютеров запускает копию вашего программного обеспечения и, следовательно, способен обслуживать запросы. Это только одна из различных функций, которые может выполнять балансировщик нагрузки. Другой очень распространенной обязанностью является "проверка работоспособности", когда балансировщик нагрузки использует протокол "ping-echo" или обменивается сообщениями пульса со всеми серверами, чтобы убедиться, что они в порядке и работают нормально.
Балансировщик нагрузки распределяет нагрузку, поддерживая состояние каждой машины - сколько запросов обслуживается каждой машиной, какая машина простаивает, какая машина перегружена запросами в очереди и т. Д. Поэтому алгоритм балансировки нагрузки учитывает такие вещи перед перенаправлением запрос к соответствующему серверу машины. Он также учитывает нагрузку на сеть и может выбрать сервер в ближайшем дата-центре, если он доступен для обслуживания запросов.
Запрос-ответ также может быть выполнен двумя различными способами:
Балансировщик нагрузки всегда выступает в качестве промежуточной программы для каждого ответа. В этом случае, после того как запрос был передан на сервер балансировщиком нагрузки, любой ответ от сервера пользователю будет проходить через балансировщик нагрузки. Таким образом, серверные машины, которые фактически обслуживают запрос, никогда не будут напрямую взаимодействовать с пользовательским компьютером, на котором выполняется клиентское приложение. Машина, на которой размещена программа балансировки нагрузки, будет обрабатывать все запросы и ответы пользователя.
Балансировщик нагрузки не выступает в качестве посредника для ответов, поступающих от серверного компьютера. В этом случае, когда сервер получил запрос от балансировщика нагрузки, он обходит балансировщик нагрузки и передает свои ответы непосредственно клиенту.
Настройка кластера и балансировщика нагрузки в качестве интерфейсного интерфейса для клиентского приложения на самом деле не завершает нашу масштабную архитектуру и дизайн. Есть еще много важных вопросов, на которые нужно ответить, и ряд ключевых проектных решений, которые должны быть приняты, которые повлияют на общие свойства нашей системы.
Сначала мы должны определить наши бизнес-цели и области, в которых мы хотели бы добавить ценность. Эти цели породят различные требования. Затем мы должны задать себе различные вопросы относительно различных системных свойств.
Будет ли такой дизайн соответствовать нашим требованиям к производительности?
Какие рабочие характеристики нас интересуют? Это общая пропускная способность системы, в которой мы заинтересованы в том, чтобы обслуживать максимальное количество запросов в любой момент времени? Или это время отклика системы, когда мы планируем отправить ответ клиенту как можно быстрее? И эти, и многие другие типы характеристик производительности связаны друг с другом.
Будет ли такой дизайн соответствовать нашим требованиям доступности? Является ли система отказоустойчивой? Если так, то какова степень этого?
Надежен ли такой дизайн? Влияет ли это на правильность? Мы не должны забывать, что 100% правильность является неявной целью любой системы.
Действительно ли мы достигаем наших целей по масштабируемости? Может быть, достижение краткосрочных или немедленных, но что произойдет в долгосрочной перспективе?
Все эти виды требований должны иметь количественные меры, связанные с ними.
Затем мы должны принять важные дизайнерские решения, задавая вопросы, разрабатывая прототипы и улучшая дизайн.
Во-первых, является ли использование балансировщика нагрузки единственным подходом для распределения нагрузки и горизонтального масштабирования системы?
Связаны ли различные внутренние серверы или узлы друг с другом? Если да, то как система справляется с ситуацией, когда один или несколько узлов выходят из строя - постоянно или временно? Если да, то как система решает ситуацию, когда сеть, соединяющая узлы, не работает, но все узлы работают и работают? Самое главное, должны ли мы различать эти две ситуации? Как?
- Независимо от того, взаимодействуют ли внутренние узлы друг с другом, должна ли наша система поддерживать согласованные данные на всех узлах? Какой уровень согласованности нам небезразличен? В любой момент времени данные на всех узлах должны быть согласованными. Или позже в какой-то момент времени данные по всем узлам будут согласованными. Если так, то что это за "позже"? Когда и как все узлы сходятся в согласованное состояние? Как мы добьемся "полного порядка" операций на всех узлах? У нас есть глобальные часы? Если мы полагаемся на локальные часы каждого узла, то как мы синхронизируем часы всех машин? Может показаться, что они регрессируют, или машина с неработающими часами может присоединиться к кластеру. Как следствие, мы можем игнорировать последние данные и считать старые / устаревшие данные самыми последними.
- Для какой настройки кластера мы должны разработать? Это кластер "реплики", где данные на каждом узле реплицируются на некоторый или на любой другой узел. В первом случае, каков фактор репликации и как мы его решаем? Или это осколочный кластер, где кластер делится на различные осколки или единицы. Осколок - это назначенная группа узлов. Каждый осколок заботится о конкретном разделе данных. Данные через сегменты не реплицируются, но каждый фрагмент может использовать стратегию репликации внутри себя. Какую бы распределенную систему мы ни проектировали, в идеале она должна быть в состоянии ответить на вышеперечисленные и многие другие подобные вопросы.
Все это делает распределенную систему настолько интересной и сложной для проектирования и реализации.
Вертикальное масштабирование - также называемый подходом "масштабирования" - это попытка увеличить мощность одного компьютера: путем увеличения вычислительной мощности, увеличения объема памяти, увеличения объема памяти и т. Д.
Здесь важно понять различия между этими двумя подходами масштабирования, определить, что соответствует нашим требованиям, и посмотреть, действительно ли приложение соответствует выбранной нами модели.
Как вы уже поняли, горизонтальное масштабирование сопряжено с накладными расходами в виде затрат и сложностей, связанных с настройкой, управлением и обслуживанием кластера. Дизайн становится все более сложным, и модель программирования меняется.
Так что просто добавить новое оборудование и добавить больше узлов или машин - не самый лучший способ начать. Во-первых, посмотрите, можно ли выполнить требования, увеличив производительность или настройку характеристик одной машины. Если нет, то используйте метод горизонтального масштабирования или их комбинацию.
Давайте начнем с необходимости масштабирования, которое увеличивает ресурсы, чтобы ваша система теперь могла обрабатывать больше запросов, чем раньше.
Когда вы понимаете, что ваша система работает медленно и не может обработать текущее количество запросов, вам необходимо масштабировать систему.
Это дает вам два варианта. Либо вы увеличиваете ресурсы на сервере, который используете в данный момент, то есть увеличиваете объем оперативной памяти, процессора, графического процессора и других ресурсов. Это известно как вертикальное масштабирование.
Вертикальное масштабирование обычно является дорогостоящим. Это не делает систему отказоустойчивой, т. Е. Если вы масштабируете приложение, работающее с одним сервером, если этот сервер выходит из строя, ваша система выключается. Также количество потоков остается неизменным при вертикальном масштабировании. Вертикальное масштабирование может потребовать выключения вашей системы в тот момент, когда происходит процесс. Увеличение ресурсов на сервере требует перезагрузки и выключения вашей системы.
Другое решение этой проблемы - увеличение количества серверов, присутствующих в системе. Это решение широко используется в технологической отрасли. Это в конечном итоге уменьшит частоту запросов в секунду на каждом сервере. Если вам нужно масштабировать систему, просто добавьте другой сервер, и все готово. Вам не потребуется перезагружать систему. Количество потоков в каждой системе уменьшается, что приводит к высокой пропускной способности. Чтобы разделить запросы одинаково для каждого сервера приложений, вам необходимо добавить балансировщик нагрузки, который будет работать в качестве обратного прокси-сервера для веб-серверов. Вся эта система может называться одним кластером. Ваша система может содержать большое количество запросов, которые требуют большего количества кластеров, подобных этому.
Надеюсь, вы получите всю концепцию внедрения масштабирования в систему.
Существует еще одна архитектура, которая не была упомянута - это службы баз данных на основе SQL, которые обеспечивают горизонтальное масштабирование без сложного разделения вручную. Эти сервисы выполняют сегментирование в фоновом режиме, поэтому они позволяют запускать традиционную базу данных SQL и масштабироваться, как если бы вы работали с механизмами NoSQL, такими как MongoDB или CouchDB. Мне знакомы две службы: EnterpriseDB для PostgreSQL и Xeround для MySQL. Я видел подробное сообщение от Xeround, в котором объясняется, почему масштабирование в базах данных SQL сложно и как они делают это по-разному - относитесь к этому с недолгой солью, поскольку это пост поставщика. Также ознакомьтесь со статьей в Википедии о облачной базе данных, там есть хорошее объяснение SQL против NoSQL и сервиса против собственного размещения, список поставщиков и опции масштабирования для каждой комбинации.;)
Да, горизонтальное масштабирование означает добавление большего количества машин, но это также означает, что машины в кластере равны. MySQL может масштабироваться горизонтально с точки зрения чтения данных с помощью реплик, но как только он достигнет емкости сервера mem/disk, вы должны начать разделять данные между серверами. Это становится все более сложным. Часто поддержание согласованности данных между репликами является проблемой, поскольку скорость репликации часто слишком низкая, чтобы не отставать от скорости изменения данных.
Couchbase также является фантастической базой данных горизонтального масштабирования NoSQL, используемой во многих коммерческих приложениях и играх с высокой доступностью и, возможно, самой высокой производительностью в категории. Он автоматически распределяет данные по кластеру, добавляя узлы несложно, и вы можете использовать обычное оборудование, более дешевые экземпляры VM (например, Large вместо High Mem, High Disk на AWS). Он построен на основе Membase (Memcached), но добавляет постоянство. Кроме того, в случае Couchbase каждый узел может выполнять операции чтения и записи и являются равными в кластере с единственной отказоустойчивой репликацией (не полная репликация набора данных на всех серверах, как в mySQL).
Что касается производительности, вы можете увидеть отличный тест Cisco: http://blog.couchbase.com/understanding-performance-benchmark-published-cisco-and-solarflare-using-couchbase-server
Вот отличный пост в блоге об архитектуре Couchbase: http://horicky.blogspot.com/2012/07/couchbase-architecture.html
Традиционные реляционные базы данных, разработанные как системы клиент-серверных баз данных. Они могут быть масштабированы по горизонтали, но этот процесс сложен и подвержен ошибкам. Базы данных NewSQL, такие как NuoDB, являются распределенными системами баз данных, ориентированными на память, и предназначены для горизонтального масштабирования при сохранении свойств SQL/ACID традиционных СУБД.
Для получения дополнительной информации о NuoDB, прочитайте их технический документ по адресу http://goo.gl/uzLIWB.
Базы данных SQL, такие как Oracle, db2, также поддерживают горизонтальное масштабирование через кластер с общим диском. Например, Oracle RAC, IBM DB2 purescale или Sybase ASE Cluster edition. Новый узел можно добавить в систему Oracle RAC или систему DB2 Purescale для достижения горизонтального масштабирования.
Но подход отличается от баз данных noSQL (таких как mongodb, CouchDB или IBM Cloudant) тем, что разделение данных не является частью горизонтального масштабирования. В базах данных noSQL данные затеняются при горизонтальном масштабировании.
Принятый ответ - это базовое определение горизонтального и вертикального масштабирования. Но в отличие от распространенного мнения, что горизонтальное масштабирование баз данных возможно только с Cassandra, MongoDB и т.д., я хотел бы добавить, что горизонтальное масштабирование также очень возможно с любой традиционной RDMS; это тоже без использования сторонних решений.
Я знаю много компаний, особенно SaaS, которые этим занимаются. Это делается с помощью простой логики приложения. Вы в основном берете набор пользователей и делите их на несколько серверов БД. Так, например, у вас обычно есть "мета" база данных / таблица, в которой будут храниться клиенты, серверы БД / строки подключения и т. Д., И таблица, в которой хранятся сопоставления клиент / сервер.
Затем просто направьте запросы от каждого клиента на сервер БД, которому они сопоставлены.
Некоторые могут сказать, что это похоже на горизонтальное разбиение, а не на "истинное" горизонтальное масштабирование, и в некотором смысле они будут правы. Но в конечном итоге вы масштабировали свою БД на несколько серверов БД.
Единственное различие между двумя подходами к горизонтальному масштабированию состоит в том, что при одном подходе (MongoDB и т. Д.) Масштабирование выполняется самим программным обеспечением БД. В этом смысле вы "покупаете" масштабирование. В другом подходе (для горизонтального масштабирования РСУБД) масштабирование создается кодом / логикой приложения.
Все остальные ответы кажутся уже достаточно полными, но я не видел Google Cloud Spanner в качестве примера реляционной базы данных с горизонтальным масштабированием, поэтому я добавляю свой небольшой вклад.
Добавление большого количества балансировщиков нагрузки создает дополнительные издержки и задержку, что является недостатком горизонтального масштабирования в базах данных nosql. Это как вопрос, почему люди говорят, что RPC не рекомендуется, поскольку он не является надежным.
Я думаю, что в реальной системе мы должны использовать базы данных sql и nosql, чтобы использовать возможности современных многоядерных и облачных вычислений.
С другой стороны, сложные транзакционные запросы имеют высокую производительность, если используются базы данных sql, такие как oracle. NoSql может быть использован для больших данных и горизонтальной масштабируемости путем шардинга.
У вас есть компания и всего 1 работник, но у вас есть 1 новый проект, когда вы нанимаете нового кандидата - это горизонтальное масштабирование. где новый кандидат - это новые машины, а проект - это новый трафик / вызовы вашего api.
Где как 1 проект с парнем из IIT/NIT, обрабатывающим все запросы к вашему api/traffic. Если в любой момент к вашему api будет поступать еще один запрос, уволите его и замените парнем с высоким IQ NIT/IIT - это вертикальное масштабирование.