Перейти до вмісту
EuroVPSEuroVPS

Ніколи не перезавантажуйте загадку: що зафіксувати перед перезапуском

Перезапуск прибирає симптом і разом із ним докази; на системі зі станом п'ять хвилин, витрачених спершу на фіксацію стану, вирішують, чи виживуть дані.

Автор EuroVPS EngineeringМашинне відділення

6 хв читання
У цій статті 6 розділів
Коротко
  • Перезапуск сервісу без стану є виправленням. Перезапуск сервісу зі станом до того, як відома причина, є експериментом над вашими даними, а нечиста зупинка є саме тим механізмом, через який деякі рушії таблиць пошкоджуються.
  • Перезавантаження стирає стан процесів, власників сокетів, кільцевий буфер ядра та різницю між падінням і невдалим запуском. Зафіксуйте їх спершу; це займає хвилини.
  • Snapshot перед ремонтом, ремонт перед відновленням, і перевірка на межі, що відмовила, а не на рівні «сервіс піднявся».

Де рефлекс правий, а де ні

Вимкнути й увімкнути знову працює на завислому веб-worker, застряглому споживачі черги, ноутбуку. Стан, який був хибним, відкидається й будується заново з нуля, бо нічого цінного в ньому не жило. Бази даних, брокери повідомлень, демони сховища та все, що має write-ahead log, є протилежним випадком. Стан і є продуктом. Перезапуск не відкидає поганий стан; він відкидає інформацію про те, як він став поганим, а на деяких рушіях додає власних пошкоджень.

Що стирає перезапуск

Таблицю процесів та їхні часи: який процес працює відколи, який перебуває в неперервному сні й на чому. Власника кожного відкритого сокета й файлового дескриптора, що каже вам, хто тримав блокування чи порт. Кільцевий буфер ядра, який на типовій інсталяції не переживає перезавантаження і в якому заявляють про себе вбивство через брак пам'яті, помилка файлової системи чи диск, що відмовляє. Вміст пам'яті сервісу, який може зберегти core dump, а перезапуск не може. Хронологію вимкнення й завантаження, яка відрізняє падіння від невдалого запуску. А на рушії таблиць без відновлення після збою сама нечиста зупинка є тим, як пошкоджується заголовок індексу, тож перезапуск, що мав полагодити сервіс, може стати подією, яка пошкодить таблиці.

Набір доказів, за кілька хвилин

Усе нижче лише для читання. Запустіть це з оболонки на хості, перенаправте вивід у файл з часовою міткою й скопіюйте цей файл з машини, перш ніж хтось торкнеться чогось іншого.

TERMINAL
$ uptime; last -x | head -20; journalctl --list-boots | tail -3
$ dmesg -T | tail -200
$ ps -eo pid,ppid,stat,etime,wchan:24,cmd --sort=-etime | head -60
$ ss -tnp state established | head -100
$ free -m; df -h; df -i
$ vmstat 1 5
$ top -b -n 1 | head -40

Для бази даних додайте власний погляд рушія на самого себе, поки він ще відповідає, і хвіст його журналу помилок незалежно від того, відповідає він чи ні.

TERMINAL
mysql> SHOW FULL PROCESSLIST;
mysql> SHOW ENGINE INNODB STATUS\G
mysql> SHOW GLOBAL STATUS LIKE 'Threads_%';
$ tail -500 /var/log/mariadb/mariadb.log

Перший блок відповідає, чи хост уже перезавантажувався, чи ядро щось убило, що застрягло й на чому, хто тримає яке з'єднання і чи машина під тиском пам'яті або вводу-виводу. Другий відповідає, що, на думку бази даних, відбувається: довга транзакція тримає блокування, зупинений потік реплікації, deadlock, таблиця, позначена як пошкоджена.

Падіння чи невдалий запуск

Найкорисніша відмінність у журналі між сервісом, який упав, і сервісом, який чисто вимкнувся, а потім не зміг повернутися. Першому потрібно знайти тригер, перш ніж будь-що перезапускати, бо перезапуск в активний тригер відтворює падіння. Другий є проблемою запуску чи політики: змінена конфігурація, повний диск, права доступу, unit, який не був увімкнений. У другому випадку дані не під загрозою, і трактування його як падіння марнує час, який повернув би сервіс. Хвіст журналу сервісу показує, який це випадок: рядок про завершене вимкнення, за яким іде аварійне переривання при запуску, є другим випадком.

