Распределенные вычисления — это область компьютерной науки , изучающая распределенные системы , определяемые как компьютерные системы , взаимодействующие компоненты которых расположены на разных сетевых компьютерах . [1] [2]
Компоненты распределенной системы взаимодействуют и координируют свои действия, передавая сообщения друг другу для достижения общей цели. Три существенные проблемы распределенных систем: поддержание параллелизма компонентов, преодоление отсутствия глобальных часов и управление независимыми отказами компонентов. [1] Когда компонент одной системы выходит из строя, вся система не выходит из строя. [3] Примеры распределенных систем варьируются от систем на основе SOA до микросервисов , многопользовательских онлайн-игр и одноранговых приложений . Распределенные системы стоят значительно дороже монолитных архитектур, в первую очередь из-за возросших потребностей в дополнительном оборудовании, серверах, шлюзах, брандмауэрах, новых подсетях, прокси-серверах и т. д. [4] Кроме того, распределенные системы подвержены ошибкам распределенных вычислений . С другой стороны, хорошо спроектированная распределенная система более масштабируема, более долговечна, более изменчива и более точно настроена, чем монолитное приложение, развернутое на одной машине. [5] По словам Марка Брукера: «система масштабируется в диапазоне, где предельная стоимость дополнительной рабочей нагрузки почти постоянна». Бессерверные технологии соответствуют этому определению, но вам нужно учитывать общую стоимость владения, а не только стоимость инфраструктуры. [6]
Компьютерная программа , которая работает в распределенной системе, называется распределенной программой , [7] а распределенное программирование — это процесс написания таких программ. [8] Существует множество различных типов реализаций механизма передачи сообщений, включая чистый HTTP, RPC-подобные коннекторы и очереди сообщений . [9]
Распределенные вычисления также относятся к использованию распределенных систем для решения вычислительных задач. В распределенных вычислениях проблема делится на множество задач, каждая из которых решается одним или несколькими компьютерами, [10] которые взаимодействуют друг с другом посредством передачи сообщений. [11]
Слово «распределенный» в таких терминах, как «распределенная система», «распределенное программирование» и « распределенный алгоритм », изначально относилось к компьютерным сетям, в которых отдельные компьютеры были физически распределены в пределах некоторой географической области. [12] В настоящее время эти термины используются в гораздо более широком смысле, даже ссылаясь на автономные процессы , которые работают на одном и том же физическом компьютере и взаимодействуют друг с другом посредством передачи сообщений. [11]
Хотя единого определения распределенной системы не существует, [13] обычно используются следующие определяющие свойства:
Распределенная система может иметь общую цель, например, решение большой вычислительной задачи; [16] тогда пользователь воспринимает набор автономных процессоров как единое целое. В качестве альтернативы, каждый компьютер может иметь своего собственного пользователя с индивидуальными потребностями, и цель распределенной системы — координировать использование общих ресурсов или предоставлять услуги связи пользователям. [17]
К другим типичным свойствам распределенных систем относятся следующие:
Вот общие архитектурные шаблоны , используемые для распределенных вычислений: [21]
Распределенные системы — это группы сетевых компьютеров, которые имеют общую цель для своей работы. Термины « одновременные вычисления », « параллельные вычисления » и «распределенные вычисления» во многом совпадают, и между ними нет четкого различия. [22] Одна и та же система может быть охарактеризована как «параллельная» и «распределенная»; процессоры в типичной распределенной системе работают одновременно и параллельно. [23] Параллельные вычисления можно рассматривать как особенно тесно связанную форму распределенных вычислений, [24] а распределенные вычисления можно рассматривать как слабо связанную форму параллельных вычислений. [13] Тем не менее, можно грубо классифицировать параллельные системы как «параллельные» или «распределенные», используя следующие критерии:
Рисунок справа иллюстрирует разницу между распределенными и параллельными системами. Рисунок (a) представляет собой схематическое изображение типичной распределенной системы; система представлена в виде сетевой топологии, в которой каждый узел является компьютером, а каждая линия, соединяющая узлы, является каналом связи. Рисунок (b) показывает ту же распределенную систему более подробно: каждый компьютер имеет свою собственную локальную память, и обмен информацией может осуществляться только путем передачи сообщений от одного узла к другому с использованием имеющихся каналов связи. Рисунок (c) показывает параллельную систему, в которой каждый процессор имеет прямой доступ к общей памяти.
Ситуация еще больше осложняется традиционным использованием терминов параллельный и распределенный алгоритм , которые не совсем соответствуют приведенным выше определениям параллельных и распределенных систем (см. ниже более подробное обсуждение). Тем не менее, как правило, высокопроизводительные параллельные вычисления в многопроцессорной системе с общей памятью используют параллельные алгоритмы, в то время как координация крупномасштабной распределенной системы использует распределенные алгоритмы. [27]
Использование параллельных процессов, которые взаимодействуют посредством передачи сообщений, берет свое начало в архитектурах операционных систем, изученных в 1960-х годах. [28] Первыми широко распространенными распределенными системами были локальные сети , такие как Ethernet , изобретенный в 1970-х годах. [29]
ARPANET , один из предшественников Интернета , был представлен в конце 1960-х годов, а электронная почта ARPANET была изобретена в начале 1970-х годов. Электронная почта стала самым успешным применением ARPANET, [30] и, вероятно, является самым ранним примером крупномасштабного распределенного приложения . В дополнение к ARPANET (и его преемнику, глобальному Интернету), другие ранние всемирные компьютерные сети включали Usenet и FidoNet с 1980-х годов, обе из которых использовались для поддержки распределенных дискуссионных систем. [31]
Изучение распределенных вычислений стало отдельной отраслью компьютерной науки в конце 1970-х и начале 1980-х годов. Первая конференция в этой области, Симпозиум по принципам распределенных вычислений (PODC), датируется 1982 годом, а ее аналог Международный симпозиум по распределенным вычислениям (DISC) впервые был проведен в Оттаве в 1985 году как Международный семинар по распределенным алгоритмам на графах. [32]
Для распределенных вычислений используются различные аппаратные и программные архитектуры. На более низком уровне необходимо соединить несколько процессоров с помощью какой-либо сети, независимо от того, напечатана ли эта сеть на печатной плате или состоит из слабосвязанных устройств и кабелей. На более высоком уровне необходимо соединить процессы, работающие на этих процессорах, с помощью какой-либо системы связи . [33]
То, совместно используют ли эти процессоры ресурсы или нет, определяет первое различие между тремя типами архитектуры:
Распределенное программирование обычно относится к одной из нескольких основных архитектур: клиент-серверная , трехуровневая , n- уровневая или одноранговая ; или категориям: слабая связь или жесткая связь . [34]
Другим основным аспектом архитектуры распределенных вычислений является метод коммуникации и координации работы между параллельными процессами. С помощью различных протоколов передачи сообщений процессы могут напрямую взаимодействовать друг с другом, как правило, в отношении «главный/подчиненный». В качестве альтернативы, «база-центрированная» архитектура может позволить выполнять распределенные вычисления без какой-либо формы прямой межпроцессной коммуникации , используя общую базу данных . [37] База-центрированная архитектура, в частности, обеспечивает аналитику реляционной обработки в схематической архитектуре, допускающей ретрансляцию в реальном времени. Это позволяет выполнять функции распределенных вычислений как внутри, так и за пределами параметров сетевой базы данных. [38]
Причины использования распределенных систем и распределенных вычислений могут включать:
Примеры распределенных систем и приложений распределенных вычислений включают следующее: [40]
Согласно Reactive Manifesto, реактивные распределенные системы отзывчивы, устойчивы, эластичны и управляются сообщениями. Соответственно, реактивные системы более гибкие, слабосвязанные и масштабируемые. Чтобы сделать ваши системы реактивными, вам рекомендуется реализовать Reactive Principles. Reactive Principles — это набор принципов и шаблонов, которые помогают сделать ваше облачное приложение, а также граничные собственные приложения более реактивными. [42]
Многие задачи, которые мы хотели бы автоматизировать с помощью компьютера, относятся к типу вопрос-ответ: мы хотели бы задать вопрос, а компьютер должен выдать ответ. В теоретической информатике такие задачи называются вычислительными задачами . Формально вычислительная задача состоит из экземпляров вместе с решением для каждого экземпляра. Экземпляры — это вопросы, которые мы можем задать, а решения — это желаемые ответы на эти вопросы.
Теоретическая информатика стремится понять, какие вычислительные проблемы могут быть решены с помощью компьютера ( теория вычислимости ) и насколько эффективно ( теория вычислительной сложности ). Традиционно считается, что проблема может быть решена с помощью компьютера, если мы можем разработать алгоритм , который выдает правильное решение для любого заданного примера. Такой алгоритм может быть реализован как компьютерная программа , которая работает на компьютере общего назначения: программа считывает экземпляр проблемы из входных данных , выполняет некоторые вычисления и выдает решение в качестве выходных данных . Такие формализмы, как машины с произвольным доступом или универсальные машины Тьюринга, могут использоваться как абстрактные модели последовательного компьютера общего назначения, выполняющего такой алгоритм. [43] [44]
Область параллельных и распределенных вычислений изучает схожие вопросы в случае как нескольких компьютеров, так и компьютера, который выполняет сеть взаимодействующих процессов: какие вычислительные задачи могут быть решены в такой сети и насколько эффективно? Однако совсем не очевидно, что подразумевается под «решением проблемы» в случае параллельной или распределенной системы: например, какова задача разработчика алгоритма, и что является параллельным или распределенным эквивалентом последовательного компьютера общего назначения? [ необходима цитата ]
Ниже рассматривается случай с несколькими компьютерами, хотя многие проблемы остаются теми же и для параллельных процессов, работающих на одном компьютере.
Обычно используются три точки зрения:
В случае распределенных алгоритмов вычислительные проблемы обычно связаны с графами. Часто граф, описывающий структуру компьютерной сети, является экземпляром проблемы. Это проиллюстрировано в следующем примере. [49]
Рассмотрим вычислительную задачу нахождения раскраски заданного графа G. Различные области могут использовать следующие подходы:
Хотя область параллельных алгоритмов имеет другую направленность, чем область распределенных алгоритмов, между этими двумя областями существует много взаимодействия. Например, алгоритм Коула–Вишкина для раскраски графов [50] изначально был представлен как параллельный алгоритм, но тот же метод может также использоваться напрямую как распределенный алгоритм.
Более того, параллельный алгоритм может быть реализован либо в параллельной системе (используя общую память), либо в распределенной системе (используя передачу сообщений). [51] Традиционная граница между параллельными и распределенными алгоритмами (выбор подходящей сети против запуска в любой заданной сети) не проходит там же, где граница между параллельными и распределенными системами (общая память против передачи сообщений).
В параллельных алгоритмах еще одним ресурсом в дополнение к времени и пространству является количество компьютеров. Действительно, часто существует компромисс между временем выполнения и количеством компьютеров: задача может быть решена быстрее, если больше компьютеров работает параллельно (см. ускорение ). Если задача принятия решения может быть решена за полилогарифмическое время с использованием полиномиального числа процессоров, то говорят, что задача находится в классе NC . [52] Класс NC может быть определен одинаково хорошо с использованием формализма PRAM или булевых схем — машины PRAM могут эффективно моделировать булевы схемы и наоборот. [53]
При анализе распределенных алгоритмов больше внимания обычно уделяется операциям связи, чем вычислительным шагам. Возможно, самая простая модель распределенных вычислений — это синхронная система, в которой все узлы работают в режиме lockstep. Эта модель обычно известна как модель LOCAL. Во время каждого раунда связи все узлы параллельно (1) получают последние сообщения от своих соседей, (2) выполняют произвольные локальные вычисления и (3) отправляют новые сообщения своим соседям. В таких системах центральной мерой сложности является количество синхронных раундов связи, необходимых для выполнения задачи. [54]
Эта мера сложности тесно связана с диаметром сети. Пусть D будет диаметром сети. С одной стороны, любая вычислимая задача может быть решена тривиально в синхронной распределенной системе примерно за 2 D раунда связи: просто соберите всю информацию в одном месте ( D раундов), решите задачу и сообщите каждому узлу о решении ( D раундов).
С другой стороны, если время выполнения алгоритма намного меньше, чем D раундов связи, то узлы в сети должны производить свой вывод, не имея возможности получить информацию об удаленных частях сети. Другими словами, узлы должны принимать глобально согласованные решения на основе информации, которая доступна в их локальном D-соседстве . Известно много распределенных алгоритмов со временем выполнения намного меньше, чем D раундов, и понимание того, какие проблемы могут быть решены такими алгоритмами, является одним из центральных исследовательских вопросов в этой области. [55] Обычно алгоритм, который решает проблему за полилогарифмическое время в размере сети, считается эффективным в этой модели.
Другой часто используемой мерой является общее количество битов, переданных в сети (ср. сложность связи ). [56] Особенности этой концепции обычно отражаются в модели CONGEST(B), которая определяется аналогично модели LOCAL, но в которой отдельные сообщения могут содержать только B битов.
Традиционные вычислительные задачи предполагают, что пользователь задает вопрос, компьютер (или распределенная система) обрабатывает вопрос, затем выдает ответ и останавливается. Однако существуют также задачи, в которых система не должна останавливаться, включая задачу обедающих философов и другие подобные задачи взаимного исключения . В этих задачах распределенная система должна непрерывно координировать использование общих ресурсов, чтобы не возникало конфликтов или тупиков .
Существуют также фундаментальные проблемы, которые являются уникальными для распределенных вычислений, например, те, которые связаны с отказоустойчивостью . Примерами связанных проблем являются проблемы консенсуса , [57] византийская отказоустойчивость , [58] и самостабилизация . [59]
Многие исследования также сосредоточены на понимании асинхронной природы распределенных систем:
Обратите внимание, что в распределенных системах задержка должна измеряться с помощью «99-го процентиля», поскольку «медиана» и «среднее» могут вводить в заблуждение. [63]
Выборы координатора (или лидера ) — это процесс назначения одного процесса организатором некоторой задачи, распределенной между несколькими компьютерами (узлами). До начала выполнения задачи все узлы сети либо не знают, какой узел будет выполнять функции «координатора» (или лидера) задачи, либо не могут связаться с текущим координатором. Однако после запуска алгоритма выборов координатора каждый узел в сети распознает определенный, уникальный узел как координатора задачи. [64]
Узлы сети общаются между собой, чтобы решить, кто из них попадет в состояние «координатора». Для этого им нужен какой-то метод, чтобы нарушить симметрию между ними. Например, если каждый узел имеет уникальные и сопоставимые идентификаторы, то узлы могут сравнить свои идентификаторы и решить, что узел с наивысшим идентификатором является координатором. [64]
Определение этой проблемы часто приписывают ЛеЛанну, который формализовал ее как метод создания нового токена в сети Token Ring , в которой токен был утерян. [65]
Алгоритмы выборов координатора разработаны так, чтобы быть экономичными с точки зрения общего числа переданных байтов и времени. Алгоритм, предложенный Галлагером, Хамблетом и Спирой [66] для общих неориентированных графов, оказал сильное влияние на разработку распределенных алгоритмов в целом и получил премию Дейкстры за влиятельную статью в области распределенных вычислений.
Было предложено много других алгоритмов для различных видов сетевых графов , таких как неориентированные кольца, однонаправленные кольца, полные графы, сетки, направленные графы Эйлера и другие. Общий метод, который отделяет проблему семейства графов от разработки алгоритма выборов координатора, был предложен Корахом, Куттеном и Мораном. [67]
Для координации распределенные системы используют концепцию координаторов. Проблема выбора координатора заключается в выборе процесса из группы процессов на разных процессорах в распределенной системе, который будет выступать в качестве центрального координатора. Существует несколько алгоритмов выбора центрального координатора. [68]
До сих пор основное внимание уделялось проектированию распределенной системы, которая решает заданную проблему. Дополнительной исследовательской проблемой является изучение свойств заданной распределенной системы. [69] [70]
Проблема остановки — аналогичный пример из области централизованных вычислений: нам дана компьютерная программа, и задача состоит в том, чтобы решить, останавливается ли она или работает вечно. Проблема остановки неразрешима в общем случае, и, естественно, понимание поведения компьютерной сети по крайней мере так же сложно, как понимание поведения одного компьютера. [71]
Однако существует множество интересных особых случаев, которые разрешимы. В частности, можно рассуждать о поведении сети конечных автоматов. Одним из примеров является определение того, может ли данная сеть взаимодействующих (асинхронных и недетерминированных) конечных автоматов достичь тупика. Эта задача является PSPACE-полной [72] , т. е. она разрешима, но маловероятно, что существует эффективный (централизованный, параллельный или распределенный) алгоритм, который решает задачу в случае больших сетей.
Системы состоят из ряда физически распределенных компонентов, которые работают независимо, используя свое личное хранилище, но также время от времени взаимодействуют посредством явной передачи сообщений. Такие системы называются распределенными системами.
Распределенные программы — это абстрактные описания распределенных систем. Распределенная программа состоит из набора процессов, которые работают параллельно и взаимодействуют посредством явной передачи сообщений. Каждый процесс может получить доступ к набору переменных, которые не пересекаются с переменными, которые могут быть изменены любым другим процессом.
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь ){{cite journal}}
: CS1 maint: несколько имен: список авторов ( ссылка )