Налаштування etcd-кластера для конфігурацій застосунків

Кворум сховища конфігурацій втрачається раптово — і разом з ним зупиняються сервіси, які залежать від налаштувань. Ми налаштовуємо відмовостійкий кластер під ключ: розміщуємо вузли в різних зонах, перевіряємо поведінку під час відмов, передаємо команді регламенти та схеми. Результат — сервіси переживають відмову окремого вузла без ручного втручання.
Часті запитання

Чому etcd кластер втрачає кворум і обвалює сервіси

etcd кластер зберігає конфігурацію як журнал реплікованих записів: запис вважається застосованим лише після підтвердження більшістю вузлів. Із п’яти вузлів кворум потребує трьох — втрата третього переводить кластер у режим лише читання, а згодом і в повну відмову.

Окрема пастка — розсинхрон налаштувань: вузол із повільним диском відстає від лідера, накопичує чергу змін і випадає з голосування, після чого ті, що залишилися, починають по колу обирати нового лідера.

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

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

Далі спрацьовує каскадна недоступність. На сховищі зав’язані виявлення сервісів, ротація секретів і запуск нових екземплярів застосунків: поки воно мовчить, не піднімаються репліки, не оновлюються маршрути, а перевірки живості починають відстрілювати здорові екземпляри. Втрата кворуму б’є по всьому контуру одразу, хоча причина локальна.

І майже завжди це не раптова відмова диска, а накопичений борг: усі вузли в одній зоні відмови, немає контролю затримки застосування записів, бекапи жодного разу не перевіряли відновленням. Розбираємо, як це закривається — від топології та лімітів до регламенту заміни вузла.

Що дає відмовостійкий etcd кластер: ефект за метриками

Відмовостійкий etcd кластер збирають із непарної кількості вузлів — зазвичай трьох або п’яти. Такий склад переживає втрату одного-двох вузлів: ті, що залишилися, зберігають кворум і продовжують віддавати конфігурацію, тому деградація вузла не перетворюється на зупинку сервісів. Нижче — п’ять результатів, які видно в метриках після переїзду на такий контур.

Час відновлення після відмови вузла

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

Усунений клас відмов: розбіжність конфігурацій між сервісами

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

Історія ревізій показує, хто й коли змінив значення, а відкат до попередньої ревізії повертає сервіс у робочий стан за секунди замість пошуку відмінностей вручну.

Решта ефектів — відсутність єдиної точки відмови під час читання налаштувань, однакова конфігурація в усіх середовищах і передбачувана швидкість застосування змін: правка розкочується на всі сервіси одним проходом, без обходу хостів.

Режими розгортання сховища конфігурацій: порівняння

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

Один центр обробки даних

Тут доречний статичний склад вузлів: адреси прописані в конфігурації кожного учасника, кластер збирається передбачувано, налагодження зводиться до перевірки зв’язності між вузлами. Непарна кількість вузлів дає запас на відмову одного з них без зупинки запису.

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

Кілька зон доступності

Тут потрібніше динамічне виявлення: вузли знаходять одне одного через зовнішній реєстр або службу імен, склад кластера змінюється без ручної правки. Ціна — залежність від мережі між зонами та від самого джерела виявлення.

Чим вища затримка між зонами, тим довше підтверджується запис, тому зони розміщують із передбачуваною зв’язністю.

Режим Коли підходить Обмеження схеми
Статичний склад, один ЦОД Невеликий контур зі стабільною кількістю вузлів Новий вузол — правка конфігурацій і перезапуск; відмова центру зупиняє запис
Статичний склад за зонами Є керована мережа між зонами Затримка між зонами збільшує час підтвердження запису
Динамічне виявлення Склад вузлів змінюється часто Потрібне зовнішнє джерело виявлення; його недоступність заважає зборці

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

Етапи впровадження: від аудиту до передачі в експлуатацію

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

Аудит поточного стану

Дивимося, що вже працює та які конфігурації не можна втрачати, і окремо — на поточні точки відмови: єдиний вузол, реплікація без кворуму, бекап, який жодного разу не перевіряли.

  1. Аудит конфігурацій. Карта сервісів, які читають і пишуть стан, обсяг ключів, частота змін, права доступу. На виході — вузькі місця та список конфігурацій, які переживуть міграцію без правок.
  2. Проєктування схеми. Кількість вузлів і кворум, розкладка за зонами доступності, регламент бекапу, схема сертифікатів і розмежування доступу між застосунками.
  3. Налаштування вузлів. Розгортання за спроєктованою схемою, перенесення конфігурацій із звіркою ключів, моніторинг, алерти на втрату кворуму та автоматичний перезапуск.

Перевірка відмовостійкості під навантаженням

  • Перевірка відмовостійкості. Гасимо по одному вузлу, імітуємо втрату лідера та розрив зв’язку між зонами: кластер зобов’язаний зберегти кворум і продовжувати обслуговувати читання й запис.
  • Навантажувальні прогони. Профіль, близький до бойового: піки запису, багато одночасних клієнтів, довгі сесії. Вимірюємо затримку відповіді та час вибору нового лідера.
  • Передача в експлуатацію. Регламенти відновлення, дашборди, розмежування прав, навчання з командою замовника та супровід у перші дні після перемикання.

