프로덕션 마이그레이션의 도전과 Rails의 해결책
Shopify는 대규모 Rails 애플리케이션에서 무중단 데이터베이스 마이그레이션을 수행해야 하는 과제에 직면했습니다. 프로덕션에서는 테이블 잠금 없는 온라인 스키마 마이그레이션(LHM)이 필수적이며, 기존의 복잡한 몽키 패치와 취약한 RACC SQL 파서 기반 구현은 한계가 있었습니다.
Rails 스와퍼블 마이그레이션 전략 도입 (Rails 7.0)
Shopify의 Rails Infrastructure 팀은 이 문제를 해결하고자 Rails 프레임워크에 ‘전략 패턴’ 기반의 스와퍼블 마이그레이션 백엔드를 제안하고 구현했습니다. 이 패턴은 마이그레이션과 데이터베이스 연결 어댑터 사이에 전략 객체를 두어 실행 방식을 유연하게 제어합니다.
-
기본 전략:
ActiveRecord::Migration::DefaultStrategy는 마이그레이션 메서드를 연결에 직접 전달하여 SQL을 실행합니다. -
사용자 정의 전략:
config.active_record.migration_strategy를 통해JsonSerializationStrategy같은 사용자 정의 전략을 설정할 수 있습니다. Shopify는 이를 활용, 스키마 변경 작업을 JSON 페이로드로 직렬화하여 중앙 서비스로 제출, 안전성 검사 및 실행을 위임합니다. 이 설정은schema_migrationsGem 이니셜라이저를 통해 프로덕션 환경에 자동 적용됩니다.
안전성 검사 및 다중 DB 지원 강화
기존 SQL 파서 기반 안전성 검사의 취약점을 개선하고자 MigrationOperationRecorder를 개발, 마이그레이션 시 호출되는 메서드와 인수를 기록하고 이 데이터를 기반으로 다양한 안전성 검사를 수행합니다. 이 method_missing 기반 기록 방식은 실행 전략과 분리되어 모든 환경에서 일관된 안전성 검사를 가능하게 합니다. 또한, 다중 데이터베이스 시스템 지원을 위해 Rails 8.2부터는 어댑터별 마이그레이션 전략 등록 기능이 추가되어, 각 DB 유형에 맞는 맞춤형 처리가 더욱 용이해질 예정입니다.