Мы все использовали или слышали о репликации базы данных в какой-то момент, но вы когда-нибудь задавались вопросом, как это работает под?
Это именно то, что мы будем делать здесь.
Репликация в основном копирует объект из одного пространства в другое. Репликация неизменных объектов, таких как файл фильма, так же просто, как копирование его байтов.
Репликация базы данных, которая является смежным объектом, поставляется со своими собственными задачами. Как вы копируете объект, который всегда меняется? Ты не!
Журналы
Журналы являются наиболее важной частью процесса репликации базы данных. Основная идея журнала — записать каждую базу данных действий. Мы должны быть в состоянии воспроизвести эти журналы для восстановления коррумпированной базы данных с нуля Так что имеет смысл держать их в порядке.
Давайте представем представить к ключу/Value Store. В этой базе данных у нас есть 3 различных типа операции:
Установить: Устанавливает значение к ключуПолучить: Извлекает значение ключаУдалить: Удалить ключ
Это набор инструкций нашей базы данных. Теперь давайте использовать их.
Я хочу установить ценность Джон к ключу имя так что мой журнал операций был бы:
{
"operation": "SET",
"key": "name",
"value": "john"
}
Теперь давайте изменим значение того же ключа в эфир :
{
"operation": "SET",
"key": "name",
"value": "eli"
}
И наконец, давайте удалим это:
{
"operation": "DELETE",
"key": "name"
}
Как видите, журналы — это только операции, которые каким-либо образом мутируют базу данных. Но что-то отсутствует в этих журналах. Заказ!
Мы должны как-то не только держать их по порядку, но чтобы быть в состоянии восстановить из определенной позиции в журналах.
2 очевидных варианта:
- Инкрементное целое число: назначить увеличение количества для каждого журнала
- Timestamp: запишите временную метку, когда журнал был выполнен
Мы идем с первым вариантом на данный момент. Мы выполнили 3 операции, поэтому журналы будут:
[
{
"id": 1,
"operation": "SET",
"key": "name",
"value": "john"
},
{
"id": 2,
"operation": "SET",
"key": "name",
"value": "eli"
},
{
"id": 3,
"operation": "DELETE",
"key": "name"
}
]
Теперь наши журналы заказываются и ищут из ID Отказ Мы можем восстановить базу данных в любой момент времени.
Я думаю, что вы поняли идею сейчас. Когда мы говорим о репликации, мы говорим о копировании этих журналов в другое пространство. Если мы репликация базы данных на другой сервер, мы непрерывно отправляем эти журналы на второй сервер и скажуте его точно воспроизвести эти журналы. Если соединение капель или что-то плохое случается, мы всегда знаем, где начать снова, потому что у нас уже есть сортировка ID Отказ
Теперь мы знаем, как базы данных разделяют свое государство с другими случаями. В следующем разделе мы говорим о 2 очень основных типах репликации.
Типы
Синхронный
В синхронной репликации мы совершаем изменения на все экземпляры, прежде чем вернуться к клиенту.
Представьте, что у нас есть 3 экземпляра в кластере базы данных, и мы хотим использовать тип синхронного репликации.
Когда мы отправляем Установить Операция, представляющая собой, что является мастером, он немедленно отправляет журнал в другие экземпляры реплик. Эти реплики выполняют журнал и позволяют мастеру знать, что они выполнили журналы. После того, как убедившись, что все реплики выполнили изменение, сам мастер также выполняет журнал и возвращает ответ на то, чтобы пользователь узнал, что изменение было успешно выполнено.
Преимущество этого типа — это уровень последовательности, который мы получаем, выполняя изменение всех экземпляров, прежде чем совершать изменения.
И недостаток является накладным расходом в задержестве, что приводит к тому, что весь процесс будет медленным.
Асинхронный
В отличие от синхронного типа, в этом типе мы не можем гарантировать последовательность, потому что мы рассмотрим изменения, совершенные до его выполнения в других случаях.
Как и прежде, представьте, что у нас есть 3 экземпляра в кластере базы данных, и мы хотим использовать асинхронный тип репликации.
Когда мы отправляем Установить Операция, представляющая собой, что является мастером, он генерирует журнал и выполняет его. После этого асинхронный процесс отправки журналов на другие экземпляры начинается, но мастер не будет ждать их, и он немедленно возвращается пользователю с успешным ответом.
Преимущество этого типа является операциями записи с низкой задержкой, поскольку оно только мутирует мастера перед тем, как считаться совершенным.
Недостатком этого типа является отсутствие гарантии согласованности, поскольку мы не можем быть уверены, что репликация имеет место вообще. Мастер может быть пойман в огне, прежде чем получить возможность отправить журнал в другие реплики:)
Последовательность
Мы говорили о том, как процесс репликации может быть синхронным или асинхронным. Но давайте вернемся на шаг назад и обсудим согласованность с точки зрения распределенных систем.
В распределенной системе, подобной реплицированной кластере базы данных, нам нужен какой-то тип последовательности, потому что это вся цель репликации!
Согласованность достигается, когда несколько узлов согласны на одном состоянии.
Давайте покажем это на примере.
Состояние узла A:
[
{
"key": "name",
"value": "eli"
}
]
Состояние узла B также есть:
[
{
"key": "name",
"value": "eli"
}
]
Как видите, оба узла соглашаются, что значение Имя это эфир Так они последовательны.
Существует несколько уровней последовательности и на самом базовом уровне, он коррелирует до типов репликаций.
Мы обсудим 2 типа последовательности здесь.
Сильная последовательность
В распределенной системе, которая поддерживает сильную консистенцию, все узлы всегда согласуются в любой момент. Неважно, какой узел вы пишете или читаете от; Результат всегда гарантируется одинаковым.
Эта согласованность достигается с использованием консенсусных протоколов, таких как Paxos или Raft.
Слабая последовательность
Во многих случаях нам не очень нужна сильная консистенция или необходимость какого-либо другого свойства, которая не может сосуществовать с сильной последовательностью.
В этом типе последовательности нет никакой гарантии, что состояние вашей реплики актуальна с мастером.
Возможная согласованность
Возможная консистенция — это тип слабой последовательности. Как предполагает имя, возможная консистенция гарантирует, что, хотя реплики могут не быть в курсе, но в конечном итоге будет соответствовать мастеру.
В основном, если вы перестанете писать мастеру, через некоторое время все узлы будут последовательными, и все реплики будут отвечать на самые последние значения для вас.
Синхронизация репликации
Мы уже говорили о синхронной и асинхронной репликации, но в этом разделе мы обсуждаем более подробно, а также о его реальной реализации.
Перед совершением любой транзакции нам необходимо убедиться, что все узлы находятся на одной странице. Это только консенсус, поэтому нам нужно один.
Синхронная репликация требует круговой поездки от Master до большинства или всех узлов для каждого журнала, и поэтому синхронные репликации могут быть действительно медленными по сравнению с асинхронной репликацией. Сильная консистенция имеет огромную стоимость!
Самый известный консенсус-протокол — Paaxos Но это не самый простой протокол, чтобы объяснить. Существует новый блестящий протокол, называемый плотом, который получил много тяги за последние несколько лет, и многие крупные проекты, такие как ETCD, уже используют его. Это намного легче учиться по сравнению с Paxos.
Плот
RAFT — это относительно новый асимметричный консенсус-протокол, предназначенный для того, чтобы быть очень легко понять.
Узлы в плоте всегда всегда в одном из этих состояний:
- Последователь
- Кандидат
- Лидер
Одним из самых важных вещей в плоте является тот факт, что подписчики доверяют лидеру и будут перенаправлять все операции пишета лидера. Лидер будет координировать все изменения.
Плода ломтит время в термины. Думайте о них точно так, как выборы. В начале термина узлы становятся кандидатами, голосуют за себя и просят других проголосовать за них. Через некоторое время избран лидер, и плот начинает обмен сообщениями между узлами.
Указывается время ожидания выборов, чтобы убедиться, что всегда есть лидер. Этот тайм-аут оттолкнулся обратно в пинг-сообщения по лидеру, но если лидер подходит или потерпел неудачу, произойдет еще один выборов, и все эти шаги повторяются до тех пор, пока не избран другой лидер.
Реальный мир
Магазин клавиши EtCD/Value Country Cover Cower Kubernetes — хороший пример здесь. Он использует плоту для репликации журналов синхронно для достижения сильной консистенции.
Вы можете увидеть реализацию etcd of Raft здесь: https://github.com/etcd-io/etcd/tree/main/raft.
Асинхронная репликация
Хорошо, давайте поговорим немного больше о асинхронной репликации. Теперь вы знаете, как асинхронная репликация работает в теории. Некоторые журналы отправляются асинхронно, и нет никакой гарантии последовательности в любой момент.
Мы обсудим заказную репликацию журнала здесь, что действительно просто с несколькими проблемами.
Заказанная репликация журнала
Как следует из названия, эта техника включает в себя сохранение упорядоченного списка журналов и отправки их на провод, асинхронно.
Средство упорядочения, которое пишет, обычно пишет для мастера, чтобы обеспечить консистенцию конечного результата. Все журналы помечены временем метки или дополнительным числом.
Сразу же вы заметите узкое место здесь, так как все журналы должны быть заказаны. Некоторые базы данных используют Sharding, чтобы увеличить пропускную способность.
Каждая из этих проблем может быть опубликованным себе, и большинство из них также присутствуют в синхронном типе репликации.
Реальный мир
Репликация MySQL является действительно хорошим примером этого типа репликации.
MySQL сохраняет упорядоченный журнал каждого изменения в мастере, используя инкрементное целое число, известное как положение.
Журналы хранятся в файлах BinLog- * и регулярно вращаются. Реплики (известные как рабы в MySQL — к счастью, решать) получить эти журналы и выполнять их.
Основной процесс добавления реплик к MySQL слишком сильно. Это требует, чтобы вы сделали снимок базы данных и записывать основную позицию, а затем восстановить этот снимок в реплике и запустите процесс репликации с этого точного положения. Многие другие базы данных делают то же самое под Но я думаю, что MySQL может сделать это, не требуя пользователей выполнять эти задачи вручную.
Заключение
В этом посте мы узнали немного больше о репликации базы данных и ее различные типы. Мы обсудили разные уровни последовательности и о том, как репликация работает в реальном мире.
Я могу написать больше о базах данных в будущем. Дайте мне знать, если вы заинтересованы:)
Спасибо за уделенное время.
Ссылки
- http://charap.co/reading-group-paxos-vs-raft-have-we-reached-consensus-on-distributed-consensus/
- https://raft.github.io/raft.pdf
- https://www.cl.cam.ac.uk/teaching/0910/ConcDistS/11a-cons-tx.pdf
Оригинал: «https://dev.to/satrobit/a-closer-look-into-the-world-of-database-replication-57k2»