OpenStack 라이브 마이그레이션, 내부 동작 원리를 파헤치다!
OpenStack의 라이브 마이그레이션은 3단계로 진행되며, 이번 글은 Live migration operation 단계에 집중함
libvirt 드라이버가 virDomain.migrateToURI3를 호출하여 실제 마이그레이션 수행, 파라미터 설정 중요
Nova는 환경 설정을 기반으로 마이그레이션 플래그를 결정, libvirt에 전달하여 VM 마이그레이션 제어
libvirt를 통한 마이그레이션 과정
OpenStack은 libvirt C API를 호출하여 VM 마이그레이션을 수행한다. 구체적으로 LibvirtDriver._live_migration_operation()에서 시작하여 Guest.migrate()를 거쳐 virDomain.migrateToURI3()를 호출한다. 따라서 OpenStack 레벨에서는 libvirt API 호출을 통해 마이그레이션 과정을 제어한다.
Nova의 마이그레이션 플래그 결정
Nova는 VIR_MIGRATE_LIVE, VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PERSIST_DEST 플래그를 설정하여 libvirt에 전달한다. 따라서 P2P 방식으로 마이그레이션을 수행하고, 소스 VM 정의를 제거하며, 대상 호스트에 VM 정의를 유지한다. 마이그레이션 플래그 설정은 시스템 동작에 큰 영향을 미친다.
네트워크 전송 방식과 성능 고려
라이브 마이그레이션 시 Hypervisor native transport 방식을 사용하면 성능을 향상시킬 수 있다. QEMU가 직접 소통하여 데이터 사본 수를 최소화하기 때문이다. 반면, libvirt tunnelled transport는 암호화를 지원하지만, 추가적인 데이터 복사본 발생으로 성능 저하를 야기할 수 있다. 따라서 전송 방식 선택 시 보안 vs 성능의 트레이드오프를 고려해야 한다.