Блог ·
Ніде є місцем: переїзд між центрами обробки
Перевезти машину на інший майданчик означає, що якийсь час вона не стоїть у жодному центрі даних. Пʼятнадцять станів і три виходи з незнання.
Автор: Provibr
Перенести сервер з однієї стійки в іншу в межах тієї самої будівлі є однією фізичною дією з однією невизначеністю: чи він там. Ми змоделювали це деякий час тому, і найцікавішою виявилася мить, коли призначення не є ані зарезервованим, ані зайнятим.
Перевезти сервер до іншого міста не є тією самою задачею у більшому пальті. Це послідовність дій у двох місцях із проміжком, протягом якого машина не стоїть у жодному центрі даних, плюс мережевий бік, адресний бік і бік агентів, які на другому кінці мають знову стати правдою. Спокуса полягає в тому, щоб повторно вжити наявне переміщення та скасувати перевірку, яка змушує походження й призначення бути тим самим майданчиком. Ми цього не зробили, і ось причина.
Чому це другий обʼєкт, а не позначка
Наявне переміщення вже має походження, призначення, заморожену попередню перевірку, резервування на призначенні, лічильник звірення та слід, який лише додає. Бракує начебто однієї перевірки в базі даних.
Додавання позначки злило б дві машини станів в одну, яка не пасує жодній із них. Переміщення в межах майданчика має девʼять станів; переїзд між майданчиками має пʼятнадцять. Перше має два виходи з «ми не знаємо», другий має три, і цей третій полягає в тому, що машина загубилася в дорозі, чого між двома стійками в одній залі статися не може. А зняття перевірки дозволило б будь-якому наявному переміщенню, зокрема запланованому минулого тижня, мовчки перетнути межу майданчика.
Спільним є все, що справді однакове: та сама основа зайнятості з її частковим унікальним індексом, той самий журнал розташування, який лише додає, і той самий шов операції з початку, поступу та завершення. Види записів у сліді розділені, щоб через рік читач міг побачити, чи машина посунулася в межах зали, чи провела пів дня у фургоні. Один спільний запис «переміщено» стер би цю різницю назавжди.
Пʼятнадцять станів, і один із них є ніде
Три адміністративні стани, перш ніж станеться щось фізичне (чернетка, заплановано, погоджено), девʼять фаз справжньої роботи та три завершальні. Фази такі: вимкнення, демонтаж, перевезення, прибуття на призначення, монтаж, перепідключення, повторне вимірювання, підтвердження та стан, у якому ніхто не знає.
Станом, який тримає весь задум, є in_transit. Це єдиний триваючий стан, у якому майданчик машини справді порожній, і код записує цю порожнечу замість того, щоб її описувати: стовпець майданчика справді стає порожнім. Порожньо на майданчику зазвичай означає «не встановлено», а тут означає щось сильніше й буквальніше. Немає центру даних, у якому вона стоїть. Вона в дорозі.
Її сусіди такими не є, і це навмисно. unracked означає поза стійкою, але ще в будівлі, на візку, тож майданчиком лишається походження. destination_claimed означає, що вона дісталася другого кінця, але ще не в стійці, і від цієї миті адміністративно належить майданчику призначення. Дві межі на відстані години, і їх злиття зробило б відповідь на «де зараз машина 41» хибною для однієї з них.
Від вимкнення дороги назад немає
Переходи записані як таблиця по всіх пʼятнадцяти станах, а не як розгалуження, з тієї самої причини, що й усюди в цьому коді: розгалуження з типовою гілкою робить із щойно доданого стану дозволений, а стан, який хтось додає через щось незвичне, був би першим, кому дозволено все.
Важливий рядок виходить із approved. До нього включно переїзд можна скасувати, і нікому нічого не сталося. Від shutting_down далі скасування зникає. Хтось почав згортати чинну послугу клієнта; оновлення в базі даних цього не скасовує, а вдавати інше означає твердження про фізичний світ, якого ніхто не перевіряв.
Із кожної фізичної фази лишаються наступна фаза, «ми не знаємо» та «щось пішло не так». Будь-яка фізична фаза може привести до незнання, і це відрізняється від переміщення в межах майданчика, де туди потрапляють лише з одного стану. Причина полягає в обсязі: у межах майданчика є одна мить, коли ніхто не певен, а в переїзді між майданчиками таких митей шість. Чи вона ще в старій стійці. Чи вона на візку. Чи вона у фургоні. Чи вона на новій підлозі. Чи вона в стійці. Чи вона підключена.
Чотири речі, які він помічає й ніколи не лагодить
Переїзд записує рівно дві речі: майданчик і розташування машини та резервування стійки. Жодної адреси, жодного членства агента, жодної віртуальної мережі, жодної фабрики, жодного ребра топології.
Ця стриманість і є справжньою вимогою, і саме там хибна відповідь виглядає очевидною. Машина поїхала на інший майданчик, отже її адресний префікс напевно має поїхати слідом. Не має. Адреса з префікса, що маршрутизується на майданчику походження, на майданчику призначення не працює, а яка адреса має бути там натомість, платформа не знає. Який агент обслуговує нову залу, вирішує людина. Лише підтверджений доказ може зробити топологію правдою.
Кожна з тих речей стає тому відкритою перевіркою: виміряною, записаною та показаною, але ніколи виконаною.
| Перевірка | Звідки береться відповідь |
|---|---|
| Перепризначення адрес | Звʼязки послуг до серверів, до призначень, до префікса та його майданчика |
| Членство агента | Чи є взагалі агент, який покриває майданчик призначення |
| Повторне введення в дію | Завжди відкрита: обладнання, що змінює будівлю, скасовує готовність, і сьогодні ніщо не видає такого висновку |
| Перепідключення | Завжди відкрита: немає обліку кабелів по кожній одиниці, з яким можна звірятися |
Останні дві чесно кажуть про свою постійну відкритість замість того, щоб тихо стояти на «гаразд». Сказати, що щось гаразд, є твердженням, і його ніхто не робив.
Цю стриманість береже форма, а не дисципліна. Тест обходить синтаксичне дерево шести файлів цього потоку й падає на будь-якому вставленні чи оновленні в таблиці адрес, агентів, мережі, фабрики, послуг чи серверів. Спершу його доведено червоним із підсадженим записом. Другий, старіший тест ставить інше питання, а саме чи значення майданчика походить з обчислення, і він охоче схвалив би переїзд, який акуратно передає майданчик призначення. Два питання, два тести, і лише разом вони покривають правило.
Три виходи з незнання
Коли фізичний результат непевний, хтось має піти й подивитися. Усі три відповіді записані як спостереження, а не як відкат.
Побачено на призначенні. Переїзд завершується, а слід несе «спостережено на призначенні» замість «завершено», щоб лишалося читабельним, що сумнів був.
Побачено на походженні. Резервування на другому кінці звільняється, а переїзд закінчується як невдалий, а не як скасований, бо хтось виконав фізичну роботу, а переміщення не відбулося. Стару позицію навмисно не відкривають знову. Якщо машина вже була поза стійкою, ті одиниці звільнено, і там тим часом може висіти щось інше; повторне їх зайняття могло б поставити дві машини на одну одиницю, саме ту помилку, заради якої існує частковий унікальний індекс. Машина належить майданчику походження й не стоїть у жодній стійці, і це правда: вона стоїть на візку. Повернути її означає нову позицію й тому окрему дію.
Ніде не знайдено. Резервування на призначенні звільняється, бо тримати місце в стійці для обладнання, яке не приїде, дарма блокує когось іншого. Машина лишається в перевезенні без майданчика, а операція завершується невдало з власним блокуванням. Її рішуче не списують і не поміщають у карантин. Це рішення про машину, а «загублено» є спостереженням. Обладнання, яке зʼявиться наступного тижня, не має тим часом зникнути з усіх списків.
Порядок попередньої перевірки й одна річ про майданчики
Планування відмовляє в сталому порядку: обладнання існує, немає ані переміщення, ані другого переїзду в роботі (дві таблиці з двома частковими індексами, які нічого не знають одна про одну), воно справді десь розміщене, два майданчики різні, майданчик призначення активний, жодна послуга не стоїть на заваді, і місце вміщується.
Активним має бути лише призначення. Походження, яке згортається, не є перешкодою, а саме причиною, з якої люди перевозять обладнання. Зворотна вимога заблокувала б саме ту міграцію, заради якої функція існує.
Перевірка послуги відмовляє також на reserved та provisioning, а не лише на активній, що спершу нас здивувало, а потім перестало. Машина, на якій лежить резервування, обіцяна; скасовувати там треба замовлення, а не подорож машини.
Що ми записали б
- Інша форма заслуговує на інший обʼєкт. Якщо новий випадок має на шість станів більше, на один вихід більше та період перебування ніде, позначка на старому дає машину, яка не описує жодного з двох випадків.
- Пишіть «ніде» буквально. Порожнє значення, яке означає «у фургоні», корисніше за стан, що вдає, ніби машина ще десь стоїть.
- Після повідомленої фізичної роботи ніколи не відкочуйте. Додайте стан зі значенням «невідомо» й дайте йому задокументовані виходи, усі як спостереження.
- Не відкривайте звільнене місце знову. Простір, який ви відпустили, може бути зайнятий. Повернення є новою позицією з тією самою перевіркою зіткнень, що й будь-яка інша.
- Помічати без полагодження. Відкрита перевірка, яку розвʼязує людина, краща за автоматичний здогад про адреси, віртуальні мережі та кабелі.
- Бережіть стриманість тестом на форму. «Цей потік ніколи не пише в ті таблиці» можна перевірити; «ми памʼятатимемо, щоб цього не робити» ні.
- Перевірте напрям свого правила про майданчики. Вимога, щоб походження було здоровим, заборонила б саме той переїзд, якого всім бракує.
Для ясності щодо того, чим це є: робота з логістики центру даних лежить за перемикачем розгортання, вимкненим за замовчуванням, із налаштуванням на кожну організацію поверх нього, тож нічого з цього сьогодні не продається. Чотири речі лишаються недоведеними. Міграцію застосовано вручну на розробницькій базі даних і згорнуто, ніколи через мігратор. Аркуш звірення та кнопку скасування не проведено в браузері. Не виміряно сирий запит до дій із закритим перемикачем. І жодного разу не спостережено, як резервування на призначенні справді спливає.
Із платформної роботи Provibr. Версія в межах одного майданчика й те, чому резервування стає позицією замість того, щоб звільнитися й бути переписаним, описані в резервування стає позицією. Чому вільні одиниці в стійці не є потужністю, описано в місце у стійці не є ємністю.