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, модель резервного копирования, правила маршрутизации чтения), обращайтесь в РыбинскЛАБ: поможем с проектированием, установкой и настройкой под ваши требования.