AWS Database Migration Service 를 이용한 실시간 DB 복제
AWS DMS(Database Migration Service)
Database Migration Service는 온프레미스 DB 간, 혹은 온프레미스 DB-AWS DB 간 데이터베이스를 마이그레이션할 수 있는 서비스입니다. RDBMS(MySQL, Oracle 등), NoSQL 데이터베이스 등 다양한 데이터베이스 유형을 지원합니다. DMS의 작동 방식은 아래와 같이 원본 데이터베이스와 대상 데이터베이스를 각각 엔드포인트로 설정하고 양쪽 엔드포인트 사이에 구성된 복제 인스턴스가 소스 엔드포인트로부터 타겟 엔드포인트로 데이터 복제를 수행합니다.
복제는 1회만 수행할 수도 있으나, 복제를 위한 태스크(작업) 생성 시 마이그레이션 유형을 통해 기존 데이터 마이그레이션 및 지속적인 변경사항을 복제하도록 설정 가능합니다. 아래는 마이그레이션 유형을 "기존 데이터 마이그레이션 및 지속적인 변경사항 복제"로 선택하여 온프레미스에 구성된 DB를 실시간으로 복제하는 내용의 테스트 구성입니다.
AWS Database Migration Service 를 이용한 실시간 DB 복제
토스트 클라우드 상에 구성한 MySQL 데이터베이스를 온프레미스 환경의 데이터베이스로 가정하고 DMS를 이용하여 AWS RDS로 실시간 복제하는 내용의 테스트 구성입니다.
1) 테스트 서버 구축
데이터 동기화 테스트를 위해 토스트 클라우드 상에 APM으로 구성된 테스트 서버(자빅스 서버)를 구성하였습니다. 토스트 클라우드 환경을 온프레미스 환경이라고 가정하고 데이터 동기화를 진행할 예정입니다.
2) DMS 복제 인스턴스 구성
먼저 양쪽 엔드포인트 데이터베이스 간의 데이터 복제를 수행할 복제 인스턴스를 구성합니다. (생성한 복제 인스턴스는 별도로 AWS 콘솔 EC2 인스턴스 목록에 보이지는 않습니다.) AWS 콘솔 > AWS Database Migration Service 페이지 > 복제 인스턴스 항목으로 이동하여 복제 인스턴스 생성 버튼을 눌러 복제 인스턴스를 생성합니다.
3) 소스 엔드포인트 생성
데이터를 복제할 원본 데이터베이스의 정보를 소스 엔드포인트 유형으로 구성합니다.
이번 구성에는 zabbix 데이터베이스만 복제할 예정으로 zabbix 계정을 사용하였으나, 복제할 데이터베이스에 따라 적절한 접근 권한이 부여된 별도의 계정을 이용할 수도 있습니다.
소스 엔드포인트 추가가 완료되면 해당 엔드포인트 이름을 클릭 > 연결 탭으로 이동하여 연결 테스트를 진행합니다. 복제 인스턴스에서 정상적으로 소스 엔드포인트로 접속이 가능하면 successful 이라는 문구가 보여집니다. 실패 관련 문구가 노출된다면 소스 엔드포인트의 방화벽 및 DB 접근 권한을 확인하시기 바랍니다.
4) 대상 엔드포인트 구성을 위한 RDS 생성
원본 데이터베이스로부터 가져온 데이터를 저장할 대상 엔드포인트를 구성하기 위해 RDS 데이터베이스를 새로 생성하였습니다.
5) 대상 엔드포인트 생성
소스 엔드포인트 생성 방법과 동일하게 대상 엔드포인트를 생성합니다.
데이터베이스 복제 간 대상 데이터베이스에 없는 새로운 데이터베이스를 생성하는 작업도 필요하기 때문에 MySQL 루트 계정으로 설정하였으나, 데이터베이스 생성 권한이 있는 적절한 사용자로 변경하여 사용하는 것도 가능합니다.
6) 데이터베이스 마이그레이션 태스크(작업) 구성
생성한 복제 인스턴스를 이용하여 양쪽 엔드포인트 간 데이터베이스를 복제할 태스크를 생성합니다. 원본 데이터베이스를 대상 데이터베이스로 1회성 복제가 아닌 1회 복제 이후 변경사항을 지속적으로 업데이트하여 동기화하도록 설정할 것이므로, 마이그레이션 유형은 "기존 데이터 마이그레이션 및 지속적인 변경사항 복제"를 선택해줍니다.
테이블 매핑 섹션은 어떤 데이터베이스의 어떤 테이블을 복제할지 구성하는 부분입니다. 테스트 구성에서는 zabbix 데이터베이스만 복제할 것이므로 스키마 이름(데이터베이스 이름) 부분에 zabbix를 지정해줍니다. (MySQL 데이터베이스 시스템 설정이 저장되는 mysql 데이터베이스는 복제 시 에러가 발생하는 것으로 확인됩니다)
7) 복제된 데이터 확인
태스트 생성이 완료되면 자동으로 복제 작업이 진행됩니다. 원본 데이터베이스의 크기에 따라 복제 시간은 길어질 수 있습니다.
상태가 "로드 완료, 복제 진행 중"으로 표시되면 1차 데이터 복제는 완료되었기 때문에 데이터가 복제된 RDS로 접속하여 테이블 들이 정상적으로 복제되었는지 확인합니다.
(중략)
또한 테스트 서버의 자빅스 설정을 수정하여 RDS를 연동 후 접속 해봅니다.
zabbix-server 설정 파일 : /etc/zabbix/zabbix_server.conf
zabbix-front-web 설정 파일 : /etc/zabbix/web/zabbix.conf.php
정상적으로 등록된 호스트, 유저, 아이템 등이 보이는지 확인해봅니다.
8) 데이터 실시간 동기화 확인
대상 엔드포인트로 데이터 복사가 정상적으로 완료되었다면 소스 엔드포인트에서 새로 데이터를 추가하여 데이터가 실시간으로 대상 엔드포인트로 복제되는지 테스트해봅니다. 다시 zabbix-server 에 연동된 데이터베이스를 소스 엔드포인트 데이터베이스로 변경한 뒤, 유저명을 test-user로 하여 새로운 유저를 생성합니다.
대상 엔드포인트에서 select 쿼리를 이용하여 새로 생성한 유저(test-user)의 데이터가 동일하게 생성되었는지 확인합니다. 정상적으로 새로운 데이터가 복제된 것을 확인할 수 있습니다.
DMS의 데이터 복제 방식 확인
비동기 방식의 복제란 마스터(원본) 서버에서 새로운 데이터의 commit이 발생할 때 슬레이브 서버의 응답을 확인하지 않고 일방적으로 바이너리 로그만을 전송하여 복제하는 방식입니다. 마스터 서버에서 슬레이브 서버의 응답을 확인하고 데이터를 commit하는 동기식 복제 방식보다 대역폭을 적게 사용하는 장점은 있으나, 슬레이브 서버의 응답을 확인하지 않기 때문에 데이터의 불일치가 발생할 수 있습니다.
DMS의 데이터 복제 방식이 MySQL 리플리케이션과 같은 비동기 방식인지 확인하기 위해 의도적으로 DMS 복제 인스턴스로부터 RDS로의 연결이 불가능하도록 보안그룹 설정을 제거합니다. 아래와 같이 대상 엔드포인트의 연결 테스트 시 failed 상태로 나타나는 것을 알 수 있습니다.
새로운 유저 test-user3을 생성해봅니다. 소스 데이터베이스에서 commit 이 발생했다는 것은 DMS의 데이터 복제 방식이 MySQL 리플리케이션과 같은 비동기 방식임을 알 수 있습니다.
대상 엔드포인트인 RDS에는 소스 데이터베이스와 데이터의 불일치가 발생한 것을 확인할 수 있습니다.
소스 엔드포인트 데이터베이스의 유저 정보
대상 엔드포인트 RDS의 유저 정보
개인적인 의견
온프레미스 데이터베이스를 EC2 인스턴스에 직접 MySQL 구성하여 리플리케이션 구성하는 방법도 있지만 EC2 인스턴스는 사용자의 관리가 필요하기 때문에 온프레미스 데이터베이스를 관리형 데이터베이스 서비스인 AWS RDS로 실시간 복제가 가능하다는 점이 DMS 서비스를 이용하여 실시간 복제를 구성하는 것의 장점이라는 생각이 들었습니다. 테스트 중 추가적으로 DMS를 통한 데이터베이스 복제 시 데이터만을 복제하기 때문에 테이블의 key, default 등의 구조는 복제하지 않는 것을 알게되었습니다. (찾아보니 데이터만 복제하기 때문에 테이블 구조는 수동으로 먼저 복제하고 DMS로 데이터 복제를 진행해야한다고 합니다) 해당 부분은 복제 구성 시 반드시 참고해야할 것 같습니다.
소스 엔드포인트 데이터베이스의 유저 테이블 구조
대상 엔드포인트 RDS의 유저 테이블 구조
DMS의 복제 방식이 비동기식이라는 점에서는 기존 MySQL 리플리케이션과의 큰 차이는 느낄 수 없었지만 DMS라는 서비스가 단순히 실시간 복제만을 위한 서비스아 아니기 때문에 감안해서 복제 구성을 해야할 것 같습니다.