Консистентность данных что это

Что такое ACID в базах данных?

В частности, ACID имеет отношение к тому, как БД может восстанавливаться после ошибок, возникающих в процессе выполнения транзакции.

В базах данных, следующих принципу ACID, данные остаются целостными и консистентными, несмотря на любые ошибки.

Определение ACID

Atomicity (атомарность)

Атомарность гарантирует, что каждый запрос в транзакции будет выполнен успешно, либо вообще никакой, в случае ошибки одного. Не получится так, что часть запросов выполнятся успешно, а часть с ошибкой. Если хоть одна часть транзакции выполнится с ошибкой, вся транзакция не выполнится. Другими словами под атомарностью можно понимать «всё или ничего».

Consistency (консистентность, согласованность)

Это свойство даёт гарантию того, что все данные будут целостны. Данные будут корректны в соотвествии со всеми предопределёнными правилами, ограничениями, каскадами и триггерами, применёнными к БД.

Isolation (изолированность)

Гарантирует, что все транзакции будут выполняться изолированно. Ни одна транзакция не зааффектит на другую транзакцию. Другими словами, одна транзакция не сможет прочитать данные второй транзакции, которая ещё не выполнилась.

Durability (стойкость)

Durability означает, что когда транзакция будет применена, она останется в системе, даже если БД упала сразу после выполнения этой транзакции. Любые изменения, внесённые транзакцией, должны оставаться навсегда. Если БД сообщила об успешном выполнении транзакции, то она должна быть действительно применена.

Когда пригодится ACID?

Свойства ACID спроектированы для transaction-ориентированные баз данных.

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

Транзакция это единая логическая операция, которая может состоять из одного или нескольких шагов. Например, транзакцией может быть перевод денежных средств между банковскими аккаунтами (снятие денег из одного и пополнение другого). Если в середине такой транзакции возникнет ошибка, может возникнуть большая неконсистентность в данных. Деньги будут вычтены с одного счёта, но не зачислены в другой.

Вот тут и должны быть применены принципы ACID.

Следуя принципу ACID, база данных будет целостна тогда и только тогда, когда она будет содержать все результаты успешно выполненных запросов, выполненных в транзакции. Любая ACID совместимая БД гарантирует, что будут применены изменения только успешных транзакций. В случае ошибки в транзакции, данные не будут изменены.

Таким образом, СУБД, совместимые с ACID, дают организациям уверенность в том, что данные в их базе данных будут целостны, даже если произойдёт какой-либо сбой в середине выполнения транзакции.

Типы сбоев

Ошибка транзакции

Эта ошибка может произойти из-за некорректных входных данных или любых других нарушений целостности. Она так же возникает в результате тайм-аута, либо в результате deadlock.

Системный сбой

Системный сбой может быть из-за ошибки в коде СУБД, либо аппаратного сбоя.

Медийные сбои

Эти сбои случаются, когда запись или чтение из хранилища невозможны (например сбой в работе жёсткого диска, либо ошибки в работе операционной системе). Эти ошибки возникают намного реже, чем первые 2 типа.

Следование ACID принципам

Все популярные реляционные базы данных следуют принципам ACID. Все они имеют инструменты, обеспечивающие целостность данных при сбоях программного и аппаратного обеспечения, а также при любых неудачных транзакциях.

Но с NoSQL базами данных ситуация обстоит немного по-другому. Эти базы данных часто предназначены для обеспечения высокой доступности в кластере, а обычно это означает, что в некоторой степени жертвуют консистентностью и/или стойкостью. Однако большинство NoSQL баз данных в некоторой степени могут обеспечить атомарность.

Но всё же, большинстве NoSQL баз данных заложены основы целостности данных, что означает, что данные могут быть не синхронизированы какое-то время, но в конечном итоге они всё таки будут синхронизированы.

Вдобавок, некоторые разработчики, такие как MarkLogic, OrientDB и Neo4j, предлагают ACID-совместимые системы управления базами данных NoSQL.

Источник

