В чем разница между базами данных ACID и BASE?
ACID и BASE – это модели транзакций для баз данных, которые определяют структуру данных и порядок работы с ними в базе данных. В контексте баз данных транзакцией называют любую операцию, которую база данных обрабатывает как единую единицу работы. Чтобы база данных оставалась согласованной, транзакция должна быть полностью завершена. Например, если вы переводите деньги с одного банковского счета на другой, нужно отразить эти изменения и на вашем счете, и на счете получателя. Такую транзакцию невозможно считать завершенной без выполнения обоих шагов.
В базах данных ACID приоритет отдается согласованности в ущерб доступности. Если на любом этапе транзакции возникает ошибка, вся транзакция полностью отменяется. Напротив, базы данных BASE отдают приоритет доступности в ущерб согласованности. При неудачном завершении транзакции пользователи могут временно получать несогласованные данные. Согласованность данных восстанавливается с некоторой задержкой.
Для чего важны ACID и BASE?
Современные базы данных представляют собой распределенные хранилища данных, которые реплицируют данные между несколькими узлами, соединенными по сети. Они позволяют пользователям выполнять в одной транзакции разные операции с данными, например чтение и запись. Пользователи ожидают, что по завершении транзакции данные останутся согласованными на всех узлах. Но теории информатики есть теорема Брюэра (теорема CAP), согласно которой любое распределенное хранилище данных может обеспечить только две из следующих трех гарантий:
- согласованность: каждая операция чтения возвращает данные с учетом всех обновлений или ошибку;
- доступность: каждый запрос к базе данных получает успешный ответ без строгой гарантии актуальности данных;
- устойчивость к разделению: система продолжает работать даже при потере связи или задержках сообщений между распределенными узлами.
Например, когда покупатель добавляет товар в корзину на веб-сайте электронной коммерции, все остальные покупатели должны увидеть снижение уровня запасов этого товара. Если очередной покупатель добавит в корзину последний экземпляр, все остальные пользователи должны увидеть, что товара нет в наличии. Разработчикам баз данных нужно сделать выбор о поведении базы данных в том случае, если какая-либо операция в транзакции не может быть выполнена. База данных может действовать по одному из следующих принципов.
- Отменить транзакцию и возвратить сообщение об ошибке, что снизит доступность, но гарантирует согласованность. Покупатель в таком случае не сможет добавить товар в корзину или другие покупатели не получат данных по некоторым товарам, пока не завершатся все операции добавления в корзину.
- Продолжать остальные операции, что обеспечит максимально возможную доступность, но может приводить к несогласованности. В этом случае покупатель успешно добавит товар в корзину, а другие покупатели получат сведения об уровне запасов, но эти сведения будут неверными по крайней мере в течение некоторого времени.
В некоторых случаях согласованность имеет решающее значение, и тогда предпочтение отдается архитектуре ACID. Но есть и другие сценарии использования, в которых согласованность не критична. Например, когда вы принимаете запрос на добавление в друзья в социальной сети, никого не беспокоит, что другие пользователи некоторое время видят неточное количество друзей в вашем профиле. Вам более важно, чтобы доступ к ленте сообщений не пропадал на период синхронизации данных. В таких сценариях предпочтительным будет модель BASE.
Сравнительный анализ ключевых принципов ACID и BASE
Аббревиатуры ACID и BASE обозначают разные подходы к архитектуре базы данных, которые влияют на поведение базы данных при обработке транзакций.
ACID
ACID означает атомарность (Atomicity), консистентность (Consistency), изоляцию (Isolation) и надежность (Durability).
Атомарность
Атомарность гарантирует, что все этапы каждой транзакции в базе данных будут либо полностью завершены, либо возвращены в исходное состояние. Например, в системе бронирования обе задачи (бронирование мест и обновление сведений о клиенте) должны выполняться как единая транзакция. Недопустимо резервировать места, если эти данные не отражены в профиле клиента. В случае сбоя в любой части транзакции никакие данные не изменяются.
Согласованность
Согласованность гарантирует соответствие данных заранее заданным ограничениям по целостности и бизнес-правилам. Даже если несколько пользователей одновременно выполняют сходные операции, все они получают одинаковые данные. Например, согласованность гарантирует, что общий баланс денежных средств в системе остается неизменным при переводе средств с одного счета на другой. Если на счете A было 200 USD, а на счете B 400 USD, то общий баланс составлял 600 USD. После перевода 100 USD со счета A на счет B на первом осталось 100 USD, а на втором стало 500 USD. Общий баланс остается прежним: 600 USD.
Изоляция
Изоляция гарантирует, что каждая новая транзакция, обращающаяся к определенной записи, должна до начала работы дождаться завершения предыдущей транзакции. Это гарантирует, что параллельные транзакции не будут мешать друг другу, как если бы они выполнялись последовательно. В качестве примера можно привести многопользовательскую систему управления запасами. Если один пользователь обновляет количество некоторого продукта, другой пользователь при запросе сведений об этом продукте всегда получает согласованное и изолированное представление данных, которое не учитывает обновления первого пользователя, пока они не будут зафиксированы.
Надежность
Надежность означает сохранение всех зафиксированных транзакций в базе данных даже в случае сбоя системы. Это означает, что все внесенные в транзакциях ACID изменения всегда сохраняются и не подвержены влиянию последующих сбоев системы. Например, если пользователь приложения для обмена сообщениями отправляет сообщение другому пользователю и получает подтверждение об успешной доставке, свойство надежности гарантирует, что это сообщение никогда не будет потеряно. Данные сохраняются даже при сбоях приложения или сервера.
BASE
BASE означает базовую доступность (Basically Available), мягкое состояние (Soft state) и согласованность «в конечном счете» (Eventually consistent). Аббревиатуры BASE и ACID специально подбирались так, чтобы в английском языке они противопоставлялись друг другу, поскольку эти же слова обозначают химически противоположные термины «щелочь» и «кислота».
Базовая доступность
Базовая доступность означает, что база данных должна быть доступна одновременно для всех пользователей в любое время. Пользователю не нужно ждать, пока завершатся другие транзакции, прежде чем обновлять запись. Например, в случае внезапного роста трафика система электронной коммерции может отдавать предпочтение выдаче списков и приему заказов. Не страшно, если обновление количества запасов будет выполнено с небольшой задержкой, зато пользователи продолжают покупать товары.
Мягкое состояние
Мягкое состояние здесь означает, что любые данные могут находиться в промежуточных или временных состояниях и в некоторый момент изменяться «сами по себе», без внешних событий или поступления новых данных. Эта концепция отражает неопределенное состояние записи, которую обновляют несколько приложений одновременно. Значение такой записи будет окончательно определено только после завершения всех транзакций. Например, если пользователи редактируют сообщение в социальной сети, внесенные ими изменения могут быть не сразу видны другим пользователям. Через некоторое время система учтет все внесенные изменения, и произойдет обновление сообщения, хотя ни один пользователь его не инициировал.
Согласованность в конечном счете
Согласованность в конечном счете означает, что запись достигнет согласованности не сразу, а после завершения всех одновременных обновлений. После этого все приложения, запрашивающие эту запись, увидят одно и то же значение. Давайте рассмотрим в качестве примера распределенную систему редактирования документов, в которой несколько пользователей могут одновременно редактировать документ. Если пользователь A и пользователь B одновременно редактируют один и тот же раздел документа, их локальные копии могут временно различаться, пока не завершатся процессы распространения и синхронизации. Однако со временем, «в конечном счете», система достигает согласованности, распространяя и объединяя все изменения от разных пользователей.
Ключевые различия между ACID и BASE
При выборе между моделями транзакций ACID и BASE для баз данных нужно искать компромиссы.
Масштабирование
База данных с моделью транзакций ACID масштабируется хуже, поскольку она ориентирована на согласованность. Для любой записи в любой момент времени может выполняться только одна транзакция, что затрудняет горизонтальное масштабирование.
С другой стороны, базу данных с архитектурой BASE легко масштабировать по горизонтали, поскольку нет необходимости поддерживать строгую согласованность. Простое добавление нескольких узлов в кластер позволяет базе данных с архитектурой BASE повысить доступность данных, которая является основополагающим принципом этой архитектуры базы данных.
Гибкость
Базы данных ACID менее гибки в обработке данных. Такая база данных должна гарантировать немедленную согласованность, поэтому она может ограничивать доступ к некоторым приложениям в случае сбоев в сети или в электроснабжении. Аналогичным образом, приложениям приходится ждать своей очереди на обновление данных, если другие программные модули уже обрабатывают некоторую запись. Базы данных BASE намного более гибкие. В архитектуре BASE не используются строгие ограничения, и приложения могут изменять записи по мере появления обновлений.
Производительность
База данных ACID может испытывать проблемы с производительностью при обработке больших объемов данных или параллельных запросов. Поскольку все операции обрабатываются в строгом порядке, накладные расходы на поддержание целостности транзакций приводят к дополнительным задержкам, которые влияют на доступ всех приложений к затронутой записи.
Напротив, к базе данных BASE приложения могут обращаться для обработки записей в любое время. Это позволяет избежать длительного времени ожидания и повышает пропускную способность базы данных.
Синхронизация
База данных с архитектурой ACID нуждается в механизме синхронизации, чтобы выполненные в транзакции изменения были зафиксированы одновременно во всех связанных записях. В то же время, каждая изменяемая запись должны быть заблокирована от доступа других сторон до завершения или отмены транзакции. База данных BASE, в свою очередь, работает без блокировки записей и поддерживает только согласованность «в конечном счете», без каких-либо гарантий по времени ее достижения. При работе с базами данных BASE разработчики понимают, что при обработке записей могут и будут возникать несоответствия, и принимают необходимые меры предосторожности в самом приложении.
Когда что использовать: ACID в сравнении с BASE
Несмотря на существенные различия, системы баз данных ACID и BASE применяются в разных приложениях. ACID идеально подходит для корпоративных приложений, в которых требуются согласованность, надежность и предсказуемость данных. Например, банки всегда используют для хранения транзакций клиентов базу данных с архитектурой ACID, поскольку целостность данных здесь является главным приоритетом. В свою очередь, базы данных BASE лучше подходят для аналитической обработки слабо структурированных данных в больших объемах. Например, веб-сайты электронной коммерции используют базы данных с архитектурой BASE для хранения цен на товары, которые часто меняются. В этом случае точность отображения цен менее важна, чем своевременное информирование клиентов об изменении цены.
Может ли база данных быть одновременно ACID и BASE?
Согласно теореме CAP, база данных может удовлетворять только двум из трех требований: согласованность, доступность и устойчивость к разделению. Обе модели баз данных ACID и BASE обеспечивают устойчивость к разделению, то есть не могут быть одновременно высокосогласованными и постоянно доступными. Это означает, что любая база данных может больше или меньше соответствовать концепции ACID или BASE, но не может использовать оба подхода одновременно. Например, базы данных SQL структурируются по модели ACID, а базы данных NoSQL используют архитектуру BASE. Некоторые базы данных NoSQL могут обладать определенными свойствами, характерными для ACID, но никогда не могут полностью соответствовать концепции ACID.
Краткое описание различий между ACID и BASE
ACID |
BASE |
|
Масштабирование |
Масштабируется вертикально. |
Масштабируется горизонтально. |
Гибкость |
Меньше гибкости. При обработке блокирует определенные записи из других приложений. |
Больше гибкости. Позволяет нескольким приложениям одновременно обновлять одну запись. |
Производительность |
Производительность снижается при обработке больших объемов данных. |
Умеет обрабатывать большие неструктурированные данные с высокой пропускной способностью. |
Синхронизация |
Да. При синхронизации добавляется задержка. |
Синхронизация на уровне базы данных отсутствует. |
Как AWS может удовлетворить ваши требования к базам данных ACID и BASE?
Базы данных в Облаке AWS предоставляют ряд сервисов ACID и BASE для любых сценариев использования данных. Организации развертывают свои базы данных в среде AWS, чтобы снизить затраты времени на подготовку, масштабирование и администрирование инфраструктуры хранения данных. Пример
- Amazon DynamoDB – это быстрый сервис баз данных BASE, который обеспечивает обработку данных для облачных приложений за несколько миллисекунд.
- Amazon MemoryDB – это еще одна база данных BASE, которая позволяет разработчикам развертывать надежные и высокодоступные базы данных Redis для веб-приложений и мобильных приложений.
- AWS RedShift – это облачное хранилище данных ACID, которое позволяет выполнять сложные аналитические запросы на языке SQL для бизнес-аналитики.
Начните работать с базами данных ACID и BASE, создав аккаунт прямо сейчас.