mirror of
https://github.com/wowlikon/LiB.git
synced 2026-02-04 04:31:09 +00:00
102 lines
4.2 KiB
Bash
102 lines
4.2 KiB
Bash
#!/bin/sh
|
||
set -e
|
||
|
||
echo "=== Настройка репликации ==="
|
||
echo "Этот узел: NODE_ID=${NODE_ID}"
|
||
echo "Удаленный хост: ${REMOTE_HOST}"
|
||
|
||
echo "Ждем локальную базу..."
|
||
sleep 10
|
||
|
||
until PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -c '\q' 2>/dev/null; do
|
||
echo "Локальная база не готова, ждем..."
|
||
sleep 2
|
||
done
|
||
echo "Локальная база готова"
|
||
|
||
echo "Настройка генераторов ID (NODE_ID=${NODE_ID})..."
|
||
|
||
PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" <<EOF
|
||
DO \$\$
|
||
DECLARE
|
||
r RECORD;
|
||
BEGIN
|
||
FOR r IN
|
||
SELECT table_schema, table_name, column_name
|
||
FROM information_schema.columns
|
||
WHERE is_identity = 'YES'
|
||
AND table_schema = 'public'
|
||
LOOP
|
||
EXECUTE format(
|
||
'ALTER TABLE %I.%I ALTER COLUMN %I SET GENERATED BY DEFAULT AS IDENTITY (START WITH %s INCREMENT BY 2)',
|
||
r.table_schema, r.table_name, r.column_name, ${NODE_ID}
|
||
);
|
||
RAISE NOTICE 'Настроен ID для %.%', r.table_name, r.column_name;
|
||
END LOOP;
|
||
END \$\$;
|
||
EOF
|
||
|
||
echo "Проверяем/создаем публикацию..."
|
||
|
||
PUB_EXISTS=$(PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -tAc "SELECT COUNT(*) FROM pg_publication WHERE pubname = 'all_tables_pub';")
|
||
|
||
if [ "$PUB_EXISTS" -gt 0 ]; then
|
||
echo "Публикация уже существует"
|
||
else
|
||
echo "Создаем публикацию..."
|
||
PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" <<EOF
|
||
CREATE PUBLICATION all_tables_pub FOR ALL TABLES;
|
||
EOF
|
||
echo "Публикация создана!"
|
||
fi
|
||
|
||
echo "Ждем удаленный хост ${REMOTE_HOST}:${REMOTE_PORT}..."
|
||
TIMEOUT=300
|
||
ELAPSED=0
|
||
|
||
while ! PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${REMOTE_HOST}" -p ${REMOTE_PORT} -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -c '\q' 2>/dev/null; do
|
||
sleep 5
|
||
ELAPSED=$((ELAPSED + 5))
|
||
if [ $ELAPSED -ge $TIMEOUT ]; then
|
||
echo "Таймаут ожидания удаленного хоста. Подписка НЕ настроена."
|
||
echo "Публикация создана - удаленный хост сможет подписаться на нас."
|
||
echo "Для создания подписки запустите позже:"
|
||
echo "docker compose restart replication-setup"
|
||
exit 0
|
||
fi
|
||
echo "Удаленный хост недоступен, ждем... (${ELAPSED}s/${TIMEOUT}s)"
|
||
done
|
||
echo "Удаленный хост доступен"
|
||
|
||
REMOTE_PUB=$(PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${REMOTE_HOST}" -p ${REMOTE_PORT} -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -tAc "SELECT COUNT(*) FROM pg_publication WHERE pubname = 'all_tables_pub';" 2>/dev/null || echo "0")
|
||
|
||
if [ "$REMOTE_PUB" -eq 0 ]; then
|
||
echo "ВНИМАНИЕ: На удалённом хосте нет публикации 'all_tables_pub'!"
|
||
echo "Подписка не будет создана. Сначала запустите скрипт на удалённом хосте."
|
||
exit 0
|
||
fi
|
||
|
||
EXISTING=$(PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -tAc "SELECT COUNT(*) FROM pg_subscription WHERE subname = 'sub_from_remote';")
|
||
|
||
if [ "$EXISTING" -gt 0 ]; then
|
||
echo "Подписка уже существует, пропускаем создание"
|
||
else
|
||
echo "Создаем подписку на удаленный хост..."
|
||
|
||
PGPASSWORD="${POSTGRES_PASSWORD}" psql -h db -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" <<EOF
|
||
CREATE SUBSCRIPTION sub_from_remote
|
||
CONNECTION 'host=${REMOTE_HOST} port=${REMOTE_PORT} user=${POSTGRES_USER} password=${POSTGRES_PASSWORD} dbname=${POSTGRES_DB}'
|
||
PUBLICATION all_tables_pub
|
||
WITH (
|
||
origin = none
|
||
);
|
||
EOF
|
||
|
||
echo "Подписка создана!"
|
||
fi
|
||
|
||
echo ""
|
||
echo "=== Репликация настроена! ==="
|
||
echo "Публикация: all_tables_pub (другие могут подписаться на нас)"
|
||
echo "Подписка: sub_from_remote (мы получаем данные от ${REMOTE_HOST})"
|