--- aliases: - репликация базы данных - репликацию бд tags: - зрелость/🌱 date: - - 2024-03-10 zero-link: - "[[00 DevOps]]" - "[[00 Базы Данных]]" - "[[00 Архитектура ПО]]" parents: - "[[_inbox/Репликация|Репликация]]" linked: --- ## Тезисы - Репликация это копирование измененных данных с одного сервера бд на другой. - Не отменяет первоначального копирования БД. Сначала нужно первый раз скопировать данные, а потом уже запустить репликацию. - Обычно реализуются на [Журнал БД](Журнал%20БД.md) - Репликации БД: - [Репликация в MySQL](Репликация%20в%20MySQL.md) - [Репликация в PostgreSQL](Репликация%20в%20PostgreSQL.md) - Плюсы репликации: - Помогает улучшить [High Availability](High%20Availability.md). Помогает при падении. - Ускоряет чтение - Проблемы репликации: - Не ускоряет запись в БД - Репликация не является [резервной копией БД](Резервные%20копии%20БД.md). - [Отставание реплики в БД](Отставание%20реплики%20в%20БД.md) - Репликация это ресурсозатратно. *** Репликация позволяет сделать N копий одной БД. Обычно есть одна ведущая копия, которую называют master, и есть N ведомых реплик, которые называют slaves. Не отменяет первоначального копирования БД. Сначала нужно первый раз скопировать данные, а потом уже запустить репликацию. **Для чего делают репликацию?** - Увеличение [High Availability](High%20Availability.md) БД. Одна БД падает, ее заменяет реплика. - Позволяет получить масштабирование чтения, но ==не позволяет получить масштабирование операций вставки.== Для масштабирования вставки используется [Шардирование](Шардирование.md). - Чтобы делать асинхронное [резервное копирование БД](Резервные%20копии%20БД.md) - Чтобы распределить нагрузку. Например перенести сложные запросы построения отчетов на отдельную реплику. Прямой способ сделать репликацию - это скопировать [Журнал БД](Журнал%20БД.md) с мастера на слэйв и применить его на слейв. PostgreSQL работает именно так используя журнал [WAL](Write-Ahead%20Log.md). ![](Pasted%20image%2020240531083508.png) ## Проблемы репликации - [Отставание реплики в БД](Отставание%20реплики%20в%20БД.md) - [Монотонное чтение](Монотонное%20чтение.md) ## Классификация репликаций - По синхронизации. Гарантия наличия и доступности. - [Синхронная репликация](Синхронная%20репликация.md) - [Асинхронная репликация](Асинхронная%20репликация.md) - [Полу-синхронная репликация](Полу-синхронная%20репликация.md) - По уровню работы - Физическая репликация. Работа на уровне хранилища, мы работаем напрямую со страницами памяти - [Write-Ahead Log](Write-Ahead%20Log.md) в PostgreSQL - [InnoDB Undo/Redo Log](Журналы%20в%20MySQL.md#InnoDB%20Undo/Redo%20Log) в MySQL - Логическая репликация. Работает с кортежами. Мы храним набор кортежей до и после. - [Row-based Binary Log](Журналы%20в%20MySQL.md#Row-based%20Binary%20Log) в MySQL - [Statement-based Binary Log](Журналы%20в%20MySQL.md#Statement-based%20Binary%20Log) недоразумение, которое работает на уровне запросов. Для такой репликации нужно выполнять запрос на слейве, и если запрос выполнялся 30 минут, то и на слейве он будет выполняться 30 минут. Также присутсвует зависимость в функциях, например функция времени вернет одно значение на мастере и совершенно другое на слейве. - По расспространению изменений - push. мастер сует, слейву пофиг. Реализуется редко. (Postgres) - pull. слейв качает, мастеру пофиг. (MySQL) - По количеству точек записи - [Репликация master-slave](Репликация%20master-slave.md) - [Репликация master-master](Репликация%20master-master.md) - [Безмастерная репликация](Безмастерная%20репликация.md) - [Групповая репликация](Групповая%20репликация.md). Реализовано в MySQL. - Как master-master, но при количестве узлов больше 2 ## Асинхронная репликация В асинхронной репликации обычно есть мастер, куда мы пишем, и есть слэйв, с которого только читаем. Здесь допустима задержка обновления слейвов. Также при таком подходе можно использовать слейвы для разных действий, например один слейв отдать под отчетность, второй под бэкапы. ![](Pasted%20image%2020240528085716.png)