Подключение bookings db заработало
This commit is contained in:
+3
-3
@@ -15,9 +15,9 @@ BOOKINGS_DB_NAME=bookings
|
||||
BOOKINGS_DB_PORT=5434
|
||||
# Начальная дата модельного времени для генерации демобазы
|
||||
BOOKINGS_START_DATE=2017-01-01
|
||||
# Количество дней для первой генерации (потом добавляем по одному дню)
|
||||
BOOKINGS_INIT_DAYS=30
|
||||
# Количество параллельных джобов генератора (по умолчанию 1)
|
||||
# Количество дней для первой генерации (держим малым, чтобы быстрее увидеть данные)
|
||||
BOOKINGS_INIT_DAYS=1
|
||||
# Количество параллельных джобов генератора (по умолчанию 1; при 1 работаем синхронно без dblink)
|
||||
BOOKINGS_JOBS=1
|
||||
|
||||
# Greenplum Configuration
|
||||
|
||||
@@ -5,7 +5,7 @@ DEMODB_REPO := https://github.com/postgrespro/demodb.git
|
||||
DEMODB_COMMIT := d68de192850237719f09b47688d5f3fc94653ca6
|
||||
BOOKINGS_JOBS ?= 1
|
||||
BOOKINGS_START_DATE ?= 2017-01-01
|
||||
BOOKINGS_INIT_DAYS ?= 30
|
||||
BOOKINGS_INIT_DAYS ?= 1
|
||||
|
||||
.PHONY: up down airflow-init logs gp-psql ddl-gp \
|
||||
bookings-clone-demodb bookings-init bookings-psql bookings-generate-day \
|
||||
@@ -36,9 +36,23 @@ bookings-clone-demodb:
|
||||
git -C bookings/demodb fetch --depth 1 origin $(DEMODB_COMMIT); \
|
||||
git -C bookings/demodb checkout $(DEMODB_COMMIT); \
|
||||
fi
|
||||
# Патчим generate/continue: при jobs=1 запускаем process_queue синхронно, без dblink
|
||||
if ! grep -q "CALL process_queue(end_date);" bookings/demodb/engine.sql; then \
|
||||
patch -d bookings/demodb -p1 --forward < bookings/patches/engine_jobs1_sync.patch || true; \
|
||||
fi
|
||||
# Делаем установку идемпотентной: DROP DATABASE IF EXISTS demo
|
||||
if ! grep -q "DROP DATABASE IF EXISTS demo;" bookings/demodb/install.sql; then \
|
||||
patch -d bookings/demodb -p1 --forward < bookings/patches/install_drop_if_exists.patch || true; \
|
||||
fi
|
||||
|
||||
bookings-init: bookings-clone-demodb
|
||||
docker compose -f docker-compose.yml up -d bookings-db
|
||||
docker compose -f docker-compose.yml exec bookings-db bash -lc '\
|
||||
until PGPASSWORD="$$POSTGRES_PASSWORD" pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB" -h localhost; do \
|
||||
echo "Waiting for bookings-db to become ready..."; \
|
||||
sleep 1; \
|
||||
done \
|
||||
'
|
||||
docker compose -f docker-compose.yml exec bookings-db bash -lc 'cd /bookings/demodb && PGPASSWORD="$$POSTGRES_PASSWORD" psql -v ON_ERROR_STOP=1 -U "$$POSTGRES_USER" -d "$$POSTGRES_DB" -f install.sql'
|
||||
docker compose -f docker-compose.yml exec bookings-db bash -lc '\
|
||||
CONNSTR="dbname=demo user=$$POSTGRES_USER password=$$POSTGRES_PASSWORD"; \
|
||||
@@ -51,14 +65,24 @@ bookings-init: bookings-clone-demodb
|
||||
ALTER DATABASE demo SET bookings.jobs = '\''$(BOOKINGS_JOBS)'\'';" \
|
||||
'
|
||||
# Генерируем первый день данных, чтобы база не оставалась пустой
|
||||
docker compose -f docker-compose.yml exec bookings-db bash -lc 'printf "SET bookings.start_date = '\''$(BOOKINGS_START_DATE)'\'';\\nSET bookings.init_days = '\''$(BOOKINGS_INIT_DAYS)'\'';\\nSET bookings.jobs = '\''$(BOOKINGS_JOBS)'\'';\\n\\\\i /bookings/generate_next_day.sql\\n" | PGPASSWORD="$$POSTGRES_PASSWORD" psql -v ON_ERROR_STOP=1 -U "$$POSTGRES_USER" -d demo'
|
||||
docker compose -f docker-compose.yml exec bookings-db bash -lc '\
|
||||
PGPASSWORD="$$POSTGRES_PASSWORD" psql -v ON_ERROR_STOP=1 -U "$$POSTGRES_USER" -d demo -f /bookings/generate_next_day.sql \
|
||||
'
|
||||
|
||||
bookings-psql:
|
||||
docker compose -f docker-compose.yml exec bookings-db bash -lc 'PGPASSWORD="$$POSTGRES_PASSWORD" psql -U "$$POSTGRES_USER" -d demo'
|
||||
|
||||
bookings-generate-day:
|
||||
docker compose -f docker-compose.yml up -d bookings-db
|
||||
docker compose -f docker-compose.yml exec bookings-db bash -lc 'printf "SET bookings.start_date = '\''$(BOOKINGS_START_DATE)'\'';\\nSET bookings.init_days = '\''$(BOOKINGS_INIT_DAYS)'\'';\\nSET bookings.jobs = '\''$(BOOKINGS_JOBS)'\'';\\n\\\\i /bookings/generate_next_day.sql\\n" | PGPASSWORD="$$POSTGRES_PASSWORD" psql -v ON_ERROR_STOP=1 -U "$$POSTGRES_USER" -d demo'
|
||||
docker compose -f docker-compose.yml exec bookings-db bash -lc '\
|
||||
until PGPASSWORD="$$POSTGRES_PASSWORD" pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB" -h localhost; do \
|
||||
echo "Waiting for bookings-db to become ready..."; \
|
||||
sleep 1; \
|
||||
done \
|
||||
'
|
||||
docker compose -f docker-compose.yml exec bookings-db bash -lc '\
|
||||
PGPASSWORD="$$POSTGRES_PASSWORD" psql -v ON_ERROR_STOP=1 -U "$$POSTGRES_USER" -d demo -f /bookings/generate_next_day.sql \
|
||||
'
|
||||
|
||||
dev-setup:
|
||||
$(UV) python install $(PYTHON_VERSION)
|
||||
|
||||
@@ -183,6 +183,9 @@ make bookings-psql # Подключиться к демобазе bookings
|
||||
|
||||
# Проверка данных
|
||||
make logs # Следить за логами Airflow
|
||||
|
||||
# Контроль генерации bookings
|
||||
docker compose -f docker-compose.yml exec bookings-db bash -lc 'PGPASSWORD="$POSTGRES_PASSWORD" psql -U "$POSTGRES_USER" -d demo -c "SELECT busy();"'
|
||||
```
|
||||
|
||||
---
|
||||
@@ -203,8 +206,8 @@ make logs # Следить за логами Airflow
|
||||
- `BOOKINGS_DB_NAME` — база данных, из которой запускается установка генератора (по умолчанию: bookings)
|
||||
- `BOOKINGS_DB_PORT` — внешний порт для подключения к контейнеру bookings-db (по умолчанию: 5434)
|
||||
- `BOOKINGS_START_DATE` — начальная дата модельного времени (по умолчанию: 2017-01-01)
|
||||
- `BOOKINGS_INIT_DAYS` — сколько дней сгенерировать при первой инициализации (по умолчанию: 30)
|
||||
- `BOOKINGS_JOBS` — число параллельных джобов генератора bookings (по умолчанию: 1)
|
||||
- `BOOKINGS_INIT_DAYS` — сколько дней сгенерировать при первой инициализации (по умолчанию: 1, чтобы увидеть данные без долгого ожидания)
|
||||
- `BOOKINGS_JOBS` — число параллельных джобов генератора bookings (по умолчанию: 1; при 1 генерация идёт синхронно без dblink)
|
||||
|
||||
### CSV pipeline
|
||||
- `CSV_DIR` — путь к каталогу с CSV внутри контейнеров Airflow (по умолчанию: `/opt/airflow/data`)
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
--- a/engine.sql
|
||||
+++ b/engine.sql
|
||||
@@ -165,6 +165,11 @@
|
||||
-- disconnect all previously opened connections
|
||||
PERFORM dblink_disconnect(unnest(dblink_get_connections()));
|
||||
|
||||
+ IF jobs = 1 THEN
|
||||
+ CALL process_queue(end_date);
|
||||
+ RETURN;
|
||||
+ END IF;
|
||||
+
|
||||
-- start parallel jobs
|
||||
FOR i IN 1 .. jobs LOOP
|
||||
connname := 'job' || i;
|
||||
@@ -230,7 +235,8 @@
|
||||
SELECT count(*) > 0
|
||||
FROM pg_stat_activity
|
||||
WHERE application_name = 'Airlines processor'
|
||||
- AND state != 'idle';
|
||||
+ AND state != 'idle'
|
||||
+ AND pid <> pg_backend_pid();
|
||||
END;
|
||||
|
||||
/*
|
||||
@@ -0,0 +1,11 @@
|
||||
--- a/install.sql
|
||||
+++ b/install.sql
|
||||
@@ -10,7 +10,7 @@
|
||||
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
-DROP DATABASE demo;
|
||||
+DROP DATABASE IF EXISTS demo;
|
||||
CREATE DATABASE demo;
|
||||
\c demo
|
||||
CREATE EXTENSION btree_gist;
|
||||
@@ -4,32 +4,22 @@ _Этот файл внутренний, удалить перед итогов
|
||||
|
||||
- Контейнер `bookings-db` — отдельный сервис Postgres из `docker-compose.yml`, база по умолчанию `demo` (из upstream demodb), без переименований.
|
||||
- Доступ снаружи не блокируем (порт `5434` по умолчанию), чтобы позже читать через PXF и подключаться из Greenplum.
|
||||
- Инициализация (`make bookings-init`): поднимает контейнер, клонирует demodb (без автопатчей), запускает `install.sql` как есть; генерация стартовых данных должна проходить штатными `generate/continue`.
|
||||
- Генерация следующего дня: либо `make bookings-generate-day` вызывает `CALL continue(...)`, либо ручной вызов; скрипт `generate_next_day.sql` опционален и не должен менять upstream SQL (только тонкая обертка при желании).
|
||||
- Исходники demodb: клонировать по требованию с закрепленным коммитом (чтобы не ловить неожиданные изменения). Добавить в `.gitignore`, если не коммитим. Завендорить в репо можно позже, если лицензия позволит.
|
||||
- Документация: в README описать шаги (`bookings-init`, проверка данных, генерация дня), параметры `.env`, и что настройка PXF/ETL — следующий этап.
|
||||
- Инициализация (`make bookings-init`): поднимает контейнер, клонирует demodb с закреплённым коммитом, накладывает патчи (`engine`: `jobs=1` синхронно + `busy()` игнорирует свой pid; `install.sql`: `DROP DATABASE IF EXISTS`), ждёт `pg_isready`, ставит `gen.connstr` и GUC `bookings.start_date/init_days/jobs`, затем запускает `/bookings/generate_next_day.sql` через `psql -f`. Значения по умолчанию: стартовая дата 2017-01-01, `init_days=1`, `jobs=1`.
|
||||
- Генерация следующего дня: `make bookings-generate-day` прогоняет тот же SQL (читает GUC, вызывает `generate/continue`, ждёт `busy()`, закрывает dblink). При `jobs=1` всё синхронно, без dblink.
|
||||
- Исходники demodb: клонируем по требованию с фиксированным хешем, кладём в `bookings/demodb/` (в `.gitignore`), патчи лежат в `bookings/patches/` и применяются автоматически.
|
||||
- Документация: в README описаны команды (`bookings-init`, проверка данных, генерация дня), параметры `.env`; настройка PXF/ETL — следующий этап.
|
||||
|
||||
## Текущее состояние
|
||||
- `Makefile` очищен: убраны автопатчи demodb; добавлены `DEMODB_REPO/DEMODB_COMMIT` с фиксированным хешем `d68de1…`, таргет снова исполняется. `BOOKINGS_JOBS` задаёт число джобов генерации (по умолчанию 1).
|
||||
- `.gitignore` дополнен `bookings/demodb/` (клонируем по требованию, не коммитим).
|
||||
- `bookings-init` теперь после установки запускает генерацию (дата из `BOOKINGS_START_DATE`, дни из `BOOKINGS_INIT_DAYS`, параллельность `BOOKINGS_JOBS`), используя обертку `generate_next_day.sql`.
|
||||
- `generate_next_day.sql` читает GUC `bookings.start_date/init_days/jobs`, вызывает `generate/continue`, ждёт `busy()`, закрывает dblink.
|
||||
- Генерация через `make` остаётся нестабильной: в логах обрывы dblink, данные не появляются.
|
||||
- `Makefile` теперь автоматически применяет патчи (`engine_jobs1_sync.patch`, `install_drop_if_exists.patch`), ждёт готовности Postgres через `pg_isready`, запускает `install.sql`, выставляет `gen.connstr`/GUC и вызывает `generate_next_day.sql` через `psql -f`.
|
||||
- Дефолты: `BOOKINGS_START_DATE=2017-01-01`, `BOOKINGS_INIT_DAYS=1`, `BOOKINGS_JOBS=1`. При `jobs=1` генерация идёт синхронно без dblink, `busy()` не учитывает текущую сессию.
|
||||
- `.env.example`/README обновлены под новые дефолты; каталог `bookings/demodb/` в `.gitignore`.
|
||||
- Патчи лежат в `bookings/patches/` и накладываются при `bookings-clone-demodb`.
|
||||
|
||||
## Текущее состояние тестов/проблем
|
||||
- Прогон `make bookings-init` с `BOOKINGS_JOBS=2`, `BOOKINGS_INIT_DAYS=30`: установка ок, GUC/`gen.connstr` выставлены, `Starting job 1/2: ok`, но `bookings.bookings` пустая, в `gen.events` висит `INIT`, `busy()` может быть `t`. Логи: `could not send data to client: Broken pipe` / `connection to client lost` при `TRUNCATE ... CASCADE` в `do_init`.
|
||||
- С `BOOKINGS_JOBS=1` аналогично. Ручная генерация в DBeaver (CALL generate(now(), now()+interval '1 year')) ранее шла медленно, так что проблема может быть в запуске через `docker exec`/pipe или в dblink-подключениях.
|
||||
- Чистый прогон `make bookings-init` (после `docker compose down -v` и удаления `bookings/demodb`) проходит за ~1,5 минуты: база ставится, `busy()` → `f`, `bookings.bookings` от `2017-01-01 00:00:18` до `2017-01-01 23:59:59`.
|
||||
- Ранее зависание на `busy()` при `jobs=1` лечится патчем: `process_queue` теперь синхронный, а `busy()` игнорирует текущий backend.
|
||||
- Данных пока только на 1 день по умолчанию, чтобы генерация не занимала много времени.
|
||||
|
||||
## Идеи/следующие шаги
|
||||
- Проверить генерацию внутри контейнера через here-doc без пайпа:
|
||||
```
|
||||
docker compose exec -T bookings-db psql -U bookings -d demo <<'SQL'
|
||||
SET bookings.start_date = '2017-01-01';
|
||||
SET bookings.init_days = '30';
|
||||
SET bookings.jobs = '1';
|
||||
\i /bookings/generate_next_day.sql
|
||||
SQL
|
||||
```
|
||||
Наблюдать `busy()`, `gen.log`, `gen.events/events_history`.
|
||||
- Если так ок — переписать Makefile под такой запуск. Если нет — попробовать `gen.connstr` с `host=localhost` и/или оставить `jobs=1` без dblink.
|
||||
- Пока нестабильно, держать `init_days` небольшим (1–3), чтобы быстро видеть прогресс.
|
||||
- Если понадобится больше дней — увеличивать `BOOKINGS_INIT_DAYS`, но помнить, что генерация может идти долго; контролировать через `SELECT busy();`.
|
||||
- Следующий этап — PXF/ETL в Greenplum; текущая задача — лишь подготовить источник bookings.
|
||||
|
||||
Reference in New Issue
Block a user