Открыть сервис

Архитектура shared-nothing

Архитектура shared-nothing (архитектура без разделяемых ресурсов) — это подход к проектированию распределённых вычислительных систем, при котором каждый узел (нода) системы обладает собственными, полностью независимыми процессором, оперативной памятью и дисковым хранилищем. В такой архитектуре узлы не разделяют между собой никакие физические ресурсы и взаимодействуют исключительно через сеть, обмениваясь сообщениями. Ключевым принципом является то, что каждый узел обрабатывает только те данные, которые хранятся локально, и не имеет прямого доступа к памяти или дискам других узлов.

История и происхождение

Термин «shared-nothing» был введён Майклом Стоунбрейкером, одним из пионеров реляционных баз данных, в 1986 году в статье «The Case for Shared Nothing». Стоунбрейкер противопоставил эту архитектуру двум другим распространённым подходам: shared-memory (разделяемая память) и shared-disk (разделяемый диск). В shared-memory все процессоры имеют доступ к общей оперативной памяти, а в shared-disk — к общему дисковому массиву. Стоунбрейкер утверждал, что shared-nothing обеспечивает лучшую масштабируемость и более низкую стоимость, поскольку позволяет наращивать мощность системы путём добавления недорогих стандартных серверов, а не покупки дорогостоящего оборудования с общей памятью.

В 1990-х годах архитектура shared-nothing получила широкое распространение в системах управления базами данных (СУБД), таких как Teradata, Tandem NonStop SQL и Greenplum. С развитием интернета и больших данных в 2000-х годах этот подход стал основой для многих распределённых систем, включая Apache Hadoop, Apache Spark, Google Bigtable и Amazon DynamoDB.

Ключевые характеристики

Независимость узлов

Каждый узел в системе shared-nothing работает как автономный компьютер. Он имеет собственный процессор, оперативную память и дисковое хранилище. Узлы не зависят друг от друга в плане аппаратных ресурсов: отказ одного узла не влияет на работу других, за исключением потери данных, хранящихся на этом узле.

Сетевое взаимодействие

Единственным способом обмена данными между узлами является сеть. Узлы отправляют друг другу сообщения, запросы и результаты вычислений. Это накладывает ограничения на производительность, так как сетевое взаимодействие значительно медленнее, чем доступ к локальной памяти или диску.

Разделение данных

Данные в системе shared-nothing распределяются между узлами по определённому алгоритму, чаще всего по ключу (шардирование). Каждый узел отвечает за свою часть данных (шард). Запросы к данным обрабатываются на том узле, где эти данные хранятся. Если запрос требует данных с нескольких узлов, он разбивается на подзапросы, которые выполняются параллельно, а затем результаты агрегируются.

Горизонтальная масштабируемость

Основное преимущество архитектуры shared-nothing — возможность горизонтального масштабирования (scale-out). Для увеличения производительности или объёма хранимых данных достаточно добавить в кластер новые узлы. При этом не требуется заменять существующее оборудование или переписывать программное обеспечение. Теоретически, система может масштабироваться до тысяч узлов.

Классификация и варианты реализации

Чистый shared-nothing

В чистом виде каждый узел полностью независим и не имеет никаких общих ресурсов с другими узлами. Этот подход используется в системах, где требуется максимальная изоляция и отказоустойчивость, например, в некоторых распределённых базах данных.

Shared-nothing с репликацией

Для повышения надёжности и производительности чтения данные могут реплицироваться на несколько узлов. В этом случае каждый узел хранит не только свой шард, но и копии шардов других узлов. Репликация может быть синхронной (все копии обновляются одновременно) или асинхронной (обновление происходит с задержкой). Примеры: Apache Cassandra, Riak.

Shared-nothing в облачных вычислениях

Многие облачные сервисы, такие как Amazon S3, Google Cloud Storage и Azure Blob Storage, реализуют архитектуру shared-nothing на уровне хранения данных. Каждый объект хранится на нескольких узлах, но узлы не разделяют диски или память. Это обеспечивает высокую доступность и долговечность данных.

Применение

Системы управления базами данных (СУБД)

Архитектура shared-nothing является основой для многих распределённых СУБД, особенно тех, которые ориентированы на обработку больших объёмов данных (OLAP, аналитические системы). Примеры: Greenplum, Amazon Redshift, Google BigQuery, Snowflake. В этих системах данные шардируются по узлам, а запросы обрабатываются параллельно на всех узлах.

Системы обработки больших данных (Big Data)

Фреймворки, такие как Apache Hadoop (HDFS и MapReduce) и Apache Spark, используют архитектуру shared-nothing. Данные хранятся на узлах кластера, а вычислительные задачи выполняются на тех же узлах, где находятся данные (принцип data locality). Это минимизирует сетевой трафик и ускоряет обработку.

Кэширующие системы

Распределённые кэши, такие как Redis Cluster и Memcached, часто реализуют shared-nothing. Каждый узел хранит свою часть кэша, и клиенты обращаются к нужному узлу напрямую. Это позволяет достичь высокой производительности и низкой задержки.

