Работа баз данных в режиме мастер — реплика#

В контексте баз данных термин мастер — реплика («master-replica», «master-slave») относится к архитектуре репликации данных, где один сервер базы данных действует как мастер (главный), а один или несколько других серверов работают как реплики (подчиненные).

Основные компоненты#

Мастер (Master):

Роль: основной сервер, где происходят все операции записи данных (INSERT, UPDATE, DELETE). Мастер сервер принимает изменения данных и управляет основной копией данных.

Задачи: Обработка всех запросов на изменение данных и отправка этих изменений репликам.

Реплики (Replicas):

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

Задачи: Репликация данных от мастера и обработка запросов на чтение.

../../_images/master.png

Описание схемы:

  • клиент (сервер приложений):

    • отправляет все запросы (чтение 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)#

  1. Установить PostgreSQL на сервере мастера:

sudo apt update
sudo apt install postgresql postgresql-contrib
  1. Настроить файл postgresql.conf для включения репликации:

sudo nano /etc/postgresql/12/main/postgresql.conf

Внести следующие изменения:

listen_addresses = '*'
wal_level = replica
max_wal_senders = 3
wal_keep_segments = 64
  1. Изменить файл pg_hba.conf для разрешения доступа репликам:

sudo nano /etc/postgresql/12/main/pg_hba.conf

Добавить следующую строку, разрешающую подключение реплики:

host    replication     all             <ip_address>          md5

Где <ip_address> — IP-адрес сети или конкретной реплики.

  1. Перезапустить PostgreSQL для применения изменений:

sudo systemctl restart postgresql
  1. Создать пользователя для репликации — войти в psql как суперпользователь и создать пользователя:

sudo -u postgres psql

Ввести команды:

CREATE ROLE replication_user WITH REPLICATION PASSWORD 'yourpassword' LOGIN;

Шаг 2: Настройка реплики (Replica)#

  1. Установить PostgreSQL на сервере реплики:

sudo apt update
sudo apt install postgresql postgresql-contrib
  1. Остановить PostgreSQL на реплике:

sudo systemctl stop postgresql
  1. Создать базовую резервную копии данных с мастера на реплику:

Удалить или переместить текущие данные:

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
  1. Настроить файл 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'
  1. Изменить права доступа к файлу recovery.conf:

sudo chown postgres:postgres /var/lib/postgresql/12/main/recovery.conf
sudo chmod 600 /var/lib/postgresql/12/main/recovery.conf
  1. Перезапустить PostgreSQL на реплике:

sudo systemctl start postgresql

Шаг 3: Проверка репликации#

  1. Войти в PostgreSQL на мастере:

sudo -u postgres psql
  1. Выполнить команду для проверки состояния репликации:

SELECT client_addr, state FROM pg_stat_replication;
  1. На реплике проверить, что она работает в режиме реплики:

sudo -u postgres psql
  1. Выполнить команду для проверки состояния репликации:

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 мс.