We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

PostgreSQL в Termux: настройка репликации, резервного копирования с pgBackRest и горизонтального масштабирования с pgpool-II

Termux давно перестал быть «просто терминалом»: при грамотной настройке он может стать удобной средой для разработки, тестов и даже для локальных стендов высокой доступности. В этой статье разберём, как развернуть PostgreSQL в Termux и затем построить: репликацию, резервное копирование с pgBackRest и горизонтальное масштабирование с pgpool-II. Всё будет ориентировано на локальную сеть (без обсуждения обходов ограничений).

Материал рассчитан на практическое применение в рамках локального контура и разработки. Для продакшн-сценариев в реальной инфраструктуре потребуется отдельная проработка безопасности, мониторинга и управляемости (доступы, роли, ротация ключей, лимиты ресурсов и т.д.).

Требования и оговорки

  • Два или более устройства/инстанса Termux с доступностью по сети (в пределах локальной сети).
  • Одинаковая архитектура сборки/окружения предпочтительна, но не обязательна для понимания процесса.
  • Связность по сети: репликация и pgBackRest должны уметь добираться до узлов.
  • Схема портов: как минимум порты PostgreSQL и pgpool-II должны быть доступны между узлами.

Далее будем считать, что у нас есть узел primary (мастер), узел standby (реплика) и отдельный узел/стенд для pgBackRest (может быть тот же узел, но для ясности рассмотрим типовой вариант).

Подготовка Termux и PostgreSQL

Начнём с базовой подготовки Termux. На практике пакеты и способ установки могут отличаться, но общий подход одинаков: обновить систему, установить PostgreSQL и подготовить рабочие директории.

pkg update && pkg upgrade -y
pkg install -y postgresql postgresql-contrib

Дальше создаём структуру каталогов и инициализируем кластер. Обычно удобно держать все данные в подкаталоге приложения.

mkdir -p ~/pgdata
initdb -D ~/pgdata

Запускаем PostgreSQL локально (проверка). Для Termux часто важно явно указать каталог конфигурации или использовать дефолтные пути, если они корректны в вашей сборке.

pg_ctl -D ~/pgdata -l ~/pglogfile start

Проверим, что сервер отвечает:

psql -d postgres -c "select version();"

Если подключение проходит только локально, позже расширим доступ для узлов репликации и pgpool-II.

Настройка primary для репликации (streaming replication)

На primary нужно:

  • Включить wal-сегменты и archiving (для стойкой логики при необходимости).
  • Настроить параметры для streaming репликации.
  • Создать пользователя репликации.

Откройте postgresql.conf (путь зависит от сборки). В рамках Termux чаще правят файл в ~/pgdata/postgresql.conf:

nano ~/pgdata/postgresql.conf

Добавьте/измените значения (примерно):

# В зависимости от версии названия параметров могут отличаться.
wal_level = replica
max_wal_senders = 5
hot_standby = on
wal_keep_size = 256MB
# Для репликации без архивации можно не включать archive_mode,
# но для комплексной стратегии бэкапов часто полезно.

Далее настроим pg_hba.conf для подключения реплика и (опционально) pgpool-II. Примерно:

nano ~/pgdata/pg_hba.conf

Добавьте строки для роли репликации и адресов standby:

# TYPE  DATABASE  USER   ADDRESS          METHOD
host    replication  repl_user  192.168.1.0/24  md5

Если pgpool-II будет обращаться к primary по отдельному адресу/сети — добавьте аналогично доступ для пользователя приложения/pgpool.

Создание пользователя репликации

На primary создайте пользователя:

psql -d postgres -c "CREATE ROLE repl_user WITH REPLICATION LOGIN PASSWORD 'STRONG_PASSWORD';"

Перезапустите PostgreSQL, чтобы изменения вступили в силу:

pg_ctl -D ~/pgdata restart

Проверка на primary:

psql -d postgres -c "select client_addr, state from pg_stat_replication;"

Пока standby не подключён — строк может не быть.

Подготовка standby (настройка recovery/standby)

На standby мы создаём новый кластер (инициализация) и настраиваем подключение к primary.

Остановите PostgreSQL на standby (если он запущен), затем удалите старые данные и выполните базовый снимок (base backup) или используйте pg_basebackup.

pg_ctl -D ~/pgdata stop
rm -rf ~/pgdata/

Выполните base backup с primary:

pg_basebackup -h 192.168.1.10 -p 5432 -D ~/pgdata -U repl_user -Fp -Xs -P

Дальше нужно включить режим standby. В современных версиях PostgreSQL применяется подход с standby.signal и настройкой primary_conninfo.

Создайте файл:

touch ~/pgdata/standby.signal

Отредактируйте postgresql.auto.conf или recovery.conf (в зависимости от версии). В современных версиях часто удобно через postgresql.auto.conf. Пример:

nano ~/pgdata/postgresql.auto.conf

Добавьте:

primary_conninfo = 'host=192.168.1.10 port=5432 user=repl_user password=STRONG_PASSWORD sslmode=disable'
primary_slot_name = 'standby_slot_1'
restore_command = ''

Если вы не используете слоты репликации — уберите primary_slot_name или создайте слот на primary. Для простого сценария можно начать без слота, но в реальном контуре лучше иметь контролируемую модель WAL retention.

Запустите standby:

pg_ctl -D ~/pgdata start

Проверки:

psql -d postgres -c "select pg_is_in_recovery();"

На standby вернёт t. На primary снова проверим:

psql -d postgres -c "select client_addr, state, sync_state from pg_stat_replication;"

Репликация с точки зрения практики: sync/async и ожидания

В простом локальном стенде обычно достаточно асинхронной репликации: мастер подтверждает транзакции сразу, а реплика догоняет WAL. Если хотите синхронизацию (synchronous replication), потребуется дополнительная настройка параметров на primary и standby, а также продуманная цена задержек. Для целей обучения и базовой отказоустойчивости лучше начать с асинхронной схемы и убедиться, что:

  • standby стабильно подключён;
  • не растёт очередь WAL за разумное время;
  • при перезапусках оба узла поднимаются корректно.

Резервное копирование с pgBackRest

pgBackRest (pgBackRest) удобен тем, что даёт единый подход к бэкапам, инкрементам и хранению, включая сценарии с репликацией WAL. Ниже — общий план: настроить конфигурацию на машине, где будет исполняться pgBackRest, и обеспечить доступ к primary и/или standby.

Подготовка pgBackRest

Установите pgBackRest. В Termux может потребоваться отдельная сборка/установка в зависимости от доступности пакетов. В статье оставляем команду на уровне общего принципа.

pkg install -y pgbackrest

Если пакет недоступен в вашем окружении, используйте способ установки, соответствующий вашей сборке (например, скачивание релиза). Главное — чтобы бинарник pgbackrest исполнялся на том узле, где вы будете хранить конфигурацию.

Конфигурация pgBackRest

Предположим, что pgBackRest будет работать с primary. Создадим конфиг /etc/pgbackrest.conf или в домашней директории (вариант зависит от вашей среды). Используем домашний каталог:

mkdir -p ~/pgbackrest
nano ~/pgbackrest/pgbackrest.conf

Пример конфигурации (адаптируйте адреса, пользователи и пути):

[global]
repo1-path=/data/data/com.termux/files/home/pgbackrest/repo1
start-fast=y
process-max=4

[main]
pg1-path=/data/data/com.termux/files/home/pgdata
pg1-host=192.168.1.10
pg1-port=5432
pg1-user=postgres

# Если pgBackRest должен выполнять команды удалённо, настройте доступ по сети.
# Обычно нужен ssh; в рамках локальной сети это делается стандартными средствами.

Обратите внимание: пути repo1-path и pg1-path должны соответствовать реальной файловой структуре на узле, откуда pgBackRest читает/пишет. Вариант “всё на одном устройстве” и “распределённый” — разные по настройке путей.

Проверка конфигурации

pgbackrest --stanza=main check

Далее — полный бэкап:

pgbackrest --stanza=main backup

Если репликация WAL включена и вы планируете PITR (point-in-time recovery), настройте archiving/хранение WAL. В минимальном сценарии можно ограничиться base backup’ами, но для устойчивости часто важны и WAL.

Ротация и планирование

Для локального стенда можно запускать bэкапы вручную или по расписанию. В Termux удобно использовать termux-job-scheduler при наличии. Однако сама идея одинакова: регулярность, проверка целостности и логирование.

Пример проверки после бэкапа:

pgbackrest --stanza=main --type=diff info

Или запуск очередной команды проверки:

pgbackrest --stanza=main check

Горизонтальное масштабирование с pgpool-II

pgpool-II выступает как прокси/балансировщик: маршрутизирует запросы к master/replica, может выполнять роли failover (в зависимости от сценария), а также обрабатывает соединения приложений. В терминах локального стенда часто это “единая точка входа” для приложений: приложение подключается к pgpool-II, а тот уже распределяет/направляет запросы.

Развёртывание pgpool-II

Установка зависит от доступности пакета в Termux. Если pgpool-II доступен как пакет — установите. Если нет — учитывайте, что в Termux может потребоваться отдельная сборка/использование контейнера. В рамках статьи опишем настройку, предполагая доступность бинарников.

pkg install -y pgpool

Создадим конфигурационный файл. В Termux путь может отличаться, поэтому используйте тот, что принят в вашей сборке. Типовой конфиг — /etc/pgpool-II/pgpool.conf:

