В системах баз данных долговечность — это свойство ACID , гарантирующее, что последствия транзакций , которые были совершены, сохранятся навсегда, даже в случае сбоев, [1] включая инциденты и катастрофические события. Например, если бронирование рейса сообщает, что место успешно забронировано, то место останется забронированным даже в случае сбоя системы. [2]
Формально система базы данных обеспечивает свойство долговечности, если она допускает три типа сбоев: транзакции, системы и сбои носителя. [1] В частности, транзакция терпит неудачу, если ее выполнение прерывается до того, как все ее операции будут обработаны системой. [3] Эти виды прерываний могут быть вызваны на уровне транзакции ошибками ввода данных, отменой оператора, истечением времени ожидания или ошибками, специфичными для приложения, такими как снятие денег с банковского счета при недостаточном количестве средств. [1] На системном уровне сбой происходит, если содержимое энергозависимого хранилища теряется, например, из-за сбоев системы , таких как события нехватки памяти . [3] На уровне носителя, где носитель означает стабильное хранилище, выдерживающее системные сбои, сбои происходят, когда стабильное хранилище или его часть теряется. [3] Эти случаи обычно представлены сбоями диска . [1]
Таким образом, чтобы быть долговечной, система базы данных должна реализовывать стратегии и операции, которые гарантируют, что последствия транзакций, которые были зафиксированы до сбоя, сохранятся после события (даже путем реконструкции), в то время как изменения незавершенных транзакций, которые еще не были зафиксированы на момент сбоя, будут отменены и не повлияют на состояние системы базы данных. Такое поведение оказывается правильным, когда выполнение транзакций имеет соответственно свойства устойчивости и восстанавливаемости . [3]
В системах, основанных на транзакциях, механизмы, которые обеспечивают долговечность, исторически связаны с концепцией надежности систем, предложенной Джимом Греем в 1981 году. [1] Эта концепция включает долговечность, но также опирается на аспекты свойств атомарности и согласованности . [4] В частности, механизм надежности требует примитивов , которые явно указывают начало, конец и откат транзакций, [1] которые также подразумеваются для двух других вышеупомянутых свойств. В этой статье были рассмотрены только механизмы, строго связанные с долговечностью. Эти механизмы разделены на три уровня: уровень транзакций, системы и носителя. Это также можно увидеть для сценариев, в которых могут произойти сбои, и которые необходимо учитывать при проектировании систем баз данных для решения проблемы долговечности. [3]
Устойчивость к сбоям, возникающим на уровне транзакций, таким как отмененные вызовы и несогласованные действия, которые могут быть заблокированы до фиксации ограничениями и триггерами , гарантируется свойством сериализуемости выполнения транзакций. Состояние, сгенерированное эффектами ранее зафиксированных транзакций, доступно в основной памяти и, таким образом, является устойчивым, в то время как изменения, внесенные незафиксированными транзакциями, могут быть отменены. Фактически, благодаря сериализуемости их можно отличить от других транзакций, и, следовательно, их изменения отбрасываются. [3] Кроме того, важно учитывать, что изменения на месте, которые перезаписывают старые значения без сохранения какой-либо истории, не приветствуются. [1] Существует несколько подходов, которые отслеживают историю изменений, такие как решения на основе временных меток [5] или ведение журнала и блокировка . [1]
На системном уровне сбои происходят по определению [3] , когда теряется содержимое энергозависимого хранилища. Это может произойти в таких событиях, как сбои системы или отключения питания . Существующие системы баз данных используют энергозависимое хранилище (т. е. основную память системы) для разных целей: некоторые хранят в нем все свое состояние и данные, даже без какой-либо гарантии долговечности; другие хранят состояние и данные или их часть в памяти, но также используют энергонезависимое хранилище для данных; другие системы хранят только состояние в основной памяти, сохраняя все данные на диске. [6] Причина выбора энергозависимого хранилища, которое подвержено этому типу сбоя, и энергонезависимого хранилища заключается в различиях в производительности существующих технологий, которые используются для реализации этих видов хранения. Однако ситуация, вероятно, будет меняться по мере роста популярности технологий энергонезависимой памяти (NVM) . [7]
В системах, включающих энергонезависимое хранилище, долговечность может быть достигнута путем сохранения и сброса неизменяемого последовательного журнала транзакций в такое энергонезависимое хранилище перед подтверждением принятия. Благодаря свойству атомарности транзакции можно считать единицей работы в процессе восстановления , которая гарантирует долговечность при использовании журнала. В частности, механизм регистрации называется журналом упреждающей записи (WAL) и обеспечивает долговечность путем буферизации изменений на диске до их синхронизации с основной памятью. Таким образом, путем реконструкции из файла журнала все зафиксированные транзакции устойчивы к сбоям на уровне системы, поскольку их можно повторить. Незафиксированные транзакции, напротив, восстанавливаются, поскольку их операции регистрируются в энергонезависимом хранилище до того, как они фактически изменят состояние базы данных. [8] Таким образом, частично выполненные операции могут быть отменены без влияния на состояние системы. После этого те транзакции, которые были незавершенными, могут быть повторены. Таким образом, журнал транзакций из энергонезависимого хранилища может быть повторно обработан для воссоздания состояния системы непосредственно перед любым последующим сбоем на уровне системы. Ведение журнала выполняется как комбинация отслеживаемых данных и операций (т. е. транзакций) по соображениям производительности. [9]
На уровне носителя сценарии отказа влияют на энергонезависимые хранилища, такие как жесткие диски , твердотельные накопители и другие типы аппаратных компонентов хранения . [8] Чтобы гарантировать долговечность на этом уровне, система базы данных должна полагаться на стабильную память, которая является памятью, которая полностью и идеально устойчива к отказам. Такой тип памяти может быть достигнут с помощью механизмов репликации и надежных протоколов записи. [4]
Доступно множество инструментов и технологий для обеспечения логической стабильной памяти, таких как зеркалирование дисков, и их выбор зависит от требований конкретных приложений. [4] В целом, стратегии репликации и избыточности и архитектуры, которые ведут себя как стабильная память, доступны на разных уровнях технологического стека. Таким образом, даже в случае катастрофических событий, когда оборудование хранения повреждено, потеря данных может быть предотвращена. [10] На этом уровне существует прочная связь между долговечностью и восстановлением системы и данных , в том смысле, что главная цель состоит в том, чтобы сохранить данные, не обязательно в онлайн-репликах, но и в виде автономных копий. [4] Эти последние методы попадают в категории резервного копирования , предотвращения потери данных и восстановления после сбоев в работе ИТ . [11]
Таким образом, в случае отказа носителя, долговечность транзакций гарантируется возможностью реконструкции состояния базы данных из файлов журнала, хранящихся в стабильной памяти, любым способом, который был реализован в системе базы данных. [8] Существует несколько механизмов для хранения и реконструкции состояния системы базы данных, которые повышают производительность, как с точки зрения пространства, так и времени, по сравнению с управлением всеми файлами журнала, созданными с самого начала системы базы данных. Эти механизмы часто включают в себя инкрементальный дамп , дифференциальные файлы и контрольные точки . [12]
В распределенных транзакциях обеспечение долговечности требует дополнительных механизмов для сохранения согласованной последовательности состояний на всех узлах базы данных. Это означает, например, что одного узла может быть недостаточно для принятия решения о завершении транзакции путем ее фиксации. Фактически, ресурсы, используемые в этой транзакции, могут находиться на других узлах, где одновременно происходят другие транзакции. В противном случае, в случае сбоя, если согласованность не может быть гарантирована, будет невозможно подтвердить безопасное состояние базы данных для восстановления. По этой причине все участвующие узлы должны координироваться, прежде чем фиксация может быть подтверждена. Обычно это делается с помощью двухфазного протокола фиксации . [13]
Кроме того, в распределенных базах данных даже протоколы для регистрации и восстановления должны решать проблемы распределенных сред , такие как взаимоблокировки , которые могут помешать устойчивости и восстанавливаемости транзакций и, таким образом, долговечности. [13] Широко распространенное семейство алгоритмов, которое обеспечивает эти свойства, — это Алгоритмы для восстановления и изоляции, эксплуатирующие семантику (ARIES) . [8]