Веб-серверы и приложения

В архитектуре веб-приложений shared-nothing может использоваться на уровне серверов приложений. Каждый сервер работает независимо, не разделяя сессионные данные или состояние. Для обеспечения согласованности состояния используется внешнее хранилище (например, база данных или распределённый кэш).

Преимущества и недостатки

Преимущества

  • Горизонтальная масштабируемость: возможность увеличивать производительность и ёмкость системы путём добавления узлов.
  • Низкая стоимость: использование стандартного, недорогого оборудования вместо специализированных систем с общей памятью.
  • Высокая отказоустойчивость: отказ одного узла не влияет на работу других узлов. При наличии репликации данные не теряются.
  • Простота проектирования: каждый узел работает независимо, что упрощает разработку и отладку распределённых алгоритмов.

Недостатки

  • Сложность управления данными: распределение данных, репликация, балансировка нагрузки и восстановление после сбоев требуют сложного программного обеспечения.
  • Сетевые задержки: взаимодействие между узлами происходит через сеть, что может быть медленнее, чем доступ к общей памяти.
  • Сложность выполнения транзакций: обеспечение ACID-транзакций в распределённой системе shared-nothing значительно сложнее, чем в централизованной. Часто приходится жертвовать согласованностью в пользу доступности (теорема CAP).
  • Неравномерное распределение данных: при неправильном выборе ключа шардирования некоторые узлы могут быть перегружены, в то время как другие простаивают.

Сравнение с другими архитектурами

Shared-memory (разделяемая память)

Все процессоры имеют доступ к общей оперативной памяти. Это упрощает программирование, так как все данные доступны всем процессорам. Однако масштабирование ограничено пропускной способностью шины памяти и стоимостью оборудования. Примеры: SMP-серверы, NUMA-архитектуры.

Shared-disk (разделяемый диск)

Все узлы имеют доступ к общему дисковому хранилищу (например, SAN или NAS). Каждый узел имеет собственную память, но диски общие. Это упрощает управление данными, но требует сложной координации доступа к дискам и может приводить к узким местам. Примеры: Oracle RAC, IBM DB2 PureScale.

Shared-nothing

Каждый узел полностью независим. Это обеспечивает наилучшую масштабируемость и отказоустойчивость, но требует сложного распределённого программного обеспечения. Примеры: Google Bigtable, Amazon DynamoDB, Apache Cassandra.

Примеры систем

  • Google Bigtable: распределённая система хранения данных, используемая для многих сервисов Google, включая поиск и карты. Данные шардируются по узлам, каждый узел хранит свою часть данных на локальных дисках.
  • Amazon DynamoDB: полностью управляемая NoSQL-база данных от Amazon Web Services. Использует архитектуру shared-nothing с репликацией данных по нескольким узлам для обеспечения высокой доступности и долговечности.
  • Apache Cassandra: распределённая NoSQL-база данных, разработанная в Facebook (продукт Meta, признанной экстремистской и запрещённой в РФ). Данные распределяются по узлам с использованием консистентного хеширования, каждый узел хранит свою часть данных и реплики других узлов.
  • Greenplum: реляционная СУБД, ориентированная на аналитическую обработку данных. Данные шардируются по сегментным узлам, а мастер-узел координирует выполнение запросов.
  • Apache Hadoop HDFS: распределённая файловая система, в которой файлы разбиваются на блоки, и каждый блок хранится на нескольких узлах (DataNode). NameNode управляет метаданными.

Интересные факты

  • Майкл Стоунбрейкер, введший термин «shared-nothing», получил премию Тьюринга в 2014 году за вклад в развитие систем управления базами данных.
  • Архитектура shared-nothing лежит в основе большинства современных облачных баз данных, таких как Amazon Aurora, Google Cloud Spanner и Azure Cosmos DB.
  • В некоторых системах, например, в Google Spanner, используется гибридный подход: shared-nothing на уровне хранения, но с синхронизацией времени через GPS и атомные часы для обеспечения глобальной согласованности.
  • Концепция shared-nothing также применяется в микросервисной архитектуре, где каждый микросервис имеет собственную базу данных и не разделяет её с другими сервисами.

Источники

  • Michael Stonebraker, «The Case for Shared Nothing», 1986.
  • Michael Stonebraker, «Readings in Database Systems», 4th Edition, 2005.
  • Dean, J., Ghemawat, S., «MapReduce: Simplified Data Processing on Large Clusters», 2004.
  • Chang, F., et al., «Bigtable: A Distributed Storage System for Structured Data», 2006.
  • DeCandia, G., et al., «Dynamo: Amazon’s Highly Available Key-value Store», 2007.
  • Lakshman, A., Malik, P., «Cassandra: A Decentralized Structured Storage System», 2010.
  • Corbett, J. C., et al., «Spanner: Google’s Globally-Distributed Database», 2012.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →