Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Один базист и сто
разработчиков
Михаил Балаян
Руководитель группы баз данных
ЛАНИТ, 2016
Источники вдохновения
• zakupki.gov.ru (Госзакупки: 3 системы, 1 домен)
– 800 000 юзеров
– 300 000 уников в день
– 1 500 p...
Технологии
Oracle Exadata IBM Websphere Application Server Крипто ПРО CSP, TSP, JCP, OCSP
OnCloud, Selectel, Amazon AWS Or...
План
• Проблема
• Требования
• Liquibase изнутри
• Свод правил
Проблема #1. Много разработчиков
• мало
специалистов
по базам
данных
• много
разработчиков
Проблема #2. Много стендов
• мало
специалистов
по базам
• много стендов
• с разными
версиями
Проблема #3. Человеческий фактор
• Потеря
изменений
при сведении
• Повторное
применение
• Контроль
изменений
на каждом
сте...
Проблема #4. Версионность
• Версия приложения == версия базы данных
• Код приложения можно деплоить многократно
(stateless...
А есть ли проблема?
Небольшая команда
Мало изменений в
базе данных
А можно по-другому?!
А как?
Написали своё
Почему не своё
• Заточено под
конкретный проект
• Заточено под
конкретную базу
данных
• Сопровождение и
развитие своими
си...
Проблемы. Итого
• Много разработчиков
• Много стендов и баз
данных
• Сложность ведения
версий системы
• Сложность
автомати...
Необходимые требования
• Скрипты базы – это
часть версии
• Применение
скриптов
автоматически
• Идемпотентность*
* не ругат...
Достаточные требования
• Создание «с нуля»
для любой версии
системы (миграции
никто не отменял)
• Защита от
одновременного...
Почему liquibase
• По описанию удовлетворял всем требованиям
• Поддерживает чистый sql (xml, yaml, json)
• Имеет возможнос...
Внутреннее устройство
defaultSchemaName
Основные понятия Liquibase
• Changelog
• Changeset
• Preconditions
Liquibase XML [sql]
<sql> считает “;” в конце строки как разделитель выражения
Liquibase XML [createProcedure]
Liquibase XML [runAlways]
Защита от одновременного запуска
INFO 12.02.16 19:32: liquibase: Waiting for changelog lock....
INFO 12.02.16 19:33: liqui...
Идемпотентность
Once committed never changes
Идемпотентность и Обычная БД
Автоматизация
• Bamboo (jenkins, hudson)
• Shell / bat
./liquibase --driver=org.postgresql.Driver
--username=$USR
--change...
Часть версии
• Ченджлоги и исходники приложения хранятся в ветке
версии
• Для каждой версии свой ченджлог
• Каждая следующ...
Создание с нуля
• Initial_changelog (табличное
пространство, база данных,
пользователи) // postgres
• Prerun_changelog (сх...
Это ещё не всё
• Что делать с имеющимися проектами
• Что делать, если нужно откатить изменения
• Как обеспечить уникальнос...
Имеющиеся проекты
• Reverse engineering не полный
• Сложные проекты: baseline dump +
changesets
• Простые: changesets
Откат изменений
• Liquibase XML: createTable, renameColumn,
addColumn
• Блок <rollback>
• Способы:
– по количеству ченджсе...
Уникальность ченджсетов
• Уникальность: author + id + filename
• Id = <date+TodayChangeNumber>
Удобство анализа (include)
• Для каждой версии
создаём свой
ченджлог
• Все
пересоздаваемые
объекты базы в
отдельных
ченджл...
Открытые вопросы (PostgreSQL)
• Изменение пересоздаваемых объектов
– Function return type
– View column drop
• Зависимости...
Наш этикет
• Используем только теги <sql>, <createProcedure>
• Если есть служебные символы XML, обрамляем конструкцией <![...
Quick start
• Скачать liquibase http://www.liquibase.org/download/index.html
• Распаковать <lbdir>
• Скачать требуемый jdb...
Контакты
Михаил Балаян
Руководитель группы баз данных
E-mail: balayan@lanit.ru
Skype: m.balayan
Upcoming SlideShare
Loading in …5
×

Один базист и сто разработчиков или как мы внедряли Liquibase. Михаил Балаян, ЛАНИТ

1,119 views

Published on

Михаил Балаян, ЛАНИТ
“Один базист и сто разработчиков или как мы внедряли Liquibase”. В выступлении речь идет о том, как в компании ЛАНИТ обеспечиваются миграции баз данных и как реализуется практика Непрерывной Интеграции (Continuous Integration).
Встреча #TechGuruDay #PostgreSQLRussia в компании ЛАНИТ, 12.02.2016
Ссылки:
Видео - https://www.youtube.com/watch?v=JNstiXQoppE&feature=youtu.be
Сообщество PostgreSQLRussia - http://PostgreSQLRussia.org
ЛАНИТ - http://lanit.ru/structure/department_of_corporate_systems.php, https://job.lanit.ru/
Полная запись со встречи - https://www.youtube.com/watch?v=syFnwghfR98&feature=youtu.be

Published in: Education
  • Be the first to comment

  • Be the first to like this

Один базист и сто разработчиков или как мы внедряли Liquibase. Михаил Балаян, ЛАНИТ

  1. 1. Один базист и сто разработчиков Михаил Балаян Руководитель группы баз данных ЛАНИТ, 2016
  2. 2. Источники вдохновения • zakupki.gov.ru (Госзакупки: 3 системы, 1 домен) – 800 000 юзеров – 300 000 уников в день – 1 500 pvs (200 pvs поисковых) • dom.gosuslugi.ru (ГИС ЖКХ) – Вся страна – 1 000 000 уников в день – over 3 000 pvs
  3. 3. Технологии Oracle Exadata IBM Websphere Application Server Крипто ПРО CSP, TSP, JCP, OCSP OnCloud, Selectel, Amazon AWS Oracle Weblogic Соболь VMWare vSphere Redhat Jboss EAP АПКШ Континент Redhat Enterprise Linux Hazelcast Ansible IBM AIX Oracle Service Bus Docker Oracle RDBMS IBM Datapower Appliance Vagrant PostgreSQL Super Cool Software Zabbix Riak KV/S2 Apache Active MQ Oracle Enterprise Manager MongoDB Nginx Atlassian Bamboo Apache Cassandra Apache HTTP Server Jenkins Oracle NoSQL HAProxy Confluence Oracle BI Trusted TLS svn Pentaho Kav4proxy git
  4. 4. План • Проблема • Требования • Liquibase изнутри • Свод правил
  5. 5. Проблема #1. Много разработчиков • мало специалистов по базам данных • много разработчиков
  6. 6. Проблема #2. Много стендов • мало специалистов по базам • много стендов • с разными версиями
  7. 7. Проблема #3. Человеческий фактор • Потеря изменений при сведении • Повторное применение • Контроль изменений на каждом стенде
  8. 8. Проблема #4. Версионность • Версия приложения == версия базы данных • Код приложения можно деплоить многократно (stateless) • Скрипты базы данных деплоить многократно нельзя (stateful) • Can you make a build in one step? (Joel Spolsky)
  9. 9. А есть ли проблема? Небольшая команда Мало изменений в базе данных А можно по-другому?! А как? Написали своё
  10. 10. Почему не своё • Заточено под конкретный проект • Заточено под конкретную базу данных • Сопровождение и развитие своими силами
  11. 11. Проблемы. Итого • Много разработчиков • Много стендов и баз данных • Сложность ведения версий системы • Сложность автоматизации • Сложность подключения нового сотрудника
  12. 12. Необходимые требования • Скрипты базы – это часть версии • Применение скриптов автоматически • Идемпотентность* * не ругательство
  13. 13. Достаточные требования • Создание «с нуля» для любой версии системы (миграции никто не отменял) • Защита от одновременного запуска обновлений
  14. 14. Почему liquibase • По описанию удовлетворял всем требованиям • Поддерживает чистый sql (xml, yaml, json) • Имеет возможность обратной разработки (reverse engineering) • Есть возможность выполнения diff баз данных • Open-source, Java • Самостоятельный jar-файл • Альтернатив было не много
  15. 15. Внутреннее устройство defaultSchemaName
  16. 16. Основные понятия Liquibase • Changelog • Changeset • Preconditions
  17. 17. Liquibase XML [sql] <sql> считает “;” в конце строки как разделитель выражения
  18. 18. Liquibase XML [createProcedure]
  19. 19. Liquibase XML [runAlways]
  20. 20. Защита от одновременного запуска INFO 12.02.16 19:32: liquibase: Waiting for changelog lock.... INFO 12.02.16 19:33: liquibase: Waiting for changelog lock.... INFO 12.02.16 19:33: liquibase: Waiting for changelog lock.... INFO 12.02.16 19:33: liquibase: Waiting for changelog lock.... INFO 12.02.16 19:33: liquibase: Waiting for changelog lock.... INFO 12.02.16 19:33: liquibase: Waiting for changelog lock.... INFO 12.02.16 19:33: liquibase: Waiting for changelog lock.... INFO 12.02.16 19:34: liquibase: Waiting for changelog lock.... INFO 12.02.16 19:34: liquibase: Waiting for changelog lock.... INFO 12.02.16 19:34: liquibase: Waiting for changelog lock.... INFO 12.02.16 19:34: liquibase: Waiting for changelog lock.... Unexpected error running Liquibase: Could not acquire change log lock. Currently locked by Balayan (77.88.55.66) since 12.02.16 19:20
  21. 21. Идемпотентность Once committed never changes
  22. 22. Идемпотентность и Обычная БД
  23. 23. Автоматизация • Bamboo (jenkins, hudson) • Shell / bat ./liquibase --driver=org.postgresql.Driver --username=$USR --changeLogFile=master_changelog.xml --url=$URL/dbname?tcpKeepAlive=true --password=$PWD --logLevel=info update if [ $? -ne 0 ] then exit 1 fi
  24. 24. Часть версии • Ченджлоги и исходники приложения хранятся в ветке версии • Для каждой версии свой ченджлог • Каждая следующая версия содержит ченджлоги всех предыдущих
  25. 25. Создание с нуля • Initial_changelog (табличное пространство, база данных, пользователи) // postgres • Prerun_changelog (схемы, расширения, владельцы, значения по-умолчанию) • Master_changelog (сами изменения) // правят разработчики • Postrun_changelog (права на объекты, ro-пользователи)
  26. 26. Это ещё не всё • Что делать с имеющимися проектами • Что делать, если нужно откатить изменения • Как обеспечить уникальность ченджсетов • Как облегчить последующий анализ изменений в версии
  27. 27. Имеющиеся проекты • Reverse engineering не полный • Сложные проекты: baseline dump + changesets • Простые: changesets
  28. 28. Откат изменений • Liquibase XML: createTable, renameColumn, addColumn • Блок <rollback> • Способы: – по количеству ченджсетов – до определенной даты
  29. 29. Уникальность ченджсетов • Уникальность: author + id + filename • Id = <date+TodayChangeNumber>
  30. 30. Удобство анализа (include) • Для каждой версии создаём свой ченджлог • Все пересоздаваемые объекты базы в отдельных ченджлогах (include)
  31. 31. Открытые вопросы (PostgreSQL) • Изменение пересоздаваемых объектов – Function return type – View column drop • Зависимости объектов в БД sql> create table t1 (f1 text); sql> create view v1 as select * from t1; sql> alter table t1 alter column f1 type char(5); ERROR: cannot alter type of a column used by a view or rule DETAIL: rule _RETURN on view v1 depends on column "f1“
  32. 32. Наш этикет • Используем только теги <sql>, <createProcedure> • Если есть служебные символы XML, обрамляем конструкцией <![CDATA[ … ]]> • Если нужно применение ченджсета при его изменениях, используем runOnChange=“true” • Если нужно постоянное применение ченджсета, используем runAlways=“true” • Каждое изменение пишем в отдельном ченджсете • Сохраненные в хранилище ченджсеты не правятся (разработчиками) • Для каждой версии создаём свой ченджлог • Каждая следующая версия содержит ченджлоги всех предыдущих • Есть разделение на служебные ченджлоги и на те, которые относятся к приложению (master_changelog.xml) • Пишем <rollback> блоки для ченджсетов • Id формируем в формате <текущая_дата>-<сегодняшний_номер_изменения> • Все пересоздаваемые объекты в отдельных ченджлогах
  33. 33. Quick start • Скачать liquibase http://www.liquibase.org/download/index.html • Распаковать <lbdir> • Скачать требуемый jdbc-драйвер https://jdbc.postgresql.org/download.html • Скопировать драйвер в каталог <lbdir>/lib • Запустить liquibase --driver=org.postgresql.Driver -- url=jdbc:postgresql://77.88.55.66:5454/liquitest -- username=postgres --password=postgres -- changeLogFile=generated_log.xml generateChangeLog • updateSQL, update
  34. 34. Контакты Михаил Балаян Руководитель группы баз данных E-mail: balayan@lanit.ru Skype: m.balayan

×