nano ~/pgpool.conf

Базовая конфигурация pgpool.conf

Концептуально нужно указать:

  • Список backend’ов (primary и standby).
  • Порт для слушания pgpool-II.
  • Настройки health check.
  • Режим маршрутизации (read/write split).

Пример (адаптируйте под вашу сеть):

# pgpool listen
listen_addresses = '0.0.0.0'
port = 9999

# Backend pool: 2 узла
backend_hostname0 = '192.168.1.10'
backend_port0 = 5432
backend_weight0 = 1

backend_hostname1 = '192.168.1.11'
backend_port1 = 5432
backend_weight1 = 1

# Указание, какие узлы являются primary/replica в рамках read/write split.
# В pgpool-II логика может зависеть от версии и параметров.

# Прокси-режим
enable_pool_hba = on
pool_passwd = 'pool_passwd'

# health check (примерно)
health_check_period = 10
health_check_timeout = 3

Создайте файл учётных данных для pgpool-II (pool_passwd). Например, администратор и пользователь, от имени которого pgpool будет делать проверки и проксировать соединения.

nano ~/pool_passwd

Смысл: pgpool-II должен иметь доступ к PostgreSQL backend’ам. Обычно создают отдельного пользователя в PostgreSQL с минимальными правами, и прописывают его в pool_passwd. Точные команды зависят от версии pgpool-II.

Запуск pgpool-II и проверка

Запуск:

pgpool -f ~/pgpool.conf -n

Проверим, что порт открыт с вашей рабочей машины в локальной сети (или с устройства, где тестируете приложение):

psql -h 192.168.1.20 -p 9999 -U app_user -d postgres -c "select now();"

Здесь 192.168.1.20 — адрес pgpool-II узла. Если подключения проходят — идём к проверке распределения запросов.

Read/Write split и практический тест

Для горизонтального масштабирования обычно стремятся:

  • на запись направлять запросы только в primary;
  • на чтение (SELECT) — направлять на replica(и) при корректной консистентности.

Тестовый сценарий: запустите несколько SELECT и посмотрите, к какому backend попали запросы (метрики/логирование pgpool, либо проверка статистики на backend).

# На приложении (через pgpool)
psql -h 192.168.1.20 -p 9999 -U app_user -d postgres -c "select count() from some_table;"

Если у вас включено логирование в pgpool-II, можно увидеть маршрутизацию. На PostgreSQL можно смотреть активность (например, через pg_stat_activity), учитывая, что соединения будут приходить от pgpool.

Failover: что можно и что нужно учесть

pgpool-II может помогать в автоматическом переключении при недоступности primary (в зависимости от конфигурации, health checks и возможностей вашей версии). Однако на уровне практики важно учитывать:

  • какой тип failover вам нужен (автоматический/полуавтоматический);
  • насколько корректно работает определение “жив/мертв” узла;
  • что будет с транзакциями, которые выполнялись в момент переключения;
  • есть ли SLA по времени восстановления.

Для лаборатории можно сначала смоделировать падение primary и посмотреть, как pgpool перенаправит подключения. Для этого убедитесь, что standby корректно продолжает recovery/replication.

Комбинация: репликация + pgBackRest + pgpool-II

Самая сильная сторона подхода — в связке:

  • Репликация даёт близость данных на standby и базовую отказоустойчивость.
  • pgBackRest обеспечивает регулярные резервные копии и (при корректной настройке archiving) возможность восстановления до нужного момента времени.
  • pgpool-II даёт единый вход для приложений и распределение нагрузки на чтение, а также потенциальные механизмы переключения.

При этом важно регулярно выполнять проверки:

  • проверка статуса репликации;
  • проверка репозитория pgBackRest;
  • валидация восстановления (хотя бы в тестовом контуре);
  • проверка корректности маршрутизации через pgpool-II.

Заключение

Мы рассмотрели практический путь: развернули PostgreSQL в Termux, подготовили streaming-репликацию (primary/standby), организовали резервное копирование с pgBackRest и добавили слой горизонтального масштабирования/прокси через pgpool-II. Такой стек хорошо подходит для локальных стендов, обучения и прототипирования систем высокой доступности.

Если хотите, чтобы мы подобрали схему под вашу сеть, версию PostgreSQL/pgpool-II и ваш сценарий (репликация async/sync, модель резервного копирования, правила маршрутизации чтения), обращайтесь в РыбинскЛАБ: поможем с проектированием, установкой и настройкой под ваши требования.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен и доработан перед публикацией.

Нужна помощь с настройкой Termux, Linux и серверов?

Я оказываю ИТ-услуги: настройка серверов, автоматизация, безопасность, помощь с Linux и инфраструктурой. Материалы сайта — только в ознакомительных и образовательных целях.

Связаться со мной
Поддержать проект