У процесі видалення колонки в MySQL в додатку, що працює на Ruby on Rails, виникла проблема, яку можна було б уникнути, якщо б ми більше уваги приділили налаштуванням кешування схеми в ActiveRecord. В процесі видалення колонки важливо дотримуватися кількох етапів: спочатку потрібно прибрати всі посилання на цю колонку в коді, провести тестування, потім виконати деплой на реальному сервері, а після цього виконати DDL операції, які включають видалення колонки як на master, так і на slave сервері.
Під час роботи з базами даних важливо також виконати перемикання між master та slave серверами, адже це дозволяє мінімізувати простій під час внесення змін. Але в нашому випадку проблема виникла на етапі, коли на slave сервері була видалена колонка, а на master це ще не було зроблено. Оскільки нова версія функцій вимагала перезавантаження серверів, проблема стала очевидною, коли при наступному перезавантаженні з'явився збій.
Щоб усунути проблему, я спочатку перезавантажив сервери, підозрюючи, що це може бути проблемою кешування, але навіть після цього помилка залишалася. Тоді я згадав про ключове слово ActiveRecord ignore_columns
і застосував його, що допомогло вирішити проблему.
Найбільше здивувала проблема з кешуванням схеми, оскільки на slave сервері колонка вже була видалена, а на master — ні. ActiveRecord використовує кешування для вибору колонок в запитах, і коли на master відбувається запит із неіснуючою колонкою, виникає помилка.
Щоб уникнути подібних проблем у майбутньому, я зрозумів, що завжди потрібно додавати ignore_columns
до моделі перед тим, як виконувати деплой, особливо під час перемикання або видалення колонок. Це дозволяє уникнути несумісностей між кодом і базою даних, забезпечуючи плавність роботи системи.
Це також навчає, що при використанні нових технологій важливо не лише розуміти їхні можливості, а й знати, як можна уникнути потенційних проблем, що виникають при роботі з базами даних у складних конфігураціях.
Перекладено з: [장애회고] ActiveRecord 스키마 캐싱으로 인한 장애 회고