Комплект передачі: конфігурації, схеми, політики доступу

Комплект збираємо не «для галочки», а щоб чергова зміна могла підняти, розширити й відновити кластер без нас. Нижче — що саме передається замовнику на руки разом із працюючим контуром.

Політики доступу та IAM-ролі

  • Ролі та прив’язки з розділенням прав: читання конфігурацій, запис, адміністрування кластера — під окремі сервісні облікові записи.
  • Порядок видачі та ротації сертифікатів із процедурою відкликання скомпрометованого ключа.
  • Матриця «хто і що може»: відповідність застосунків, облікових записів і дозволених операцій; запис у бойовий контур із тестових застосунків заборонено правилами.
  • Налаштування аудиту: які звернення до сховища логуються та як довго зберігається журнал.

Регламенти обслуговування та відновлення

  • Конфігураційні файли всіх вузлів із коментарями — який параметр кластера виставлено й чому саме так.
  • Схеми розгортання: топологія, кворум, порядок додавання та заміни учасника, прив’язка до майданчиків.
  • Регламент обслуговування: регламентні перевірки стану, оновлення на актуальну гілку, виведення вузла без втрати кворуму.
  • Інструкція з відновлення: зняття резервних копій, перевірка їх придатності, сценарій підняття з нуля та точка, до якої можливий відкат.
  • Документація для експлуатації: відповідальні, вікна робіт, час реакції чергового та журнал змін.

Комплект передаємо в закритому репозиторії та на захищеному носії, із супровідним описом — що лежить у кожній папці та коли цей артефакт потрібно оновлювати.

Кейс: відновлення сховища без втрати конфігурацій

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

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

Що було до: ручні правки та розбіжність налаштувань

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

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

Що стало після: керована схема та перемикання вузлів

Тепер стан etcd-кластера описано декларативно й живе в репозиторії поруч із маніфестами Kubernetes: зміни проходять рев’ю та застосовуються автоматично.

Кворум тримається на непарній кількості вузлів і переживає втрату одного — виведення вузла на обслуговування займає секунди, застосунки не помічають перемикання.

Снапшот знімається кожні п’ятнадцять хвилин і раз на тиждень перевіряється повним відновленням на тестовому контурі.

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

Що робити, якщо сховище вже розгорнуто в одному центрі?

Робоча схема з кворумом в одному центрі розширюється без перезбирання кластера. Додавання вузла — це приєднання нового учасника до чинного кворуму: лідер зберігає роль, запис конфігурацій іде безперервно. Новий вузол спочатку отримує снапшот і наздоганяє журнал змін, і лише потім стає голосуючим.

Порядок такий: вузли вводяться по одному, між кроками перевіряємо відставання за журналом і відгук на читання. Так зміна топології проходить поступово — з трьох учасників на п’ять у тому ж центрі, а потім частину з них переносять на інший майданчик. Дані залишаються ті самі, змінюється лише розкладка кворуму за центрами.

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

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

Перед перемиканням фіксуємо план: точки повернення, свіжі снапшоти, допустиме відставання та порядок виведення вузлів.

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

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

Технічні сумніви замовників: відмови вузлів і оновлення

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

Нижче — три питання, які найчастіше задають до старту робіт: поведінка під час випадіння вузла, порядок зміни складу та придатність резервних копій.

Що станеться, якщо один вузол випаде?

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

Склад із двох вузлів кворуму не дає взагалі — випадіння будь-якого зупиняє запис, тому парні схеми ми переводимо на непарні, а не «зміцнюємо» додаванням другого вузла.

Як змінювати склад без простою?

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

Адреси та ролі учасників описані в конфігурації як дані — ми не правимо живі вузли руками, інакше склад розходиться з описом.

Як переконатися, що резервна копія робоча?

Знімок стану безкорисний, поки його не відновлено: копія перевіряється розгортанням на ізольованому стенді, звіркою повноти ключів і контрольних значень із робочим кластером. Окремо фіксуємо час відновлення — саме він визначає, за скільки середовище підніметься після аварії.

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

Обговоримо задачу: повернемося з оцінкою та планом робіт

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

Що запитуємо для розрахунку:

  • поточну схему розміщення вузлів etcd: скільки машин, як рознесені за зонами доступності, чи окремі диски під журнал;
  • чим зараз керуються конфігурації застосунків і як вони доставляються на вузли;
  • профіль навантаження: кількість ключів, частка операцій запису проти читання, пікові періоди;
  • вимоги до доступності — яке вікно недоступності одного вузла допустиме, хто ініціює обслуговування;
  • як влаштовано резервне копіювання та коли востаннє перевіряли відновлення з копії;
  • обмеження за доступами, сертифікатами, сегментацією мережі та регламентом змін;
  • хто з боку замовника приймає роботи й за якими критеріями.

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

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142