Что такое репликация в базах данных и какие её основные типы

Ответ

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

Основные цели репликации:

  • Отказоустойчивость: Если основной сервер выходит из строя, один из реплицированных серверов может взять на себя его роль.
  • Балансировка нагрузки: Запросы на чтение можно распределить между несколькими репликами, снижая нагрузку на основной сервер.
  • Географическое распределение: Размещение реплик ближе к пользователям уменьшает задержку доступа к данным.

Основные типы репликации

  1. Master-Slave (Primary-Replica)

    • Принцип: Все операции записи (INSERT, UPDATE, DELETE) выполняются на одном главном узле (master), а затем копируются на один или несколько ведомых узлов (slaves). Slaves обычно обрабатывают только запросы на чтение.
    • Преимущества: Простота настройки, отсутствие конфликтов записи.
    • Недостатки: Master является единой точкой отказа.
  2. Master-Master (Multi-Master)

    • Принцип: Все узлы в кластере являются главными и могут принимать как запросы на чтение, так и на запись. Изменения, сделанные на одном узле, синхронизируются с остальными.
    • Преимущества: Высокая доступность записи; нет единой точки отказа.
    • Недостатки: Сложность разрешения конфликтов (когда одни и те же данные изменяются одновременно на разных узлах).

Пример: логическая репликация в PostgreSQL

-- 1. На MASTER-сервере создается публикация для таблицы 'users'
CREATE PUBLICATION user_publication FOR TABLE users;

-- 2. На SLAVE-сервере создается подписка на эту публикацию
CREATE SUBSCRIPTION user_subscription
    CONNECTION 'host=master.db.example.com port=5432 user=replicator password=secret dbname=main_db'
    PUBLICATION user_publication;

После этого все изменения в таблице users на master-сервере будут автоматически копироваться на slave-сервер.

Ответ 18+ 🔞

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

Зачем это вообще нужно, спросишь?

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

Два главных способа устроить этот цирк

  1. Ведущий-ведомый (Master-Slave)

    • Суть: Писать можно только в одного царя-батюшку (master), а его подчинённые (slaves) лишь читают да копируют его движения. Конфликтов нет — идиллия, блядь.
    • Плюсы: Настроить проще пареной репы.
    • Минусы: Если мастер ляжет — всё, пиши пропало, пока нового не выберут. Единая точка отказа, ёпта.
  2. Все главные (Master-Master)

    • Суть: Тут уже каждый узел — сам себе режиссёр. Может и писать, и читать. Изменения с одного разлетаются на все остальные.
    • Плюсы: Писать можно куда угодно, высокая доступность.
    • Минусы: А вот если на двух узлах одновременно одну и ту же запись попытаются изменить — тут начинается весёлое: «А чья же правда вернее?». Конфликты, блядь, разрешать — тот ещё геморрой.

Смотри, как в PostgreSQL это выглядит на практике

-- 1. На ГОСПОДИНЕ-сервере говорим: "Слушайте все, таблицу 'users' буду вещать!"
CREATE PUBLICATION user_publication FOR TABLE users;

-- 2. На ПОДСЛУЖИВАЮЩЕМ-сервере делаем подписку: "Я слушаю, хозяин!"
CREATE SUBSCRIPTION user_subscription
    CONNECTION 'host=master.db.example.com port=5432 user=replicator password=secret dbname=main_db'
    PUBLICATION user_publication;

И всё, понеслась! Что на мастере в users ни твори — всё полетит на реплику. Красота, да и только. Главное, пароль не потеряй, а то подпишется кто попало.