Подключение bookings db заработало
This commit is contained in:
+3
-3
@@ -15,9 +15,9 @@ BOOKINGS_DB_NAME=bookings
|
|||||||
BOOKINGS_DB_PORT=5434
|
BOOKINGS_DB_PORT=5434
|
||||||
# Начальная дата модельного времени для генерации демобазы
|
# Начальная дата модельного времени для генерации демобазы
|
||||||
BOOKINGS_START_DATE=2017-01-01
|
BOOKINGS_START_DATE=2017-01-01
|
||||||
# Количество дней для первой генерации (потом добавляем по одному дню)
|
# Количество дней для первой генерации (держим малым, чтобы быстрее увидеть данные)
|
||||||
BOOKINGS_INIT_DAYS=30
|
BOOKINGS_INIT_DAYS=1
|
||||||
# Количество параллельных джобов генератора (по умолчанию 1)
|
# Количество параллельных джобов генератора (по умолчанию 1; при 1 работаем синхронно без dblink)
|
||||||
BOOKINGS_JOBS=1
|
BOOKINGS_JOBS=1
|
||||||
|
|
||||||
# Greenplum Configuration
|
# Greenplum Configuration
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ DEMODB_REPO := https://github.com/postgrespro/demodb.git
|
|||||||
DEMODB_COMMIT := d68de192850237719f09b47688d5f3fc94653ca6
|
DEMODB_COMMIT := d68de192850237719f09b47688d5f3fc94653ca6
|
||||||
BOOKINGS_JOBS ?= 1
|
BOOKINGS_JOBS ?= 1
|
||||||
BOOKINGS_START_DATE ?= 2017-01-01
|
BOOKINGS_START_DATE ?= 2017-01-01
|
||||||
BOOKINGS_INIT_DAYS ?= 30
|
BOOKINGS_INIT_DAYS ?= 1
|
||||||
|
|
||||||
.PHONY: up down airflow-init logs gp-psql ddl-gp \
|
.PHONY: up down airflow-init logs gp-psql ddl-gp \
|
||||||
bookings-clone-demodb bookings-init bookings-psql bookings-generate-day \
|
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 fetch --depth 1 origin $(DEMODB_COMMIT); \
|
||||||
git -C bookings/demodb checkout $(DEMODB_COMMIT); \
|
git -C bookings/demodb checkout $(DEMODB_COMMIT); \
|
||||||
fi
|
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
|
bookings-init: bookings-clone-demodb
|
||||||
docker compose -f docker-compose.yml up -d bookings-db
|
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 '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 '\
|
docker compose -f docker-compose.yml exec bookings-db bash -lc '\
|
||||||
CONNSTR="dbname=demo user=$$POSTGRES_USER password=$$POSTGRES_PASSWORD"; \
|
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)'\'';" \
|
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:
|
bookings-psql:
|
||||||
docker compose -f docker-compose.yml exec bookings-db bash -lc 'PGPASSWORD="$$POSTGRES_PASSWORD" psql -U "$$POSTGRES_USER" -d demo'
|
docker compose -f docker-compose.yml exec bookings-db bash -lc 'PGPASSWORD="$$POSTGRES_PASSWORD" psql -U "$$POSTGRES_USER" -d demo'
|
||||||
|
|
||||||
bookings-generate-day:
|
bookings-generate-day:
|
||||||
docker compose -f docker-compose.yml up -d bookings-db
|
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:
|
dev-setup:
|
||||||
$(UV) python install $(PYTHON_VERSION)
|
$(UV) python install $(PYTHON_VERSION)
|
||||||
|
|||||||
@@ -183,6 +183,9 @@ make bookings-psql # Подключиться к демобазе bookings
|
|||||||
|
|
||||||
# Проверка данных
|
# Проверка данных
|
||||||
make logs # Следить за логами Airflow
|
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_NAME` — база данных, из которой запускается установка генератора (по умолчанию: bookings)
|
||||||
- `BOOKINGS_DB_PORT` — внешний порт для подключения к контейнеру bookings-db (по умолчанию: 5434)
|
- `BOOKINGS_DB_PORT` — внешний порт для подключения к контейнеру bookings-db (по умолчанию: 5434)
|
||||||
- `BOOKINGS_START_DATE` — начальная дата модельного времени (по умолчанию: 2017-01-01)
|
- `BOOKINGS_START_DATE` — начальная дата модельного времени (по умолчанию: 2017-01-01)
|
||||||
- `BOOKINGS_INIT_DAYS` — сколько дней сгенерировать при первой инициализации (по умолчанию: 30)
|
- `BOOKINGS_INIT_DAYS` — сколько дней сгенерировать при первой инициализации (по умолчанию: 1, чтобы увидеть данные без долгого ожидания)
|
||||||
- `BOOKINGS_JOBS` — число параллельных джобов генератора bookings (по умолчанию: 1)
|
- `BOOKINGS_JOBS` — число параллельных джобов генератора bookings (по умолчанию: 1; при 1 генерация идёт синхронно без dblink)
|
||||||
|
|
||||||
### CSV pipeline
|
### CSV pipeline
|
||||||
- `CSV_DIR` — путь к каталогу с CSV внутри контейнеров Airflow (по умолчанию: `/opt/airflow/data`)
|
- `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), без переименований.
|
- Контейнер `bookings-db` — отдельный сервис Postgres из `docker-compose.yml`, база по умолчанию `demo` (из upstream demodb), без переименований.
|
||||||
- Доступ снаружи не блокируем (порт `5434` по умолчанию), чтобы позже читать через PXF и подключаться из Greenplum.
|
- Доступ снаружи не блокируем (порт `5434` по умолчанию), чтобы позже читать через PXF и подключаться из Greenplum.
|
||||||
- Инициализация (`make bookings-init`): поднимает контейнер, клонирует demodb (без автопатчей), запускает `install.sql` как есть; генерация стартовых данных должна проходить штатными `generate/continue`.
|
- Инициализация (`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` вызывает `CALL continue(...)`, либо ручной вызов; скрипт `generate_next_day.sql` опционален и не должен менять upstream SQL (только тонкая обертка при желании).
|
- Генерация следующего дня: `make bookings-generate-day` прогоняет тот же SQL (читает GUC, вызывает `generate/continue`, ждёт `busy()`, закрывает dblink). При `jobs=1` всё синхронно, без dblink.
|
||||||
- Исходники demodb: клонировать по требованию с закрепленным коммитом (чтобы не ловить неожиданные изменения). Добавить в `.gitignore`, если не коммитим. Завендорить в репо можно позже, если лицензия позволит.
|
- Исходники demodb: клонируем по требованию с фиксированным хешем, кладём в `bookings/demodb/` (в `.gitignore`), патчи лежат в `bookings/patches/` и применяются автоматически.
|
||||||
- Документация: в README описать шаги (`bookings-init`, проверка данных, генерация дня), параметры `.env`, и что настройка PXF/ETL — следующий этап.
|
- Документация: в README описаны команды (`bookings-init`, проверка данных, генерация дня), параметры `.env`; настройка PXF/ETL — следующий этап.
|
||||||
|
|
||||||
## Текущее состояние
|
## Текущее состояние
|
||||||
- `Makefile` очищен: убраны автопатчи demodb; добавлены `DEMODB_REPO/DEMODB_COMMIT` с фиксированным хешем `d68de1…`, таргет снова исполняется. `BOOKINGS_JOBS` задаёт число джобов генерации (по умолчанию 1).
|
- `Makefile` теперь автоматически применяет патчи (`engine_jobs1_sync.patch`, `install_drop_if_exists.patch`), ждёт готовности Postgres через `pg_isready`, запускает `install.sql`, выставляет `gen.connstr`/GUC и вызывает `generate_next_day.sql` через `psql -f`.
|
||||||
- `.gitignore` дополнен `bookings/demodb/` (клонируем по требованию, не коммитим).
|
- Дефолты: `BOOKINGS_START_DATE=2017-01-01`, `BOOKINGS_INIT_DAYS=1`, `BOOKINGS_JOBS=1`. При `jobs=1` генерация идёт синхронно без dblink, `busy()` не учитывает текущую сессию.
|
||||||
- `bookings-init` теперь после установки запускает генерацию (дата из `BOOKINGS_START_DATE`, дни из `BOOKINGS_INIT_DAYS`, параллельность `BOOKINGS_JOBS`), используя обертку `generate_next_day.sql`.
|
- `.env.example`/README обновлены под новые дефолты; каталог `bookings/demodb/` в `.gitignore`.
|
||||||
- `generate_next_day.sql` читает GUC `bookings.start_date/init_days/jobs`, вызывает `generate/continue`, ждёт `busy()`, закрывает dblink.
|
- Патчи лежат в `bookings/patches/` и накладываются при `bookings-clone-demodb`.
|
||||||
- Генерация через `make` остаётся нестабильной: в логах обрывы dblink, данные не появляются.
|
|
||||||
|
|
||||||
## Текущее состояние тестов/проблем
|
## Текущее состояние тестов/проблем
|
||||||
- Прогон `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`.
|
- Чистый прогон `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`.
|
||||||
- С `BOOKINGS_JOBS=1` аналогично. Ручная генерация в DBeaver (CALL generate(now(), now()+interval '1 year')) ранее шла медленно, так что проблема может быть в запуске через `docker exec`/pipe или в dblink-подключениях.
|
- Ранее зависание на `busy()` при `jobs=1` лечится патчем: `process_queue` теперь синхронный, а `busy()` игнорирует текущий backend.
|
||||||
|
- Данных пока только на 1 день по умолчанию, чтобы генерация не занимала много времени.
|
||||||
|
|
||||||
## Идеи/следующие шаги
|
## Идеи/следующие шаги
|
||||||
- Проверить генерацию внутри контейнера через here-doc без пайпа:
|
- Если понадобится больше дней — увеличивать `BOOKINGS_INIT_DAYS`, но помнить, что генерация может идти долго; контролировать через `SELECT busy();`.
|
||||||
```
|
- Следующий этап — PXF/ETL в Greenplum; текущая задача — лишь подготовить источник bookings.
|
||||||
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), чтобы быстро видеть прогресс.
|
|
||||||
|
|||||||
Reference in New Issue
Block a user