Репликация базы данных: PostgreSQL и MySQL на VPS
Репликация — это живая копия базы на втором сервере. Она снимает нагрузку чтения с основного узла, страхует от потери данных и даёт быстрый переход на резерв при аварии. Разберём потоковую репликацию PostgreSQL и классическую master-replica для MySQL с рабочими командами.
Содержание
Зачем нужна репликация
['Репликация решает сразу несколько задач, и важно понимать, что это не замена бэкапу, а дополнение к нему.', '- Отказоустойчивость — упал мастер, переключаемся на реплику.
- Масштабирование чтения — SELECT-запросы уходят на реплики, мастер занят только записью.
- Бэкап без нагрузки — снимаем dump с реплики, не трогая боевой сервер.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS для репликации БДPostgreSQL: подготовка мастера
['На мастере включаем режим репликации и заводим отдельную роль с правом REPLICATION.', '# postgresql.conf на мастере\nwal_level = replica\nmax_wal_senders = 10\nmax_replication_slots = 10\nwal_keep_size = 512MB', 'sudo -u postgres psql -c "CREATE ROLE replica WITH REPLICATION LOGIN PASSWORD \'strongpass\';"', 'Разрешаем подключение реплики в pg_hba.conf (замените IP на адрес реплики) и перезапускаем сервер:', "echo 'host replication replica REPLICA_IP/32 scram-sha-256' | sudo tee -a /etc/postgresql/16/main/pg_hba.conf\nsudo systemctl restart postgresql"]
PostgreSQL: запуск реплики
['На втором сервере останавливаем PostgreSQL, очищаем каталог данных и снимаем базовую копию с мастера утилитой pg_basebackup — она сразу создаёт standby-конфигурацию.', 'sudo systemctl stop postgresql\nsudo -u postgres rm -rf /var/lib/postgresql/16/main/*\nsudo -u postgres pg_basebackup -h MASTER_IP -U replica \\\n -D /var/lib/postgresql/16/main -Fp -Xs -P -R', 'Флаг -R пропишет параметры подключения и создаст файл standby.signal. Запускаем реплику и проверяем, что она догоняет мастер:', "sudo systemctl start postgresql\nsudo -u postgres psql -c 'SELECT status, sent_lsn, replay_lsn FROM pg_stat_replication;' # на мастере\nsudo -u postgres psql -c 'SELECT pg_last_wal_replay_lsn();' # на реплике"]
MySQL: master-replica
['В MySQL/MariaDB настройка похожа по логике. На мастере включаем бинлог и уникальный server-id:', '# my.cnf на мастере\nserver-id = 1\nlog_bin = /var/log/mysql/mysql-bin.log\nbinlog_format = ROW', "CREATE USER 'repl'@'%' IDENTIFIED BY 'strongpass';\nGRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';\nSHOW MASTER STATUS; -- запишите File и Position", 'На реплике задаём server-id = 2 и указываем координаты мастера:', "CHANGE MASTER TO MASTER_HOST='MASTER_IP', MASTER_USER='repl',\n MASTER_PASSWORD='strongpass', MASTER_LOG_FILE='mysql-bin.000001',\n MASTER_LOG_POS=154;\nSTART SLAVE;\nSHOW SLAVE STATUS\\G -- Slave_IO_Running и Slave_SQL_Running должны быть Yes"]
Мониторинг отставания и переключение
['Реплика может отставать под нагрузкой — за этим нужно следить. В PostgreSQL отставание видно как разница LSN, в MySQL — поле Seconds_Behind_Master.', '# PostgreSQL: лаг в байтах на мастере\nSELECT client_addr, pg_wal_lsn_diff(sent_lsn, replay_lsn) AS lag_bytes\nFROM pg_stat_replication;', 'При аварии мастера реплику повышают до основного узла. В PostgreSQL это делается одной командой:', 'sudo -u postgres pg_ctl promote -D /var/lib/postgresql/16/main', '- Одинаковый server-id в MySQL — репликация не стартует.
- Мало wal_keep_size — мастер удалит WAL, реплика отвалится.
- Реплику приняли за бэкап — ошибочный DELETE тут же уедет на неё.
Где разместить узлы
['Для репликации важны стабильная сеть между узлами и предсказуемый диск. NVMe + AMD EPYC у MAATRIX ускоряют применение WAL и бинлога на реплике, а две локации (UK и США) позволяют разнести мастер и резерв по площадкам. Оплата картой РФ, СБП, криптой или токеном MAAT и ежедневные бэкапы дополняют схему надёжности, а root-доступ нужен для правки конфигов репликации.']Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS для репликации БДЧастые вопросы
Заменяет ли репликация бэкап?
Нет. Ошибочный DELETE или DROP мгновенно повторится на реплике. Репликация защищает от отказа железа, а бэкап — от логических ошибок; нужны оба.
В чём разница синхронной и асинхронной репликации?
Асинхронная быстрее, но при аварии можно потерять последние транзакции. Синхронная гарантирует запись на реплику до подтверждения коммита, но повышает задержку.
Можно ли читать с реплики?
Да, реплика доступна на чтение (hot standby в PostgreSQL, read replica в MySQL). Это стандартный способ разгрузить мастер от SELECT-нагрузки.