- •7.5.2. Трехфазное подтверждение
- •7.6. Восстановление
- •7.6.1. Основные понятия
- •7.6.2. Создание контрольных точек
- •7.6.3. Протоколирование сообщений
- •7.7. Итоги
- •Глава 8
- •8.1. Общие вопросы защиты
- •8.1.1. Угрозы, правила и механизмы
- •8.1.2. Вопросы разработки
- •8.1.3. Криптография
- •8.2. Защищенные каналы
- •8.2.1. Аутентификация
- •8.2.2. Целостность и конфиденциальность сообщений
- •8.2.3. Защищенное групповое взаимодействие
- •8.3. Контроль доступа
- •8.3.1. Общие вопросы контроля доступа
- •8.3.2. Брандмауэры
- •8.3.3. Защита мобильного кода
- •8.4. Управление защитой
- •8.4.1. Управление ключами
- •8.4.2. Управление защищенными группами
- •8.4.3. Управление авторизацией
- •8.5. Пример — Kerberos
- •8.6. Пример — sesame
- •8.6.1. Компоненты системы sesame
- •8.6.2. Сертификаты атрибутов привилегий
- •8.7. Пример — электронные платежные системы
- •8.7.1. Электронные платежные системы
- •8.7.2. Защита в электронных платежных системах
- •8.7.3. Примеры протоколов
- •8.8. Итоги
- •Глава 9
- •9.1. Corba
- •9.1.1. Обзор
- •9.1.2. Связь
- •9.1.3. Процессы
- •9.1.4. Именование
- •9.1.5. Синхронизация
- •9.1.6. Кэширование и репликация
- •9.1.7. Отказоустойчивость
- •9.1.8. Защита
- •9.2. Dcom
- •9.2.1. Обзор
- •9.2.2. Связь
- •9.2.3. Процессы
- •9.2.4. Именование
- •Синхронизация
- •Репликация
- •Отказоустойчивость
- •9.2.8. Защита
- •9.3. Globe
- •9.3.1. Обзор
- •9.3.2. Связь
- •9.3.3. Процессы
- •9.3.4. Именование
- •9.3.5. Синхронизация
- •9.3.6. Репликация
- •Отказоустойчивость
- •9.4. Сравнение систем corba, dcom и Globe
- •9.4.1. Философия
- •Процессы
- •9.4.4. Именование
- •Синхронизация
- •Кэширование и репликация
- •Отказоустойчивость
7.6. Восстановление
Теперь мы рассмотрим алгоритмы, позволяющие противостоять отказам. Следует понимать, что процесс, в котором произошел отказ, можно восстановить, приведя его в корректное состояние. Из этого следует, что мы сосредоточимся сначала на том, что такое «привести в корректное состояние», а уж затем — где и как в случае распределенных систем это состояние может быть зафиксировано и как восстановить его, используя контрольные точки и протоколирование сообщений.
7.6.1. Основные понятия
Основа отказоустойчивости — исправление после ошибок. Напомним, что ошибкой считается отказ части системы. Основная идея механизма исправления ошибок состоит в замене ошибочного состояния безошибочным. Существует два основных способа восстановления после ошибок.
При обратном исправлении (backward recovery) основная задача состоит в возвращении системы из текущего ошибочного состояния к предыдущему безошибочному состоянию. Чтобы сделать это, необходимо время от времени записывать состояние системы и восстанавливать ее в предыдущем состоянии, если дело пойдет плохо. При каждой записи текущего состояния системы (или его части) говорят, что создается контрольная точка (checkpoint).
Другой вариант исправления ошибок — прямое исправление (foiward recovery). В этом случае при входе системы в ошибочное состояние вместо отката назад, к предыдущей контрольной точке, делается попытка перевести систему в новое корректное состояние, в котором она могла бы продолжать работать. Основная проблема механизмов прямого исправления ошибок состоит в том, что для них необходимо заранее знать о возможных ошибках. Только в этом случае удастся исправить эти ошибки и перейти в новое состояние.
Разницу между прямым и обратным механизмами исправления ошибок легко понять на примере реализации надежной связи. Основной способ восстановления потерянного пакета — попросить отправителя послать этот пакет повторно. В действительности повторная передача пакета означает отход назад, к предыдущему правильному состоянию, а именно к состоянию, когда начинал передаваться потерянный пакет. Таким образом, надежная связь, организуемая посредством повторной посылки пакетов, — это пример обратного исправления ошибок.
Альтернативный подход состоит в использовании так называемого метода коррекции разрушенной информации. В этом случае потерянный пакет создается из других, успешно доставленных пакетов. Так, например, при использовании блочного кодирования от потерь (п, k) набор из k исходных пакетов преобразуется в набор п декодированных пакетов, так что любой набор из k декодированных пакетов подходит для реконструкции k исходных пакетов. Типичные значения k — 16 и 32, причем k<n<2k [383]. Если доставленных пакетов оказывается недостаточно, отправителю придется продолжать передавать пакеты до тех пор, пока не удастся восстановить ранее потерянный пакет. Коррекция разрушенной информации представляет собой типичный пример прямого исправления ошибки.
Вообще говоря, для исправления ошибок в распределенных системах в качестве основного механизма чаще используются методы обратного исправления. Важное преимущество обратного исправления ошибок состоит в том, что это общий метод, который не зависит от конкретной системы или процесса. Другими словами, он может быть интегрирован в распределенную систему, например в ее промежуточный уровень, в виде службы общего назначения.
Однако обратное исправление ошибок также создает определенные проблемы [421]. Во-первых, восстановление системы или процесса в предыдущем состоянии — дело достаточно затратное с точки зрения производительности. Как мы увидим далее, обычно восстановление, например, отказавшего процесса или сайта, обычно требует большого объема работы.
Во-вторых, поскольку механизмы обратного исправления ошибок не зависят от конкретного распределенного приложения, в котором они используются, невозможно дать какие-либо гарантии того, что после исправления ошибок та же самая или похожая ошибка не возникнет вновь. Если подобные гарантии необходимы, обработка ошибок обычно выполняется в цикле. Другими словами, применение механизмов обратного исправления ошибок не позволяет добиться полностью прозрачного исправления ошибок.
И, наконец, хотя при обратном исправлении ошибок используются контрольные точки, в некоторые состояния вернуться просто невозможно. Например, если некий человек (возможно, злоумышленник) из-за неисправного банкомата внезапно получил 1000 долларов, шанс на то, что эти деньги удастся вернуть, очень невелик. Также невозможно и восстановление в предыдущее состояние большинства UNIX-систем после ввода следующей команды и выбора неправильного каталога:
/bin/пл -fr *
Некоторые вещи просто необратимы.
Контрольные точки позволяют вернуться в предыдущее правильное состояние. Однако создание контрольной точки часто вызывает значительные затраты само по себе, что оборачивается значительными потерями производительности. Поэтому многие отказоустойчивые распределенные системы сочетают создание контрольных точек с протоколированием сообщений (message logging). В этом случае после создания контрольной точки процесс записывает свои сообщения перед отсылкой в журнал, что означает протоколирование отправителем (sender-based logging). Альтернативное решение — позволить принимающему процессу протоколировать приходящие сообщения перед их доставкой выполняемому приложению. Эта схема известна под названием протоколирования получателем (receiver-based logging). Если в принимающем процессе возникает отказ, он должен восстановить состояние последней сохраненной контрольной точки, после чего может повторно запустить все принятые после нее сообщения. Таким образом, комбинация из контрольных точек и протоколирования сообщений позволяет восстановить значительно более позднее состояние, чем состояние, сохраненное в последней контрольной точке, без дополнительных затрат на создание контрольных точек.
Есть еще одно важное различие между контрольными точками и схемами, основанными на применении журналов. В системе, использующей только контрольные точки, процесс может быть восстановлен только в состояние контрольной точки. Но его поведение в этом состоянии может отличаться от поведения перед ошибкой. Так, например, если периоды между сеансами заданы не жестко, сообщения теперь могут приходить в ином порядке, вызывая другую реакцию получателя. В противоположность этому в случае протоколирования сообщений происходит повторение всех событий, имевших место с момента последней контрольной точки. Это повторение облегчит взаимодействие системы с внешним миром.
Так, например, рассмотрим случай, когда ошибка была вызвана неверными данными, вводимыми пользователем. Если использовать исключительно контрольные точки, максимум, что может система, — это вернуться в состояние контрольной точки, предшествовавшей приему введенных пользователем данных. При протоколировании сообщений можно использовать более старую контрольную точку, после чего, повторяя события, выйти к точке, где пользователь должен вводить данные. На практике комбинация небольшого количества контрольных точек и протоколирования сообщений используется гораздо чаще, чем схемы с множеством контрольных точек.
Устойчивые хранилища
Чтобы иметь возможность восстановить предыдущее состояние системы, требуется хранить нужную для восстановления информацию в безопасности. «В безопасности» в данном случае означает, что хранимая информация должна выдерживать отказы системы и сайтов, а возможно, и различные повреждения хранилища. Устойчивые хранилища играют важную роль в восстановлении распределенных систем. Здесь мы кратко обсудим этот вопрос.
Хранилища делятся на три категории. Первая — это стандартная оперативная память, стирающаяся при отключении питания или перезагрузках машины. Следующая категория — дисковые хранилища, переживающие ошибки процессора, но неспособные выжить при поломке головок диска.
И, наконец, существуют так называемые устойчивые хранилища (stable storage), разработанные для выживания в любых «передрягах», кроме катастроф вроде наводнений или землетрясений. Устойчивые хранилища могут быть реализованы в виде пары стандартных дисков, как это показано на рис. 7.15, а. Каждый блок устройства 2 является точной копией соответствующего блока устрой ства 1. Если блок диска изменяется, то сначала изменяется и проверяется блок устройства 1, а затем та же операция производится и с устройством 2.
Представим себе, что система отказала после изменения содержимого устройства 1, но до изменения содержимого устройства 2, как показано на рис. 7.15, б. Во время исправления ошибок диски должны сравниваться поблочно. Если два соответствующих блока различны, это может означать, что правилен блок на устройстве 1 (поскольку устройство 1 всегда обновляется раньше устройства 2), а значит, новый блок копируется с устройства 1 на устройство 2. По завершении процесса восстановления оба диска снова будут идентичны.
Другая потенциальная проблема — самопроизвольное повреждение блока. Частички пыли или безжалостное время способны внезапно, без каких-либо предварительных признаков, вызвать ошибку контрольной суммы нормального ранее блока, как показано на рис. 7.15, е. Если произойдет подобная ошибка, потерянные блоки можно будет восстановить по соответствующим блокам другого диска.
Как видно из этого описания, устойчивые хранилища хорошо подходят приложениям, требующим высокой степени отказоустойчивости, таким как атомарные транзакции. При записи данных в устойчивое хранилище с последующим чтением их оттуда с целью проверки правильности записи шанс на то, что впоследствии они окажутся потерянными, очень незначителен.
Ниже мы подробнее рассмотрим вопросы, связанные с контрольными точками и протоколированием сообщений. В [137] имеется обзор метода контрольных точек и протоколирования в распределенных системах. Различные детали алгоритмов можно найти в [103].
