2. Контекст
• много хранимых процедур >500
• большой размер базы ~2 TB, большой TPS
• много разработчиков
• много веток
2
3. Проблема
• деплоить несколько версий процедур на одной базе
• удобное версионировение кода хранимых процедур
• применение DDL изменений
• массовые update'ы
3
4. Решение «Zalando»
• под каждую выкатку создавать схему со всеми х/п
• замена search_path
• плюсы: простое решение. Схема дает самодостаточность
• минусы: много изменений для системного каталога
версия отражается в названии схемы
4
5. Решение
• деплоить только изменившиеся хранимые процедуры
• название хранимой процедуры содержит версию
• иметь php-словарь с маппингом хранимая процедура — версия
• приложение «решает» какую версию использовать
версия отражается в названии хранимой процедуры
5
7. GIT
• содержимое public.get_matrixes.sql:
CREATE OR REPLACE FUNCTION public.get_matrixes(OUT o_matrix_id integer)
RETURNS SETOF integer
LANGUAGE sql
AS $function$
select
matrix_id as o_matrix_id
from my_schema.matrix_probabilities
order by matrix_id;
$function$
ALTER FUNCTION public.get_matrixes SET work_mem = '100 MB';
• инициализация/дамп, например, через pg_get_functiondef()
7
8. Маппинг. БД
• Таблица stored_procedures:
• branch_name — имя ветки
• fn_name — имя хранимой процедуры
• fn_md5 — хеш от файла хранимой процедуры
• ver_id — порядковый номер версии хранимой процедуры
8
10. Деплой
• содержимое public.get_matrixes.sql:
CREATE OR REPLACE FUNCTION public.get_matrixes_ver2(OUT o_matrix_id
integer)
RETURNS SETOF integer
LANGUAGE sql
AS $function$
select
matrix_id as o_matrix_id
from my_schema.matrix_probabilities
order by matrix_id desc;
$function$
10
13. Плюсы и минусы
• Плюсы:
• выкатываются только измененные хранимые процедуры
• можно хранить несколько версий х/п в одной базе
• легкий «откат»
• Минусы:
• трудности при использовании внутренних х/п
13
16. Деплой v2
• Две схемы: base, diff
• Два пользователя со след. search_path: User_A: base, User_B: diff, base.
• Приложение использует User_A
16
17. Деплой v2
• При выкатке, все изменившиеся хранимые процедуры создаются в diff
схеме
• После деплоя х/п новая версия приложения начинает использовать
User_B
• По окончанию выкладки php кода, переносим х/п из diff в base.
Меняем местами search_path у пользоватлей:
User_A: diff, base, User_B: base
• Приложение использует User_B
17
18. 18
• выкатываются только измененные хранимые процедуры
• нет проблем с использованием внутренних хранимых процедур
• откат через деплой
Итог