Расскажите о согласованности данных

Java задняя часть

Что такое согласованность данных

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

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

Момент времени Постоянство

Я думаю, что согласованность на момент времени также можно назвать согласованностью реплики Определение согласованности на момент времени:

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

Если вы знаете определение теории CAP, то вы не должны быть слишком незнакомы. (Если вы незнакомы, вы можете прочитать мою статьюРаспределенная транзакция)

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

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

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

Транзакционная согласованность

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

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

Согласованность транзакции может существовать только до начала транзакции и после ее завершения, и данные могут быть несогласованными во время транзакции. Например: например, A переводит 100 юаней B, A вычитает 100, а B добавляет 100. До начала транзакции и после ее завершения их учетные записи могут быть гарантированно правильными, тогда это согласованность транзакции. Однако в ходе транзакции может возникнуть ситуация, когда А вычитает 100 юаней, а Б не добавляет 100 юаней, что является несоответствием.

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

Согласованность приложений

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

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

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

непротиворечивая модель

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

Что, если кто-нибудь спросит вас, какие модели согласованности вы знаете? Многие люди сразу же ответили, твердое согласие и, в конце концов, согласие. На самом деле модель согласованности — это гораздо больше.Operational Characterization of Weak Memory Consistency ModelsВ этой статье описываются 15 моделей слабой согласованности памяти, и в Википедии есть еще описания моделей памяти.

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

Линейная согласованность

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

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

Что делает линейная согласованность? В книге «DDIA» описаны следующие три функции:

  • Блокировка и выбор главного узла: система репликации ведущий-подчиненный должна гарантировать наличие только одного главного узла, иначе произойдет разделение мозга. Выбор нового мастера обычно осуществляется с помощью блокировок: каждый запускаемый узел должен получить блокировку. И эта блокировка должна удовлетворять линеаризуемости, чтобы все узлы одновременно соглашались с тем, какой узел имеет блокировку. Наш ZooKeeper можно использовать для предоставления функций распределенной блокировки, поэтому можем ли мы сказать, что ZooKeeper удовлетворяет требованиям линейной согласованности? Можно сказать, что это только часть правильности, и согласованность ZK будет объяснена снова, когда согласованность последовательности будет повторена позже.
  • Ограничения и гарантии уникальности: например, два одинаковых имени файла не допускаются в одном и том же файловом каталоге, а первичный ключ базы данных не может повторяться, и все это необходимо линеаризовать. На самом деле, они похожи по своей природе на блокировку, например, если имя файла одинаковое, это фактически операция блокировки имени файла, а затем его сохранение, и более позднее сохранение, естественно, пойдет не так.
  • Зависимость от времени по каналам: почему предыдущий пример привязки нарушается? Причина в том, что мы проинформировали этот канал через наших друзей и заранее сообщили нам, что товар распродан. То же самое, если в нашем компьютере несколько каналов. Например, в сценарии пользовательской транзакции, если пользователь использует 50 юаней, то из его баланса будет вычтено 50 юаней.В это время событие отправляется в виде очереди сообщений, а затем служба SMS запросит баланс пользователя. а затем Отправить короткое сообщение.Если подчиненная база данных баланса не обновила данные в это время, то короткое сообщение может получить старый баланс пользователя. Причина несоответствия здесь в том, что есть дополнительный канал, который совпадает с каналом, который наш друг выше сказал нам, был распродан. Решением этого может быть управление каналом, например, передача баланса пользователя в качестве параметра или чтение только основной библиотеки. В примере со спайком вы можете использовать телефон вашего друга вместо своего телефона.

последовательная согласованность

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

Здесь мы возвращаемся к тому, какая согласованность у Zookeeper? Есть много вопросов на интервью, которые спрашивают, является ли Zookeeper CP или AP? Многие люди ответят, что Zookeeper — это CP.На самом деле, этот ответ не очень строгий.Из линейной согласованности мы знаем, что согласованность в CAP относится к линейной согласованности, поэтому можем ли мы сказать, что Zookeeper линейно непротиворечив? ответ отрицательный. Когда мы запишем значение, оно будет передано лидеру для обработки.Протокол Zab должен только убедиться, что половина ведомых узлов успешны, тогда данные некоторых узлов будут старыми данными, чтобы клиент мог прочитать данные не актуальны, что нарушает линейную согласованность.

