anna_gp
@anna_gp
IT-student, part-time QA

Как устроить «песочницу» для тестирования запросов PosgreSQL?

Взялась помочь - и вроде сделала, да что-то у меня громоздко выходит, может знающие люди смогут подсказать что можно улучшить-упростить.

Это для сервиса где пользователи смогут решать задачки по SQL конкретно в диалекте Postgres. Нужно чтобы человек мог отправить скрипт со своим запросом (плюс немного CREATE/INSERT строчек к нему добавляется вначале конечно) и мы могли бы проверить результат. Отправка и т.п. - это всё есть, основная сложность в том чтобы изолировать выполнение скриптов, чтобы не повредили систему и не аффектили раз от раза друг друга.

Поковырялась вечер с гуглом и стековерфлоу, получилось вот так - в докере на базе ubuntu делаем (в докерфайле)

DEBIAN_FRONTEND=noninteractive apt install -y postgresql
useradd pguser
mkdir /test
chown pguser /test
chown pguser /var/run/postgresql
su pguser -c '/usr/lib/postgresql/16/bin/initdb -D /test/db'


вот эта штука с initdb выполняется секунд 10-20 поэтому её похоже приходится делать на старте (а можно ли как-то ускорить?)

остальное выполняется каждый раз в сессии (т.е. при получении и выполнении запроса) под пользователем pguser

/usr/lib/postgresql/16/bin/pg_ctl -D /test/db -l /dev/null start >/dev/null 2>&1
createdb
psql -q --csv -c '...' # тут CREATE TABLE; INSERT; SELECT... на самом деле из файла скорее будет выполняться, не важно
dropdb pguser
/usr/lib/postgresql/16/bin/pg_ctl -D /test/db stop
/usr/lib/postgresql/16/bin/pg_resetwal -D /test/db


В принципе это работоспособно, выполняется секунды 3-5 наверное, директория с базой как будто по размеру не растёт.

Сервер запускается и стопается чтобы можно было resetwal сделать да кроме того там не только постгрес в контейнере может тестироваться, так чтоб память не занимал.

Заранее спасибо!

P.S. это конкретно про постгрес, что можно с MySQL или H2 сделать проще (и даже в памяти) это в принципе понятно, но т.к. сейчас постгрес в энтерпрайзе повсеместно то есть желание чтобы условия были "приближенные к реальным".
  • Вопрос задан
  • 195 просмотров
Пригласить эксперта
Ответы на вопрос 3
sergey-gornostaev
@sergey-gornostaev Куратор тега PostgreSQL
Седой и строгий
Не нужны тут контейнеры. Просто создавайте новую БД под каждого пользователя и новую схему под каждую его песочницу.
Ответ написан
ky0
@ky0
Миллиардер, филантроп, патологический лгун
Я правильно понимаю, что вы на каждый запрос поднимаете новый контейнер с инициализацией кластера? Напрасно.

Я бы смотрел в сторону "один пользователь (или даже запрос) - одна БД внутри постоянно работающей толстой СУБД". Ну и БД периодически ротировал с очисткой.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
вот эта штука с initdb выполняется секунд 10-20 поэтому её похоже приходится делать на старте (а можно ли как-то ускорить?)

Да. Это похоже на правду. В качестве утешения могу сказать что Azure AKS контейнеры могут и
больше 1 минуты стартовать независимо от содержания.

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

Вопрос с переполнением памяти или с биллингом - подбирается эмпирически, исходя из
актуальных условий. Вряд-ли мы сейчас, поплевав в потолок сможем придумать что-то актуальное.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы