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

Eventual consistency

Eventual consistency (англ. «событийная согласованность») — одна из моделей согласованности в распределённых системах (базах данных, кэшах, DNS), при которой при отсутствии обновлений системы, по прошествии некоторого времени, все реплики (копии данных) гарантированно приходят к одному и тому же состоянию. В отличие от строгой (линейной) согласованности, eventual consistency допускает временные расхождения между репликами, то есть некорректные с точки зрения актуальности ответы на запросы чтения, если данные ещё не успели синхронизироваться. Эта модель лежит в основе многих NoSQL-систем (Cassandra, Riak, Amazon DynamoDB) и является ключевым допущением теоремы CAP.

История

Концепция eventual consistency была впервые формально описана в работе «Eventual Consistency» [1] (Деммерс и др., 2007), хотя её элементы неявно использовались в распределённых системах с 1970-х годов (например, в DNS — синхронизация зон с задержкой до нескольких часов). Широкое распространение модель получила в 2000-х годах, когда рост интернет-сервисов (социальных сетей, электронной коммерции) потребовал масштабирования баз данных на сотни и тысячи узлов, где поддержание строгой согласованности в реальном времени стало практически невозможным. Amazon в 2007 году ввёл понятие «согласованность в конечном счёте» в контексте своей распределённой системы Dynamo (опубликовано в статье «Dynamo: Amazon’s Highly Available Key-value Store»), что сделало модель популярной.

Свойства и гарантии

Основное определение

Гарантия eventual consistency состоит в том, что если в системе перестают поступать новые обновления для некоторого объекта данных, то через конечное время все реплики этого объекта на всех узлах сети станут идентичными. Время, необходимое для достижения согласованности (англ. convergence time), не ограничено строго — оно может составлять миллисекунды (в хорошо налаженных системах) или часы (как в DNS при кэшировании на уровне интернет-провайдеров).

Различия с другими моделями

Типы eventual consistency

На практике различают несколько вариаций:

Реализация и механизмы

Алгоритмы репликации

Eventual consistency обычно реализуется через асинхронную репликацию: узел, принявший запись, немедленно отправляет копию данных на другие реплики, но не ждёт подтверждения от них. Различают:

Конфликты записей

Поскольку несколько реплик одновременно могут быть изменены разными узлами, без координации возможны конфликты. Для их разрешения применяются:

Слабая согласованность на практике

Классический пример — DNS: изменение IP-адреса для домена может распространяться с задержкой от нескольких секунд до нескольких минут (а в некоторых конфигурациях кэширования — до 48 часов). Пока запись не полностью сходится, разные пользователи могут получать разные значения A-записей.

Применение

Базы данных

Веб-сервисы и кэши

Протоколы и сети

Критика и ограничения

Eventual consistency не подходит для приложений, где критична целостность данных в реальном времени (финансовые транзакции, системы бронирования, медицинские записи). Неправильное использование может приводить к:

Для смягчения этих проблем системы часто комбинируют eventual consistency с дополнительными механизмами: ведение журнала событий, протоколы разрешения конфликтов, использование распределённых блокировок (Paxos, Raft) для отдельных операций, где строгая согласованность обязательна.

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

Источники

  1. Demers A. et al. «Epidemic Algorithms for Replicated Database Maintenance» (1987) — зачаточная форма eventual consistency.
  2. Werner Vogels. «Eventually Consistent — Revisited» (2008) — обзор концепции от технического директора Amazon.
  3. Brewer E. A. «Towards Robust Distributed Systems» (2000) — теорема CAP (позволяет eventual consistency как выбор между A и P).
  4. Riak documentation — «Eventual Consistency in Riak», Basho Technologies.
  5. Apache Cassandra documentation — «Consistency Levels», Apache Software Foundation.

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

На главную BFOmetr →