И облако – не единственный пример. То, что вы считаете своим аккаунтом в
Задачей распределенной системы является создание иллюзии единого процесса, несмотря на всю внутреннюю сложность. Эта задача делится, соответственно, на множество подзадач.
Один из кусочков этого пазла – проблема согласованности. Каждый компонент распределенной системы получает собственную часть информации и имеет ограниченные возможности коммуникации со всеми остальными компонентами, поэтому у разных частей системы разное, подчас взаимоисключающее, «видение мира». Существует множество примеров того, как этот принцип может приводить к сбоям, – и в области технологий, и в других областях: ваш мобильный телефон не синхронизировался с электронной почтой, и вы не знаете, что уже получили ответ на свое письмо; два человека одновременно зарезервировали билет на один и тот же рейс, на одно и то же время, на одно и то же кресло 5F; топ-менеджер компании не получил своевременного доклада и поэтому принимает неверные решения; взвод разведчиков слишком рано обнаружил себя и спугнул противника.
Для нас естественно пытаться решить подобные проблемы, используя наше собственное цельное «видение мира» и требуя, чтобы все компоненты системы сверялись с этим видением, прежде чем действовать.
Но это сводит на нет множество преимуществ распределенной системы. Компонент, отвечающий за глобальное представление, становится «бутылочным горлышком», самым узким местом в системе, и сбои в этом месте могут привести к катастрофическим последствиям. Корпорация не сможет работать, если каждое решение должен одобрить исполнительный директор.
Чтобы получить более точное представление о проблемах подобных систем, давайте возьмем базовую ситуацию: мы хотим получить желаемые результаты, а информация и задачи распределены среди множества участников. Возникает проблема с безопасностью: попробуйте создать резервные копии важнейшей базы данных на множестве компьютеров, при этом защитив информацию таким образом, чтобы ее можно было восстановить, только если одновременно работает большая часть этих компьютеров. А поскольку проблема защиты информации возникает не только в случае компьютеров и Интернета, давайте поговорим о пиратах и их сокровищах.
Представим себе, что стареющий капитан пиратов один знает, где спрятан клад и, прежде чем отойти от дел, хотел бы поделиться секретом со своими пятью непутевыми сыновьями. Он желает, чтобы они смогли найти сокровище только при условии, что в поисках примут участие как минимум трое из них. При этом не присоединившиеся к этой группе один или два сына не должны найти клад самостоятельно. Пират решает разделить тайну клада на пять ключей и раздать эти ключи сыновьям таким образом, чтобы три любых сына, объединив свои ключи, нашли сокровище. Но если на поиски отправится только один или двое из них, у них будет недостаточно информации.
Как это сделать? Совсем нетрудно придумать пять ключей, которые все вместе раскрывают тайну сокровища. Но в этом случае для успеха предприятия потребуются согласованные действия всех пяти сыновей. Но как сделать так, чтобы любых трех ключей было достаточно, а любых двух – нет?
Как это часто бывает, ответ кажется простым, когда ты его уже узнал. Пират нарисовал на глобусе одному ему известную окружность и сказал сыновьям, что зарыл сокровища в самой южной точке этой окружности. После этого он дал каждому из сыновей координаты одной из пяти точек на окружности. Трех точек достаточно, чтобы провести через них одну-единственную окружность, поэтому любые три пирата могут поделиться друг с другом информацией и найти сокровища. Но двое этого не смогут, потому что через две точки можно провести бесконечное множество окружностей, так что определить местонахождение клада будет невозможно.
Это замечательное решение можно применить во многих областях. Варианты такой схемы являются основным принципом современной защиты данных, которую предложил криптограф Ади Шамир. Произвольный тип данных кодируют, привязывая к точкам на кривой, а для расшифровки требуются другие точки на той же кривой.