Оборотний шлях

Щойно тригер відомий, послідовність однакова на кожній системі зі станом. Зупиніть тригер, щоб виправлення не могло бути скасоване ще одним падінням посеред відновлення. Зробіть безкоштовний snapshot: зупиніть записи, перейменуйте каталог даних убік або зробіть snapshot тому, і тримайте одну копію поза хостом. Від цієї точки кожен крок можна повернути. Ремонтуйте до того, як відновлювати, бо резервна копія вірно несе все, що система несла на момент її створення, і якщо несправність приїхала разом із даними, відновлення підкидає її знову, відкидаючи все записане відтоді. Перевіряйте на межі, що відмовила: запит, який перервався, таблиця, що повідомила нуль рядків, позиція реплікації, а не просто те, що порт відкритий. Викочуйте заплановане налаштування лише після того, як пацієнт здоровий; відновлення й зміна є двома різними операціями.

РефлексЩо відбувається насправді
Перезапустити сервісЗ усе ще активним тригером він падає знову, і друга зупинка така ж нечиста, як і перша
Відновити з учорашньої копіїУсе з учорашнього вечора зникає, а несправність, що приїхала з даними, відновлюється разом із ними
Додати пам'яті, це схоже на пам'ятьЯкщо переривання спричинене програмою, що проходить пошкоджені метадані, обладнання нічого не змінює
Воно впало, отже щось зламанеЧисте вимкнення з подальшим невдалим запуском є проблемою перезапуску без загрози даним

Обнулений лічильник рядків після жорсткого перезавантаження зазвичай є пошкодженим індексом над цілими рядками. На рушіях без відновлення після збою ремонт перебудовує індекс із даних; відновлення викидає дані геть.

Лікування, на відміну від відновлення

Ремонт є відновленням. Лікування полягає в усуненні того, що спричиняє нечисті зупинки, і в конвертації таблиць, які не можуть пережити таку зупинку, на рушій, який може. Обидва належать до подальшої роботи, а не до гасіння пожежі.

Прямі відповіді

Чи варто перезапускати базу даних, що впала?+

Не раніше, ніж журнал скаже вам, чи вона впала, чи не змогла запуститися, і яким був тригер. Перезапуск в активний тригер відтворює падіння, а на рушії, не стійкому до збоїв, може пошкодити таблиці. Спершу зафіксуйте все лише для читання, потім вирішуйте.

Моя таблиця показує нуль рядків після збою. Дані зникли?+

Часто ні. На рушіях таблиць без відновлення після збою нечиста зупинка пошкоджує заголовок індексу, тоді як рядки залишаються на диску, а рушій повідомляє кількість із заголовка. Зробіть snapshot каталогу даних, потім запустіть ремонт рушія; ремонт зазвичай перебудовує індекс із рядків, які все ще там. Відновлюйте лише якщо ремонт не вдався.

Чи є відновлення з резервної копії найбезпечнішим відновленням?+

Зазвичай воно найруйнівніше. Усе записане після копії відкидається, а якщо несправність уже була в даних, коли копія створювалася, вона повертається разом із нею. Відновлення є останнім кроком після діагностики й ремонту.

Що треба зафіксувати до того, як хтось будь-що перезапустить?+

Таблицю процесів із часами, власників відкритих сокетів, кільцевий буфер ядра, тиск пам'яті та вводу-виводу, використання диска й inode, історію завантажень, а також власний статус сервісу та його журнал помилок. Записане у файл і скопійоване з хоста. Це займає хвилини, і це єдина копія цих доказів, яку ви матимете.

Лежите просто зараз із пальцем на кнопці перезапуску?

Поговоріть з інженером; ми спершу діагностуємо лише для читання й робимо snapshot перед усім, що пише.

Поговоріть з інженером

Ви дійшли до кінця.

Застосуйте прочитане на практиці

Що ви запускаєте?

Розкажіть нам про навантаження, трафік і вимоги до відновлення. Почніть з конструктора сервера або обговоріть деталі з інженером.

Написано інженерами, які будують і експлуатують інфраструктуру, про яку йдеться.
Поговоріть з інженером
XIn

Залишилося 6 хв