Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Непрерывный деплой приложений / 13 сообщений из 13, страница 1 из 1
11.07.2012, 19:29:31
    #37875511
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный деплой приложений
А кто как организует у себя процесс непрерывного развертывания приложений?


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

Понятно, что бизнес желает подсунуть технарям время для даунтайма между 1-3 ночи. Понятно что технари против.

Отсюда и рождается вопрос. Возможно ли обойтись вообще без downtime?
Так чтобы и манагеры не плакали и так чтобы деплой делался днем.

Да, простые выкладки проходят и днем без проблем. Сложности возникают как правило при деплое завязанном на изменение схемы БД. Там часто бывает так что не только схема меняется, но и сами данные, что занимает время. Часы.


Сейчас на ум приходит только вариант с копией базы и переключением на нее во время деплоя.
Неужели из-за каждого наката делать копию терабайтной бздюхи?

Либо копией изменяемых таблиц, но тогда придется это и в коде учитывать. А не хотелось бы.


Кто какие схемы применяет?
Какие встречал подводные камни?

Есть готовые решения?
...
Рейтинг: 0 / 0
11.07.2012, 20:06:33
    #37875535
Йуный джавистЪ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный деплой приложений
Я бы на вашем месте полностью заскриптовал процесс деплоя. Затем, я бы тестировал деплой каждого нового апдейта в тестовом окружении на тестовой базе.
Если достичь высокого качества всего процесса, то в принципе можно ставить протестированный деплой скрипт в назначенные задания, чтобы он выполнился ночью без участия человека, или с минимальным участием человека (чтобы человек из дома за 5-10 минут проконтролировал, что все ок и лег спать).
Можно предусмотреть автоматический откат на предыдущую версию в случае сбоя (многие базы поддерживают транзакционный DDL в той или иной степени, например Postgres(там весь DDL транзакционный) или Oracle (см create schema)).
Если вам надо одновременно менять схему и данные без даунтайма, то вам надо использовать крутую функциональность СУБД. Например, Oracle Editions:
http://docs.oracle.com/cd/E11882_01/appdev.112/e10471/adfns_editions.htm
If other users must be able to change data in the tables while you are changing their structure, you also use forward crossedition triggers. If the pre- and post-upgrade applications will be in ordinary use at the same time (hot rollover), you also use reverse crossedition triggers. Crossedition triggers are not a permanent part of the application—you drop them when all users are using the post-upgrade application.

Ваш вариант с копией будет работать только если во время апдейта вы не пишете в базу, а только читаете. В противном случае вам надо будет как-то переносить изменения из копии в основную базу, что нетривиально.
Если вы готовы мириться с тем, что во время апдейта в базу нельзя будет писать, то я предлагаю следующее. У вас наверняка есть hot standby. Возможно, СУБД позволяет временно остановить накатку логов на стендбай на время апдейта (или это можно сделать грубой силой, выключив линк между master и standby). На время апдейта читайте со standby, потом вернетесь на master. Standby со временем догонит мастера. Сам я не уверен в работоспособности такой конструкции.
...
Рейтинг: 0 / 0
11.07.2012, 20:15:37
    #37875543
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный деплой приложений
Пишем код, который патчит базу параллельно вместе с работой приложения. Когда все обновление заканчивается, то удаляем и патчилку и код, который отвечал за работу с данными разных версий, к чертям.
...
Рейтинг: 0 / 0
11.07.2012, 20:43:07
    #37875550
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный деплой приложений
Ну смотрите, когда идет накат новой поставки, то от редеплоя приложения никуда не уйти, верно? Верно, то есть даун тайм всегда будет > 0.
Совсем другое дело, что вы непонятно зачем гоняете тесты на продакшене - тут то и кроется вся проблема. Продакшн не предназначен для этого, на него надо только ставить стабилизированные версии и все.
Возникает вопрос - где их стабилизировать? На предпродакшне (ну или "референс энвайрнмент" - разные названия одного и того же). Это среда, максимально приближенная к боевым условиям. То есть на ней должны стоять те же версии апп сервера и ОС, та же версия СУБД, смотреть на те же веб-сервисы (или максимально точно застабленные), ну и т.д.. Тут гоняйте тесты сколько вашей душе угодно, стабилизируйте, и т.д..
Если ваш заказчик не готов потратить на это ресурсы, то тут вступает действие политика - сможете ли вы грамотно снять с себя ответственность за нестабильные деплои и т.д.., короче это уже вне темы топика.
...
Рейтинг: 0 / 0
12.07.2012, 13:25:12
    #37876489
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный деплой приложений
svenom,

к сожалению, даже на предпроде не всегда получается получить такую же ситуацию как на боевом.

дело в окружении. часто в конфигах и т.д.

под тестингом на боевом я имел ввиду только самые необходимые шаги. буквально, что оно встало и пашет.

говорят GAE как то умеет обеспечивать версионность приложений. я думал есть инструменты похожие и в Java EE
...
Рейтинг: 0 / 0
12.07.2012, 13:42:14
    #37876529
svenom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный деплой приложений
Ясно, тогда в общем случае решения не существует.
...
Рейтинг: 0 / 0
12.07.2012, 17:02:45
    #37876987
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный деплой приложений
Кореецговорят GAE как то умеет обеспечивать версионность приложений. я думал есть инструменты похожие и в Java EE
Я думаю, там только сам war-ник версионируется. Хотя точно не знаю.
По схеме версионирования war-ников работает amazon elastic beans.
...
Рейтинг: 0 / 0
12.07.2012, 17:26:50
    #37877046
Йуный джавистЪ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный деплой приложений
говорят GAE как то умеет обеспечивать версионность приложений. я думал есть инструменты похожие и в Java EE

Так же как в GAE вы можете сделать сами за полчаса. Деплоите каждую новую версию в отдельный контекст, например версия XYZ будет деплоиться в http://someapp/versionXYZ. Спереди ставите апач как прокси, чтобы он переадресовывал запросы http://someapp/* на http://someapp/versionXYZ/*. Когда надо переключиться, меняете конфиг апача и делаете SIGHUP. После этого можно удалять старый контекст. Но это будет работать только если у вас голые сервлеты, а не полноценный JavaEE сервер.
...
Рейтинг: 0 / 0
12.07.2012, 19:20:01
    #37877235
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный деплой приложений
Кореецговорят GAE как то умеет обеспечивать версионность приложений. я думал есть инструменты похожие и в Java EE http://docs.oracle.com/cd/E13222_01/wls/docs90/deployment/redeploy.html
...
Рейтинг: 0 / 0
13.07.2012, 20:48:45
    #37878950
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный деплой приложений
Спасибо. У оракла есть решение на самом сервере приложений. Разные стратегии деплоя. Неплохо. Здорово их описали. Спасибо подумаем)).

Осталось только с версионностью базы решить.

Есть такая идея.

Если изменяется структура БД, то не альтерить текущие таблички. Оставить их в покое.
Всегда создавать новые + скрипт копирования данных из старых в новых.

Тогда можно начинать деплой БД отдельно от деплоя приложения и к тому же не останавливая работу.

Есть только одна проблема - внешние ключи. и запросы к изменяемой табличке.

И если запросы легко инкапсулируются в случае использования NamingQuery -JQL + достаточно будет поменять только одну Entity, которая кстати и так и так будет переделана в новую версию как минимум по структуре, то с внешними ключами сложнее.

1. С одной стороны их можно не создавать. но тогда придется этот контроль отдавать в сервер приложений. Довериться ему. А это чревато. Накосячить могут сами прогеры. Работа с ключами, связями, целостностью отлажена в любом движке СУБД до блеска и по скорости и по качеству.

2. А можно применив хук в структуре БД .

Как вам такой вариант. Это будет как стратегия создания сущностей с поддержкой реалтайм обновления структур.

Определимся что у каждой сущности всегда должен быть первичный ключ. Суррогат.
Для каждой сущности, которая может иметь внешние ключи делаем структуру из двух таблиц с идентифицирующей связью 1:1.

Первая таблица MasterTable содержит только ПК и никаких других полей.
Вторая таблица DetailTable содержит внешний ключ на эту табличку, который в свою очередь тоже ПК.
Все атрибуты хранятся в DetailTable.

Т.е. условно это как бы одна табличка. что-то типа кластера.

Все таблички которым нужен внешний ключ строят его на MasterTable.
Т.е. DetailTable всегда свободна от внешних ключей на нее.

Теперь если нам нужно дополнить или поменять атрибутивный состав DetailTable мы создаем табличку DetailTable_v2 и для нее накатываем новый Entity. Убедившись что скрипт копирования данных отработал успешно, то удаляем старую DetailTable.

Cами по себе Detail могут содержать внешние ключи на другие сущности помимо своей Master. Но эти внешние ключи тоже будут исключительно на их MasterTable_<Other>. Т.е. они тоже всего лишь атрибуты.

Про связи многие ко многим не думал пока. Но по сути это всегда тоже отдельная таблица и она сама по себе легко меняется на новую версию. Для таблицу связей M:N мастер не нужен будет.


Ну как? Бред?
...
Рейтинг: 0 / 0
13.07.2012, 20:54:38
    #37878954
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный деплой приложений
Кореец,

Да. я понимаю что и со связью Master-Detail могут накосячить, но это вылезет сразу. Просто ни один объект сохранный в базе не будет иметь ни одного заполненного атрибута. Либо ваще не выберется если джойн построить без внешнего объединения.

т.е. это сразу вылезет. Такие ошибки легко поправятся до тестов.


А если совсем уж зафантизироваться то можно в реляционке хранить основные связи, а сами значения атрибутов в KeyValue базе. NoSQL.

Понятно что тогда джойнов от внешних ключей с Detail не получится. Ну и не надо. Там простейшими отдельными запросами по этим ключам к тоже NoSQL очень быстро отработает.
...
Рейтинг: 0 / 0
14.07.2012, 00:22:35
    #37879063
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный деплой приложений
КореецНу как? Бред?Да. Нужно просто взять и привыкнуть, что изменения в СУБД всегда проходят долго и болезненно, и слить эти вопросы на специально обученных людей, в противном случае Вы имеете все шансы начитаться на форумах всякой ереси (к примеру 12852967 ) и "внезапно" завалить базу
...
Рейтинг: 0 / 0
14.07.2012, 11:28:40
    #37879183
rrrrrrrr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непрерывный деплой приложений
Ну и еще есть вариант из мира nosql - использовать schemaless-style хранение. Можно применить его так, что там конечно не совсем schemaless будет, но сильно релаксированный вариант в любом случае.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Непрерывный деплой приложений / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]