Какую роль выполняет Master-сервер (или Primary) в репликации баз данных?

Ответ

В репликации баз данных Master (также известный как Primary или ведущий) — это главный узел, который является единственным источником истины для всех операций записи (INSERT, UPDATE, DELETE).

Основной принцип работы:

  1. Master-сервер принимает все запросы на изменение данных.
  2. Он записывает эти изменения в специальный лог транзакций (например, binlog в MySQL).
  3. Подчинённые серверы (Replicas или Slaves) подключаются к мастеру, считывают этот лог и последовательно применяют изменения к своей копии данных.

Репликация может быть:

  • Асинхронной (по умолчанию): Мастер не ждёт подтверждения от реплик. Это обеспечивает высокую производительность, но создаёт риск потери данных при сбое мастера и задержку репликации (replication lag).
  • Синхронной: Мастер ждёт подтверждения от одной или нескольких реплик перед тем, как ответить клиенту. Это гарантирует консистентность, но снижает производительность.

Пример настройки репликации в MySQL:

-- На Master-сервере
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS; -- Запомнить File и Position

-- На Replica-сервере
CHANGE MASTER TO
  MASTER_HOST='master_ip_address',
  MASTER_USER='replica_user',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='mysql-bin.000001', -- Имя файла из SHOW MASTER STATUS
  MASTER_LOG_POS=154;               -- Позиция из SHOW MASTER STATUS

START SLAVE;

Ключевые проблемы и их решения:

  • Единая точка отказа (SPOF): Если мастер выходит из строя, запись в БД останавливается. Решается с помощью автоматического переключения на реплику (failover) или использования кластерных решений (например, Galera Cluster, Percona XtraDB Cluster).
  • Задержка репликации: Чтение данных с реплики может вернуть устаревшие данные. Это нужно учитывать при проектировании архитектуры приложения.

Ответ 18+ 🔞

Слушай, а вот эта ваша репликация баз данных, это ж просто песня, блядь! Представь себе: есть один главный мужик, Master, он же Primary, он же ведущий, ёпта. И он, сука, единственный, кто имеет право писать в базу. Все эти INSERT, UPDATE, DELETE — только через него, царь и бог, блядь!

А работает это, внатуре, просто:

  1. Мастер принимает все запросы на запись, как начальник на проходной.
  2. Всё, что он делает, он аккуратно записывает в специальный дневничок — лог транзакций (типа binlog в MySQL). Не для отчётности, а чтобы подчинённые знали, что делать.
  3. А подчинённые-то, Replicas (или по-старому — Slaves), как мартышлюшки, подключаются к мастеру, читают этот дневник и тупо повторяют у себя все его действия. Вот и вся магия, в рот меня чих-пых!

Но тут, конечно, свои подводные камни, ёперный театр!

Асинхронная репликация (обычная такая): Мастер, сделав запись, такой: «Ну я сделал, а вы там как хотите». Он не ждёт, пока реплики подтвердят. Быстро? Быстро! Но если мастер вдруг накрылся медным тазом, то последние данные могли до реплик и не дойти. И задержка может быть — читаешь с реплики, а там вчерашние новости, блядь.

Синхронная репликация: Тут уже мастер не такой похуист. Он, сука, не ответит клиенту «ок», пока хотя бы одна реплика не скажет: «Да, босс, я тоже всё записал». Надёжно? Как швейцарские часы! Но медленно, блядь, потому что все ждут самого тормозного.

Вот, смотри, как это примерно выглядит в MySQL, если вдруг захочешь поиграться:

-- На сервере-Мастере (делает важный вид)
CREATE USER 'replica_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS; -- Смотри сюда, запомни File и Position, а то потом хуй вспомнишь!

-- На сервере-Реплике (готов служить)
CHANGE MASTER TO
  MASTER_HOST='master_ip_address',
  MASTER_USER='replica_user',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='mysql-bin.000001', -- То самое имя файла, что запоминал
  MASTER_LOG_POS=154;               -- И позицию, блядь, не проебёшь!

START SLAVE;

И всё, вроде бы, летает. Но жизнь, она, сука, не такая простая.

Проблема номер раз — единая точка отказа. Мастер — он один, пиздец! Сломался — и всё, запись встала колом. Решение? Нужен план «Б» на случай, если он ебнулся. Это называется failover — автоматическое переключение на одну из реплик. Или сразу ставить кластер, где все узлы равны и могут писать, но это уже другая история, с кучей своих приколов.

Проблема номер два — задержка репликации. Ты пишешь на мастер, а читаешь с реплики, а там твоих свежих данных ещё нет, блядь! Приложение думает, что всё ок, а пользователь видит старьё. Волнение ебать! Поэтому архитектуру надо продумывать: критичные вещи читать с мастера, а что не очень — можно и с реплики.

Вот так вот, казалось бы, простая штука, а столько нюансов, блядь. Главное — ничего не проебать при настройке.