Требования ACID на простом языке

Мне нравятся книги из серии Head First O`Reilly — они рассказывают просто о сложном. И я стараюсь делать также.

Когда речь идёт о базах данных, могут всплыть магические слова «Требования ACID». На собеседовании или в разговоре разработчиков — не суть. В этой статье я расскажу о том, что это такое, как расшифровывается ACID и что означает каждая буква.

Требования ACID — набор требований, которые обеспечивают сохранность ваших данных. Что особенно важно для финансовых операций. Мы же не хотим остаться без денег из-за разрыва соединения или ошибки в ПО, не так ли?

Давайте пройдемся по каждой букве ACID и посмотрим на примерах, чем архив лучше 10 разных файлов. И чем транзакция лучше 10 отдельных запросов.

Atomicity — Атомарность

Атомарность гарантирует, что каждая транзакция будет выполнена полностью или не будет выполнена совсем. Не допускаются промежуточные состояния.

Друг познается в беде, а база данных — в работе с ошибками. О, если бы всё всегда было хорошо и без ошибок! Тогда бы никакие ACID были бы не нужны. Но как только возникает ошибка, атомарность становится очень важна.

Допустим, вы решили отправить маме деньги. Когда вы делаете перевод внутри банка, что происходит:

У вас деньги списались

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

И допустим, что у нас 2 отдельных запроса. А теперь посмотрим, что будет при возникновении ошибок:

1. У вас на балансе нет нужной суммы — система вывела сообщение об ошибке, но катастрофы не произошло, атомарность тут не нужна.

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

2. У мамы заблокирована карточка, истек срок годности — деньги ей не поступили. Запрос отменен. Но минуточку. У вас то они уже списались!

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Ошибка на первом этапе никаких проблем в себе не таит. А вот ошибка на втором. Приводит к потере денег, что явно недопустимо.

Если мы отправляем отдельные запросы, система не может связать их между собой. Запрос упал с ошибкой? Система его отменяет. Но только его, ведь она не знает о том, что запрос «у меня деньги спиши» связан с упавшим «сюда положи»!

Транзакция же позволяет сгруппировать запросы, то есть фактически показывает базе на взаимосвязи между ними. База сама о связях ничего не знает! Это знаете только вы =)

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

И если падает запрос внутри транзакции, база откатывает всю транзакцию. И приходит в состояние «как было до начала транзакции». Даже если там внутри было 10 запросов, вы можете спать спокойно — сломался один, откатятся все.

Consistency — Согласованность

Транзакция, достигающая своего нормального завершения (EOT — end of transaction, завершение транзакции) и, тем самым, фиксирующая свои результаты, сохраняет согласованность базы данных. Другими словами, каждая успешная транзакция по определению фиксирует только допустимые результаты ​ wikipedia

Это свойство вытекает из предыдущего. Благодаря тому, что транзакция не допускает промежуточных результатов, база остается консистентной. Есть такое определение транзакции: «Упорядоченное множество операций, переводящих базу данных из одного согласованного состояния в другое». То есть до выполнения операции и после база остается консистентной (в переводе на русский — согласованной).

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Например, пользователь в системе заполняет карточку:

Телефон — отдельно код страны, города и номер

Источник

Согласованность данных в высоконагруженных системах

Проблематика

Практически любая информационная система требует хранения данных на постоянной основе. В большинстве систем с малой и средней нагрузкой эту функцию выполняют реляционные СУБД, неоспоримым преимуществом которых является гарантия согласованности данных.

Классический пример, объясняющий, что такое согласованность данных – операция перевода денежных средств с одного счёта на другой. В момент, когда операция изменения баланса одного счёта уже выполнилась, а другого – ещё не успела, может произойти сбой. Тогда с одного счёта средства будут списаны, а на другой не поступят. Такое состояние данных системы называется рассогласованным, и, пожалуй, нет необходимости объяснять, к каким последствиям это может привести. Реляционные СУБД предоставляют механизм транзакций, гарантирующий согласованность данных в любой момент времени. Транзакция – это конечный набор операций, который переводит одно согласованное состояние в другое согласованное состояние. В случае ошибки на любом шаге СУБД отменяет все выполненные ранее операции и возвращает данные к первоначальному согласованному состоянию. Иными словами – либо выполнятся все операции, либо ни одной.

Что касается крупномасштабных систем, то в них далеко не всегда возможно использовать единую базу данных из-за слишком большой нагрузки. В таких случаях каждому модулю системы (сервису) предоставляется своя отдельная база данных. В этом случает встаёт вопрос как для такой кластерной архитектуры обеспечить согласованность данных.

Решение проблемы согласованности данных

Один из вариантов решения – распределённые транзакции. Сначала все узлы кластера должны согласиться, что выполнение операции возможно, затем выполняется фиксация изменений на всех узлах. Поскольку никакого общего устройства хранения у узлов нет, то единственный способ прийти к общему мнению — договориться, используя какой-либо протокол распределенного консенсуса.

Простой протокол для фиксации глобальных транзакций — двухфазный коммит (2PC). Узел, выполняющий транзакцию, считается координатором. На подготовительной фазе (prepare) координатор сообщает остальным узлам о фиксации транзакции и дожидается от них подтверждения, что они готовы выполнить фиксацию. Если хотя бы один узел не готов — транзакция обрывается. На фазе фиксации (commit) координатор сообщает всем узлам о решении зафиксировать транзакцию. При получении от всех подтверждения, что все ок, координатор тоже фиксирует транзакцию.

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Рисунок 1 – Общая схема двухфазного коммита

Этот протокол позволяет обойтись минимумом сообщений, но не устойчив к сбоям. Например, при отказе координатора после фазы prepare, остальные узлы не имеют информации о том, должна ли транзакция быть зафиксирована или отменена (им придется ждать устранения сбоя). Ещё один серьёзный недостаток 2PC (и других протоколов распределённых транзакций, например 3PC) – при росте количества узлов кластера производительность двухфазных коммитов падает.

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Рисунок 2 – Зависимость скорости выполнения двухвазного коммита от количества серверов в кластере СУБД

Кроме того, подход распределённых транзакций накладывает ограничение: все модули системы должны использовать одну и туже СУБД, что не всегда удобно.

Другой вариант – обеспечить некий механизм, позволяющий работать с различными базами данных (для сервисов) как с единой базой данных (решить проблему с целостностью данных в распределённой базе). При этом требуется некий аналог транзакции для распределённой системы («бизнес-транзакция»).

В обычных транзакциях, а также в двухфазных коммитах, все операции контролируются механизмом транзакций (с использованием блокировок), и это делается с целью обеспечить возможность откатить любую операцию (пессимистический подход – любую операцию считаем потенциально вызывающей сбой). Это является узким местом системы. Альтернативный вариант – так называемый оптимистический подход: считаем, что большинство операций завершаются успешно. Дополнительные же действия производим уже по факту произошедшего сбоя. Т.е. уменьшаем издержки для большинства операций, что приводит к повышению производительности.

Что такое Saga (Сага) и как она работает

Альтернативой транзакциям для микросервисной архитектуры является Saga. Saga (сага) представляет собой набор шагов, выполняемых различными модулями системы (сервисами); так же требуется сервис саги, отвечающий за операцию (бизнес-транзакцию) в целом. Шаги связаны через граф событий. После выполнения саги система должна перейти из одного согласованного состояния в другое (в случае успешного выполнения), или вернутся к предыдущему согласованному состоянию (в случае отмены).

Как реализовать такой возврат или откат бизнес-транзакции? Для этого в сагах используется механизм отменяемости шагов (компенсирующие действия). Например, один из шагов был выполнен успешно (допустим в таблицу базы данных пользователей была добавлена запись), но на одном из следующих шагов произошёл сбой, и всю сагу следует отменить. Тогда этому же сервису поступает команда – отменить действие. Но в СУБД сервиса локальная транзакция уже завершена, запись пользователя добавлена. Тогда для возврата к предыдущему состоянию сервис должен выполнить компенсирующее действие (в нашем примере – удалить запись). Отменяемость шагов позволяет реализовать в рамках саги атомарность (Atomicity) – «всё или ничего» — все шаги выполняются или компенсируются.

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Рисунок 3 – Механизм работы Saga и природа компенсирующего действия

На рисунке 3 шаги саги обозначены как T1. T4, компенсирующие действия: C1. C4.
Саги поддерживают идемпотентность шагов (действие, многократное повторение которого эквивалентно однократному). Подход саг обеспечивает возможность повторить любой шаг (например, если не получили отклик об успешном завершении). Так же идемпотентность позволяет восстановить состояние при потере данных на каком-либо узле (сбой и восстановление). При выполнении шага каждый сервис должен определять (по ключу идемпотентности) выполнял он уже этот шаг, или нет (если нет – выполнить, иначе — пропустить). Для компенсирующих действий тоже возможно добавление ключей идемпотентности и повторы операций (обеспечение персистентности/устойчивости).

Резюме

Из четырёх требований к транзакционной системе ACID (атомарность, согласованность, изолированность, устойчивость) механизм саг позволяет реализовать три – все, кроме изолированности. Отсутствие изолированности может приводить к аномалиям («грязные чтения», «неповторяющиеся чтения», перезапись изменений между различными бизнес-транзакциями и т.д.). Для преодоления подобных ситуаций требуется использовать дополнительные механизмы, например версионность изменяемых объектов.

Саги позволяют решить следующие задачи:

Область применения и примеры применения

Саги часто используют в системах с большим количеством запросов. Например, популярные почтовые сервисы, социальные сети. Однако подход может найти применение и в проектах меньшего масштаба.

Наша компания имеет опыт разработки системы учёта для крупного предприятия, которая была рассчитана на несколько десятков пользователей и все данные хранились в одной реляционной СУБД. Проблема возникла при реализации автоматического расчёта запланированных работ: в некоторых случаях расчёты были очень большими и требовали вставки миллионов записей в таблицы СУБД, что значительно нагружало СУБД и замедляло работу всей системы.

Было найдено решение — вынести логику расчёта работ в отдельный сервис со своей отдельной СУБД для хранения самих работ и сопутствующих объектов. Согласованность данных обеспечивалась при помощи саги. Если при расчёте происходил сбой, то в основной модуль приложения поступала команда отменить логическую операцию расчёта.

Источник

Консистентность данных что это

Как мы уже отмечали, одним из преимуществ Кассандры является возможность задания уровня согласованности для операций чтения и записи данных. В этой статье рассмотрим, какие бывают уровни согласованности для этих процессов в Apache Cassandra, и как они влияют на скорость работы распределенной NoSQL-СУБД при ее эксплуатации в реальных Big Data проектах.

Что такое согласованность и зачем она нужна

Вообще, разговор о согласованности данных в распределенных системах стоит начать с CAP-теоремы (согласованность, доступность, устойчивость) [1], однако это тема отдельной статьи. Apache Cassandra полностью реализует принципы доступности (Availability) и устойчивости к разделению (Partition tolerance), обеспечивая корректный отклик на любой запрос и простоту масштабирования. Однако, согласованность (Consistency), т.е. непротиворечивость данных считается слабым местом этой распределенной СУБД в связи с ее децентрализацией, когда на множестве узлов хранятся разные реплики одной и той же информации. Для устранения этой проблемы используется механизм настройки уровней согласованности.

Напомним, в отличие от другой популярной NoSQL-базы данных для Big Data, Apache HBase, все узлы кластера Cassandra равноценны – клиенты могут соединятся с любым из них для записи и чтения. При этом выполнение запроса начинается с его координации, чтобы с помощью ключа и меток определить, на каких узлах кластера находятся нужные данные и отправить запрос именно туда. Узел, выполняющий координацию, называется координатором (coordinator), а узлы, которые выбраны для сохранения записи с данным ключом — узлами-реплик (replica nodes). Физически координатором может быть один из узлов-реплик [2].

Можно сказать, что доступность данных напрямую зависит от уровня согласованности операций чтения и записи, так как он определяет, сколько узлов-реплик может отказать при подтверждении успешного выполнения этих операций. Например, если уровень репликаций меньше, чем сумма узлов, с которых пришло подтверждения об успешной записи данных, и с которых происходит чтение, то есть гарантия строгой согласованности (strong consistency). Строгая согласованность гарантирует, что после записи новое значение всегда будет прочитано. Иначе возможна ситуация, когда в результате чтения СУБД возвратит устаревшие данные.

Для борьбы с этим в Apache Cassandra есть механизм итоговой согласованности (eventual consistency), который распространит данные по узлам-репликам после того, как закончится координационное ожидание. Если при этом будут доступны не все узлы-реплики, то придется задействовать другие средства восстановления данных, в частности, чтение с исправлением и запускаемое вручную анти-энтропийное восстановление узла (anti-entropy node repair) [2].

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что этоРаспределенная запись данных в кластере Apache Cassandra

Согласованная запись в NoSQL-СУБД Кассандра

При записи данных уровень согласованности определяет количество узлов-реплик, с которых будет ожидаться подтверждение удачного окончания операции – сигнала того, что данные успешно записаны. Для записи существуют такие уровни согласованности [2]:

Согласованное чтение Big Data в Apache Cassandra

В случае чтения уровень согласованности определяет количество узлов-реплик, с которых будет считана информация [2]:

Как уровни согласованности влияют на быстроту работы NoSQL СУБД

Подводя итог возможным уровням согласованности в Apache Cassandra, можно сделать следующие выводы [2]:

По умолчанию для всех операций в Apache Cassandra используется уровень согласованности ONE. Отметим, что в ранних версиях этой NoSQL-СУБД задать уровень согласованности можно было прямо в самом CQL-запросе, например, так [3]:

SELECT * FROM users WHERE state=’TX’ USING CONSISTENCY QUORUM;

Однако, начиная с версии 1.2 (2012 год) разработчики убрали эту возможность, аргументируя тем, что согласованность операции должна устанавливаться не в рамках запроса, а на уровне протокола ее выполнения [3]. Таким образом, сегодня установить consistency level в Кассандре можно двумя следующими способами:

from cassandra import ConsistencyLevel

from cassandra.query import SimpleStatement

“INSERT INTO users (name, age) VALUES (%s, %s)”,

session.execute(query, (‘John’, 42))

Напомним, cqlsh поддерживает ряд специальных команд, которые не являются частью CQL, используя драйвер собственного протокола Python при подключении к узлу, указанному в командной строке [5].

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что этоПример установки уровня согласованности Кассандры в оболочке командной строки cqlsh

В следующей статье мы подробнее расскажем, как именно выполняются процессы записи и считывания больших данных (Big Data) в Apache Cassandra с учетом рассмотренных уровней согласованности.

Источник

Консистентно о Консенсусе

Здравствуйте, меня зовут Дмитрий Карловский. А вы на канале Core Dump, где мы берём различные темы из компьютерной науки и раскладываем их по полочкам.

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

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Согласованность данных

Начнём с консистентности или согласованности. Это — логическая непротиворечивость хранимых данных.

Например, если у Алисы родителем значится Боб, а у Боба родителем значится Алиса, то это явно какая-то лажа. Не могут они быть родителями друг друга одновременно. Данные не консистентны!

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Согласованность часто путают с консенсусом. Особенно, когда данные частично хранятся на одном сервере, а частично на другом, но при этом должны быть согласованы друг с другом. Однако, консенсус немного о другом..

Согласие между участниками

Консенсус — это согласие группы участников касательно значения некоторого состояния. Например, если все считают Боба мужчиной, но сам он считает себя вертолётом, то согласия тут не наблюдается. Консенсус не достигнут!

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Важно понимать, что даже если у каждого участника состояние само по себе консистентно, между участниками согласия при этом может и не быть. И наоборот, участники могут достигнуть консенсуса касательно несогласованного состояния. Тогда… Эта база данных сломалась. Несите следующую!

Достижение согласия

Все подходы по достижению консенсуса можно разделить на две большие группы..

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Первая — это конкуренция за единый источник истины. Участники толпятся вокруг него, толкаются локтями и пытаются внести в него свои изменения. Транзакции в базах данных, атомарные операции в процессоре, протоколы консенсуса в распределённых системах — это всё из этой оперы.

Совершенно иной подход — конвергенция. Она же сходимость. Это когда участники независимо друг от друга меняют каждый своё и только своё состояние. Но при этом они могут подглядывать к соседям и подливать их изменения к себе. А алгоритмы слияния строятся так, чтобы состояния всех участников в конечном счёте сошлись к одному и тому же значению.

Конкуренция за источник истины

Разберём подробнее конкуренцию за источник истины. Это может быть мастер-реплика СУБД, оракул в распределённых системах, основной поток приложения или просто общий участок памяти.

Читать из источника все могут одновременно. Но при попытке записать участник может быть заблокирован, пропуская вперёд более удачливых соседей.

Тут можно выделить два вида блокировок: пессимистичная и оптимистичная.

В базах данных это соответственно пессимистичные и оптимистичные транзакции. В распределённых системах это мастер-слейв репликация и двухфазные коммиты. А во многопоточке это мьютексы и lock-free алгоритмы.

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Пессимистичная блокировка

Идея пессимистичной блокировки простая: сначала участник запирает ресурс, затем производит его обновление, по завершении которого ресурс отпирается. Это если ему повезло прийти первым. Если же он пришёл, а ресурс уже кем-то заперт, то он сидит, ничего не делает, и ждёт его отпирания.

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Это самый простой и надёжный подход. Однако у него есть проблемы с производительностью. Либо из-за постоянных ожиданий, либо из-за холостых запираний, которые так-то весьма не бесплатны.

Смертельное запирание

Кроме того, этот подход подвержен проблеме смертельного запирания или dead-lock. Это когда два участника успешно запирают два разных ресурса, а потом блокируются при попытке запереть ресурс уже запертый оппонентом. Получается, что при неосторожном обращении с запиранием, участники могут заблокироваться одновременно. Из-за чего не смогут освободить запертые ими ресурсы.

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Запирание разве не блокировка?

Тут стоит подчеркнуть разницу между запиранием и блокировкой.

Запирание (locking) — это воздействие на ресурс таким образом, чтобы никто другой не мог с ним взаимодействовать.

Блокировка же (blocking) — это когда мы сами не можем продолжать работу по той или иной причине. Например, когда ожидаем отпирания ресурса, завершения ввода-вывода или просто какого-либо события.

Однако, часто запирание называют блокировкой — к этому надо быть готовым и правильно интерпретировать. Особенно, когда говорят о неблокирующих алгоритмах, подразумевая на самом деле незапирающие.

Оптимистичная блокировка

Если конкуренция не слишком высока, оптимистичная блокировка может показать себя гораздо лучше.

Тут участник сначала готовит новое состояние, а потом атомарно применяет его к источнику истины. Если повезёт. А если не повезёт, и кто-то успеет раньше него, то вся проделанная работа выкидывается, и начинается заново.

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Висеть в таком цикле участник может неограниченно долго. Формально при этом он не заблокирован и продолжает работу. Однако, фактически он работает вхолостую и не продвигается вперёд по выполняемой им задаче. Что логически эквивалентно блокировке.

Более того, один из вариантов реализации, например, мьютекса — это запирание с пробуксовкой, или spin-lock. То есть кручение в бесконечном цикле в ожидании отпирания ресурса, чтобы тут же рвануть на полной скорости получив зелёный свет.

Тут стоит обратить внимание на путаницу в терминах. Lock-free алгоритмы раньше назывались неблокирующими. Теперь же они считаются лишь частным случаем неблокирующих. Но на самом деле это всё же механизм хоть и оптимистичной, но блокировки.

Преимуществами данного подхода является высокая производительность в условиях низкой конкуренции, и существенно более сложное достижение взаимной блокировки, которая в этом случае уже называется оживлённым запиранием или live-lock.

К недостаткам же можно отнести большой объём холостой работы при высокой конкуренции, и существенно более сложные алгоритмы, чувствительные к архитектурным особенностям.

Задача византийских генералов

Проблему консенсуса обычно иллюстрируют на примере задачи византийских генералов, каждый из которых может принять решение наступить или отступить в условиях ненадёжной связи друг с другом. Если все нападают — есть шанс выиграть битву. Если все отступят, то смогут перегруппироваться и напасть позже. Но, представьте себе ситуацию..

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Анжелла и Константин выступают на битву со вселенским злом, а Блейд такой: «Ой, я из другой франшизы, это не моя битва, всем пока». В результате наши герои терпят поражение в неравном бою. А ведь могли бы отступить, и например, позвать Бимэна с его кучей артефактов.

Так вот, чтобы прийти к общему решению они могут задействовать один из протоколов консенсуса. Самый простой из них — демократическое голосование. Тут единым источником истины является мнение большинства или кворум, за который и идёт конкуренция.

В случае же конвергенции, никто никого не спрашивает «отступать или нападать?». В бой идут все! И даже ты, Блейд, иначе снова отправим на нары. Так что догоняй!

Вы, возможно, спросите меня: «Кто все эти люди и при чём тут компьютеры?». Что ж, стоит пояснить, что в распределённых системах наступление — это применение изменений, а отступление — это их откат.

При пессимистичной стратегии мы сначала договариваемся применяем ли мы изменения и если да, то их принимают все. При оптимистичной мы сначала вносим изменения, а потом договариваемся, и если договориться не удалось, то откатывем. При конвергентной же мы применяем изменения и все остальные обязаны их рано или поздно тоже принять. Но об этом позже.

Терпимость к разделению

Отличительной особенностью источника истины является возможность гарантировать консенсус. Однако все участники должны при этом иметь постоянный доступ к этому источнику. Что в общем случае невозможно в распределённых системах, где соединение между участниками может временно пропадать.

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Это — фундаментальная дилемма между консенсусом и доступностью также известная как CAP-теорема. Если мы выбираем консенсус, то участники, не имеющие доступа к источнику истины, не смогут изменить никакие данные. Если же им всё же позволить менять данные, то мы автоматически получаем ситуацию со множеством источников истины, которые могут друг другу противоречить.

И, как говорится, «Не можешь победить? Возглавь!». Так что давайте рассмотрим как можно жить без конкуренции за единый источник истины.

Сходимость к согласию

Если вы работали с распределёнными системами, то скорее всего вы слышали термин «Eventual Cоnsistency» или «Согласованность в конечном счёте». Так вот, оно на самом деле не про консистентность, а именно про конвергенцию или сходимость.

Wait-free алгоритмы межпоточного взаимодействия основаны на той же идее — отсутствие конкуренции за общий ресурс. Поэтому именно они, в отличие от lock-free, являются неблокирующими на самом деле.

Однако, важно понимать, что консистентность данных тут уже в общем случае не может быть гарантирована. Так как слияние консистентных по отдельности изменений может выдавать уже неконсистентное состояние. Но с этим можно жить, если правильно организовывать данные и уметь нормализовывать неконсистентное состояние.

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Алгоритмы, обеспечивающие сходимость, можно разделить на 3 основных класса. Это: упорядоченные, полу-упорядоченные и… беспорядочные. Давайте рассмотрим их подробнее..

Упорядоченная сходимость

Алгоритмы операционных трансформаций основаны на идее, что все участники должны применить все изменения в одном и том же порядке. То есть после слияния всех изменений каждым участником, любой из них должен получить одну и ту же цепочку изменений, что даст им одно и то же финальное состояние. То есть конвергенцию.

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Но как же так, Алиса ведь уже внесла своё красное изменение А3 после А1, сверху докинула С4, а тут прилетает В2 и его нужно как-то вставить задним числом?

В этом случае приходится отменять всю историю до точки А1, применять В2, а потом накатывать историю обратно. При этом, так как каждое изменение зависит от состояния, полученного от предыдущего изменения, то при накатывании истории может потребоваться её трансформация с учётом добавленных в её середину изменений.

Такое перебазирование истории — довольно медленная операция, в случае большого расхождения историй изменений разных участников. При этом всю эту историю от начала времён нужно хранить неограниченно долго. А каждый новый участник, чтобы получить актуальное состояние, должен загрузить и последовательно применить всю эту историю, размер которой многократно превышает размер финального состояния.

Разумеется, в таком наивном виде эти алгоритмы не применимы на практике. Поэтому к ним добавляют дополнительные костыли и идут на множество компромиссов. Например, обрезают старую историю, группируют изменения, делают периодические снепшоты состояния и тд. Это сглаживает углы, но не решает проблемы полностью. Зато ещё сильнее усложняет и без того не простые алгоритмы.

Полу-упорядоченная сходимость

А что если мы будем описывать наши изменения таким образом, что изменения любого участника можно будет просто подклеивать в конец истории любого другого участника без какого-либо перебазирования? Так появились коммутативные бесконфликтные реплицируемые типы данных или CmRDT.

CmRDT: Conflict-free Commutative Replicated Data Type

Они полагаются лишь на частичную упорядоченность изменений. То есть изменения от одного участника применяются лишь в том же порядке, в котором этот участник их вносил. А вот изменения разных участников можно переставлять друг относительно друга как угодно, но результат будет одинаковым.

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Полу-упорядоченным алгоритмам уже не нужно хранить всю историю, а применение изменений получается крайне простым и быстрым. Однако, они сильно зависят от надёжности соединения: все изменения от одного участника должны без пропусков и без дублирования дойти до каждого участника в строго определённом порядке. Что порой не так-то просто обеспечить.

Беспорядочная сходимость

Оказывается, можно пойти ещё дальше и вообще не полагаться на порядок применения изменений. Так появились конвергентные бесконфликтные реплицируемые типы данных или CvRDT.

CvRDT: Conflict-free Convergent Replicated Data Type

Тут уже изменения могут приходить в произвольном порядке, могут дублироваться, а могут и вообще потеряться, но последующие изменения всё же обеспечат конвергенцию.

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

CROWD — CvRDT нового поколения

Именно на конвергентные типы данных я и делаю ставку в своих проектах, используя уникальные CROWD алгоритмы для синхронизации распределённых состояний..

Но это уже совсем другая история, достойная отдельного разбора.

Согласны?

Подведём итоги. Пройдя по всем ступеням эволюции алгоритмов обеспечения консенсуса, у нас получилась стройная, непротиворечивая классификация с чёткими границами между понятиями. Мы выявили общие подходы в самых разных областях компьютерной науки. А так же разобрали ряд популярных заблуждений.

Консистентность данных что это. Смотреть фото Консистентность данных что это. Смотреть картинку Консистентность данных что это. Картинка про Консистентность данных что это. Фото Консистентность данных что это

Что ещё почитать?

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

Буду рад, если подкинете ещё каких-либо материалов по этой теме.

Продолжение следует..

Если мне с вами удалось сейчас достигнуть консенсуса, то дайте мне об этом знать посредством лайка. Если же нет — обязательно пришлите мне дельту в комментарии. Но в любом случае подписывайтесь на канал, чтобы не пропустить обновления. И, конечно, делитесь ссылкой на источник истины со знакомыми участниками во имя всеобщей конвергенции.

А на этом пока что всё. С вами был… беспорядочный программер Дмитрий Карловский.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *