Досягнення нульового простою розгортання торкнулося цього ж питання, але мені потрібні поради щодо стратегії, яку я розглядаю.
Контекст
Веб-додаток з Apache / PHP для обробки на стороні сервера та MySQL DB / файлова система для постійності.
Зараз ми будуємо інфраструктуру. Все мережеве обладнання матиме надмірність, і всі основні мережеві кабелі будуть використовуватися в з'єднаних парах для відмовок. Сервери конфігуруються як пари з високою доступністю для апаратної відмовостійкості і будуть збалансовані навантаження як для відмов віртуальних машин, так і для загальної продуктивності.
Моя мета - ми можемо застосовувати оновлення до програми без будь-якого простою. Я сильно постраждав при проектуванні інфраструктури, щоб забезпечити 100% час роботи; було б дуже прикро, щоб потім мати 10-15 хвилин простоїв кожного разу, коли застосовується оновлення. Це особливо важливо, оскільки ми маємо намір мати дуже швидкий цикл випуску (іноді він може досягати одного або декількох випусків на день.
Мережева топологія
Це короткий підсумок мережі:
Load Balancer
|----------------------------|
/ / \ \
/ / \ \
| Web Server | DB Server | Web Server | DB Server |
|-------------------------|-------------------------|
| Host-1 | Host-2 | Host-1 | Host-2 |
|-------------------------|-------------------------|
Node A \ / Node B
| / |
| / \ |
|---------------------| |---------------------|
Switch 1 Switch 2
And onward to VRRP enabled routers and the internet
Примітка: сервери БД використовують реплікацію master-master
Пропонована стратегія
Щоб досягти цього, я зараз думаю розбити сценарії оновлення схеми БД на дві частини. Оновлення виглядатиме так:
- Веб-сервер у вузлі А знімається в режимі офлайн; трафік продовжує оброблятися веб-сервером на вузлі B.
- Зміни перехідної схеми застосовуються до серверів БД
- Веб-сервер Оновлена база коду, очищаються кеші та вживаються будь-які інші дії з оновлення.
- Веб-сервер A розміщено в Інтернеті, а веб-сервер B - в автономному режимі.
- Оновлено базу кодів веб-сервера B, очищаються кеші та вживаються будь-які інші дії з оновлення.
- Веб-сервер B представлений в Інтернеті.
- Остаточні зміни схеми застосовуються до БД
"Перехідна схема" буде розроблена для встановлення сумісної БД з перехресними версіями. В основному це використовує представлення таблиць, що імітують стару схему версії, тоді як сама таблиця буде змінена на нову схему. Це дозволяє старій версії взаємодіяти з БД як звичайна. Імена таблиць включають номери версій схеми, щоб гарантувати, що не буде плутанини щодо того, в яку таблицю писати.
"Кінцева схема" видалить зворотну сумісність і налагодить схему.
Питання
Словом, чи спрацює це?
більш конкретно:
Чи виникнуть проблеми через потенціал для одночасних записів у конкретній точці зміни перехідної схеми? Чи є спосіб переконатися, що група запитів, що модифікують таблицю і створюють сумісний з видом назад, виконуються послідовно? тобто будь-які інші запити утримуються в буфері до тих пір, поки зміни схеми не будуть завершені, які, як правило, становлять лише мілісекунди.
Чи існують більш прості методи, які забезпечують цей ступінь стабільності, а також дозволяють оновити без простою? Також бажано уникати "еволюційної" стратегії схеми, оскільки я не хочу замикатися на зворотному сумісності схеми.