Работа баз данных в режиме мастер — реплика#
В контексте баз данных термин мастер — реплика («master-replica», «master-slave») относится к архитектуре репликации данных, где один сервер базы данных действует как мастер (главный), а один или несколько других серверов работают как реплики (подчиненные).
Основные компоненты#
Мастер (Master):
Роль: основной сервер, где происходят все операции записи данных (INSERT, UPDATE, DELETE). Мастер сервер принимает изменения данных и управляет основной копией данных.
Задачи: Обработка всех запросов на изменение данных и отправка этих изменений репликам.
Реплики (Replicas):
Роль: подчиненные серверы, которые получают копии данных от мастера. Реплики могут быть настроены для обработки только запросов на чтение (SELECT), что помогает распределить нагрузку на чтение между несколькими серверами.
Задачи: Репликация данных от мастера и обработка запросов на чтение.

Описание схемы:
клиент (сервер приложений):
отправляет все запросы (чтение SELECT и запись INSERT, UPDATE, DELETE) через HTTPS порт 443 к балансировщику нагрузки;
отправляет административные запросы через HTTP порт 8080 к балансировщику;
балансировщик нагрузки (LB):
перенаправляет запросы на чтение (SELECT) к Replica1 и Replica2 через PostgreSQL порт 5432;
перенаправляет запросы на запись (INSERT, UPDATE, DELETE) к Master через PostgreSQL порт 5432;
перенаправляет административные запросы к Master, Replica1 и Replica2 через HTTP порт 8080.
Master и Replica Servers:
Master сервер обрабатывает все операции записи и реплицирует данные к Replica1 и Replica2 через PostgreSQL порт 5432;
Replica1 и Replica2 обрабатывают запросы на чтение, полученные от балансировщика;
Master, Replica1 и Replica2 обрабатывают административные запросы через HTTP порт 8080.
Преимущества использования архитектуры мастер — реплика#
Увеличение производительности чтения — разделение нагрузки на чтение между мастером и репликами позволяет обрабатывать больше запросов одновременно.
Высокая доступность — в случае сбоя мастера одна из реплик может быть повышена до роли мастера, обеспечивая непрерывность работы системы.
Распределение нагрузки — реплики могут находиться в разных географических регионах, что уменьшает задержки доступа к данным для пользователей, находящихся далеко от мастера.
Основные виды репликации#
Асинхронная репликация — изменения данных передаются репликам с некоторой задержкой. Это позволяет мастеру работать быстрее, но может привести к временной несогласованности данных между мастером и репликами.
Синхронная репликация — мастер ждет подтверждения от реплик о том, что они успешно получили изменения, прежде чем завершить операцию. Это обеспечивает согласованность данных, но может замедлить работу мастера.
Пример использования#
Сценарий 1 — веб-приложение с высокой нагрузкой на чтение данных, где все операции записи происходят на мастере, а запросы на чтение распределяются между репликами.
Сценарий 2 — система резервного копирования, где реплики служат для создания резервных копий данных в реальном времени, что позволяет быстро восстановить данные в случае сбоя мастера.
Таким образом, архитектура «мастер — реплика» помогает достичь масштабируемости и надежности в работе с базами данных, особенно в системах с высокой нагрузкой на чтение.
Обеспечение безопасности#
Для обеспечения безопасности, производительности и управляемости сети, рекомендуется использовать различные VLAN (виртуальные локальные сети) для разделения трафика на управление, репликацию и клиентские запросы.
Пример описание VLAN для предлагаемой схемы:
VLAN 10: Управление
Назначение: Административные и управляющие задачи.
Используемые порты: HTTP 8080.
Трафик:
административные запросы от клиента к балансировщику;
административные запросы от балансировщика к Master и Replica серверам.
Интерфейсы:
Master сервер: интерфейс для управления;
Replica1 сервер: интерфейс для управления;
Replica2 сервер: интерфейс для управления.
Балансировщик: интерфейс для управления.
VLAN 20: Репликация
Назначение: Обмен данными между Master и Replica серверами для обеспечения репликации данных.
Используемые порты: PostgreSQL 5432.
Трафик:
репликация данных от Master к Replica1 и Replica2.
Интерфейсы:
Master сервер: интерфейс для репликации;
Replica1 сервер: интерфейс для репликации;
Replica2 сервер: интерфейс для репликации.
VLAN 30: Клиентский трафик
Назначение: Обработка запросов от клиентов.
Используемые порты: HTTPS 443 для чтения (SELECT), INSERT, UPDATE, DELETE.
Трафик:
чтение данных от клиента через балансировщик к Replica серверам;
запись данных от клиента через балансировщик к Master серверу.
Интерфейсы:
Master сервер: интерфейс для клиентского трафика;
Replica1 сервер: интерфейс для клиентского трафика;
Replica2 сервер: интерфейс для клиентского трафика.
Балансировщик: интерфейс для клиентского трафика.
Настройка инфраструктуры для конфигурации «мастер - реплика» с использованием PostgreSQL#
Шаг 1: Настройка мастера (Master)#
Установить PostgreSQL на сервере мастера:
sudo apt update sudo apt install postgresql postgresql-contrib
Настроить файл
postgresql.conf
для включения репликации:
sudo nano /etc/postgresql/12/main/postgresql.confВнести следующие изменения:
listen_addresses = '*' wal_level = replica max_wal_senders = 3 wal_keep_segments = 64
Изменить файл
pg_hba.conf
для разрешения доступа репликам:
sudo nano /etc/postgresql/12/main/pg_hba.confДобавить следующую строку, разрешающую подключение реплики:
host replication all <ip_address> md5Где <ip_address> — IP-адрес сети или конкретной реплики.
Перезапустить PostgreSQL для применения изменений:
sudo systemctl restart postgresql
Создать пользователя для репликации — войти в
psql
как суперпользователь и создать пользователя:
sudo -u postgres psqlВвести команды:
CREATE ROLE replication_user WITH REPLICATION PASSWORD 'yourpassword' LOGIN;
Шаг 2: Настройка реплики (Replica)#
Установить PostgreSQL на сервере реплики:
sudo apt update sudo apt install postgresql postgresql-contrib
Остановить PostgreSQL на реплике:
sudo systemctl stop postgresql
Создать базовую резервную копии данных с мастера на реплику:
Удалить или переместить текущие данные:
sudo mv /var/lib/postgresql/12/main /var/lib/postgresql/12/main_oldСкопировать данные с мастера:
PGPASSWORD=yourpassword pg_basebackup -h master_ip -D /var/lib/postgresql/12/main -U replication_user -v -P --wal-method=stream
Настроить файл
recovery.conf
на реплике:
Создать файл:
sudo nano /var/lib/postgresql/12/main/recovery.confДобавить следующие строки:
standby_mode = 'on' primary_conninfo = 'host=master_ip port=5432 user=replication_user password=yourpassword' trigger_file = '/tmp/postgresql.trigger.5432'
Изменить права доступа к файлу
recovery.conf
:
sudo chown postgres:postgres /var/lib/postgresql/12/main/recovery.conf sudo chmod 600 /var/lib/postgresql/12/main/recovery.conf
Перезапустить PostgreSQL на реплике:
sudo systemctl start postgresql
Шаг 3: Проверка репликации#
Войти в PostgreSQL на мастере:
sudo -u postgres psql
Выполнить команду для проверки состояния репликации:
SELECT client_addr, state FROM pg_stat_replication;
На реплике проверить, что она работает в режиме реплики:
sudo -u postgres psql
Выполнить команду для проверки состояния репликации:
SELECT * FROM pg_stat_wal_receiver;
Настройка приложений для работы с сервером Postgres в режиме «мастер - реплика»#
Для взаимодействия приложений с сервером Postgres работающем в режиме «мастер - реплика» необходимо, на уровне инфраструктуры, реализовать механизм, который будет автоматически распределять запросы на чтение и запись между мастером и репликами. Это можно сделать с помощью прокси-сервера или балансировщика нагрузки, который будет маршрутизировать запросы в зависимости от их типа.
Пример использования HAProxy для распределения запросов:
HAProxy — настройка на отправку запросов на чтение (SELECT) к репликам, запросов на запись (INSERT, UPDATE, DELETE) к мастеру.
Шаг 1: Установка HAProxy#
На сервере, который будет выполнять роль прокси-сервера, установить HAProxy:
sudo apt update
sudo apt install haproxy
Шаг 2: Настройка HAProxy#
Отредактировать файл конфигурации HAProxy:
sudo nano /etc/haproxy/haproxy.cfg
Добавьте следующую конфигурацию:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend http-in
bind *:443
acl is_read path_reg ^/data
use_backend replicas if is_read
default_backend master
backend master
mode http
option httpchk
server master_db master_ip:5432 check
backend replicas
mode http
balance roundrobin
option httpchk
server replica1_db replica1_ip:5432 check
server replica2_db replica2_ip:5432 check
Шаг 3: Перезапуск HAProxy#
Перезапуск HAProxy:
sudo systemctl restart haproxy
Пример использования Pgpool-II для PostgreSQL#
Pgpool-II — это инструмент, который позволяет балансировать нагрузку и управлять репликацией для PostgreSQL.
Шаг 1: Установка Pgpool-II#
На сервере, который будет выполнять роль прокси-сервера, установить Pgpool-II:
sudo apt-get update
sudo apt-get install pgpool2
Шаг 2: Настройка Pgpool-II#
Открыть файл конфигурации Pgpool-II:
sudo nano /etc/pgpool2/pgpool.conf
Добавить или изменить следующие параметры:
listen_addresses = '*'
port = 5432
backend_hostname0 = 'master_ip'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/postgresql/12/main'
backend_hostname1 = 'replica1_ip'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/postgresql/12/main'
backend_hostname2 = 'replica2_ip'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/var/lib/postgresql/12/main'
# Load balancing settings
load_balance_mode = on
# Replication settings
replication_mode = on
Шаг 3: Перезапуск Pgpool-II#
Перезапустить Pgpool-II, чтобы применить изменения:
sudo systemctl restart pgpool2
Взаимодействие с Pgpool-II#
Запросы на запись (INSERT, UPDATE, DELETE):
веб-приложение отправляет запросы на Pgpool-II;
Pgpool-II распознает эти запросы как операции записи и перенаправляет их на мастер-сервер;
мастер обрабатывает запросы, и изменения реплицируются на реплики.
Запросы на чтение (SELECT):
веб-приложение отправляет запросы на Pgpool-II;
Pgpool-II распознает эти запросы как операции чтения и распределяет их между репликами, используя механизм балансировки нагрузки.
Преимущества использования Pgpool-II#
Простота интеграции — веб-приложению не требуется изменять логику работы с базой данных, достаточно перенастроить параметры подключения.
Балансировка нагрузки — Pgpool-II автоматически распределяет запросы на чтение между репликами, снижая нагрузку на мастер-сервер.
Высокая доступность — в случае сбоя мастера, одна из реплик может быть повышена до роли мастера, обеспечивая непрерывность работы приложения.
Использование Pgpool-II позволяет веб-приложению эффективно распределять запросы на чтение и запись между мастером и репликами без необходимости вносить значительные изменения в код. Это решение обеспечивает высокую производительность и надежность базы данных.
Расположение реплики на удаленной площадке
В рамках плана аварийного восстановления возможно расположить одну из реплик на удаленной площадке. Такой подход может использоваться для гарантированной сохранности данных в случае выхода из строя основной площадки, а также может использоваться для создания резервной копии базы данных на удаленной площадке с помощью инструментов резервного копирования, таких как RuBackup.
При расположении реплики на удаленной площадке требуется тщательное планирование и тестирование решения, с учетом предполагаемого объема реплицируемых данных, скорости канала передачи информации и возникающих задержек.
Так, например, если объем реплицируемой информации составляет 1TB с сутки, то требования к каналу связи будут следующими:
асинхронная репликация;
пропускная способность: минимум 100 Mb/s;
задержка: не более 100-200 мс;
синхронная репликация;
пропускная способность: минимум 100 Mb/s;
задержка: не более 10-20 мс.