Zookeeper на самом деле реализует последовательную согласованность.ZK использует zxid (идентификатор транзакции ZooKeeper) для достижения общей последовательной согласованности.Конечно, можно считать, что запись Zookeeper — линейная согласованность, а чтение — последовательная согласованность. Ведомый узел получает трансляцию ведущего последовательно через zxid, поэтому ZK не может гарантировать, что вся информация будет видна сразу, но в конечном итоге она будет видна. Конечно, Zookeeper действительно может добиться линеаризации.В ZK есть команда sync(). Пока мы вызываем sync() для принудительной синхронизации данных каждый раз, когда мы читаем, мы можем гарантировать, что они актуальны. .

Последовательная согласованность была предложена Лэмпортом (автором алгоритма Paxos), и первоначально она использовалась для определения согласованности многопроцессорной памяти. В работе Лампорта «Как создать многопроцессорный компьютер, который правильно выполняет многопроцессорные программы» что это определено? Последовательная согласованность:

the result of any execution is the same as if the operations of all the processors were executed in some sequential order, and the operations of each individual processor appear in this sequence in the order specified by its program.

Общий смысл этого предложения заключается в том, что эффект выполнения нескольких процессоров такой же, как и у одного процессора, и операции каждого независимого процессора появятся в очереди операций в указанном порядке. Первоначально это использовалось для параллельного программирования, но это действительно бесполезно для выполнения нескольких процессоров и однопроцессорных систем, а затем используется в распределенных системах. Все операции записи в ZK будут переданы узлу-лидеру, и все операции будут обновлены в соответствии с порядком zxid.Вот указанный выше порядок, указанный выше.Эта очередь находится в порядке zxid.

причинно-следственная связь

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

Как понять причинно-следственную связь? Проще говоря, если кто-то задает вам вопрос, а вы даете ответ, то это две причинно-следственные связи, но если вы даете ответ до вопроса, то это нарушает причинно-следственную связь. Для простого примера, если узел 1 обновляет данные A, узел 2 считывает данные A и обновляет данные B, где данные B могут быть рассчитаны на основе данных A, все с причинно-следственной связью, но если узел 3 видит, что B обновляется первым, то A обновляется, то каузальная непротиворечивость разрушается.

когерентность процессора

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

согласованность FIFO

Когерентность FIFO — это более слабая форма когерентности процессора, она не должна гарантировать согласованность операций записи в одно и то же место. Это означает, что обо всех операциях записи, выполненных на одном процессоре, будут уведомлены все остальные процессоры в том порядке, в котором они произошли на самом деле, однако записи, выполненные на разных процессорах, могут быть видны в порядке выполнения. В распределенной системе это отражает то, что задержка разных узлов в сети может быть разной. Чтобы проиллюстрировать отличие от когерентности процессора, вот несколько примеров:

На приведенном выше рисунке видно, что согласованность процессора нарушена, почему, поскольку порядок записи w(x)1, w(x)2, p4 должен быть сначала R(x)1, а затем R(x) 2 . Но это согласуется с FIFO, FIFO нужно только уведомлять другие процессоры или узлы о своем собственном порядке появления и не нужно гарантировать, что одно и то же значение записывается в том же порядке.

окончательная согласованность

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

BASE Theory E является окончательным соглашением.

Что такое модель согласованности использования

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

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

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

Суммировать

В этой статье в основном рассказывается о том, что такое согласованность, включая многие модели согласованности.Здесь я расскажу о двух согласованностях, согласованности транзакций и согласованности приложений.Если вам интересно, вы можете прочитать ее.Распределенная транзакция. Есть еще вещь, о которой стоит упомянуть.Она неотделима от согласованности.Информация, такая как RAFT, PAXOS, ZAB и т.д.

Наконец, также даст вам несколько вопросов:

  1. Какова модель согласованности ZK?
  2. Какова модель согласованности master-slave Mysql?
  3. Какова модель согласованности главного мастера Mysql?
  4. Какова ваша обычная модель согласованности?

Последняя статья была включена в JGrowing-CaseStudy, всеобъемлющий и отличный маршрут изучения Java, совместно созданный сообществом. Если вы хотите участвовать в обслуживании проектов с открытым исходным кодом, вы можете создать его вместе. Адрес github:GitHub.com/Java растет…Пожалуйста, дайте мне маленькую звезду.

Добро пожаловать в сообщение и я обсуждаю, конечно же, лучше всего обратить внимание на мой номер паблика и я его обсужу.Если вы считаете, что эта статья полезна для вас, то ваше внимание и пересылка - самая большая поддержка для меня, о( _∩) О:

Справочная документация: