DMS : 데이터베이스 마이그레이션 서비스의 약자로 온프레미스의 데이터 베이스를 클라우드 환경으로 이동하는 서비스이다. AWS SCT를 사용하여 다른 데이터베이스 엔진으로 마이그레이션도 가능하다. 또한 지속적인 변경사항을 복제하여 소스와 타겟을 동기화 시킬 수 있다.
온프레미스를 가정하기 위하여 EC2 인스턴스 한개를 생성하겠습니다. 인스턴스의 OS는 ubuntu 18.04를 선택하였으며 t2.micro의 크기를 이용하였습니다. subnet은 퍼블릭이 가능한 서브넷으로 구성하고 퍼블릭 IP 자동할당은 활성화를 해두시면 됩니다. 보안그룹은 22, 3306포트를 열어두시면 됩니다. 22는 보안성을 위하여 내 IP만 허용하시 것을 추천합니다.
인스턴스 한개가 생성되었습니다.
putty를 이용하여 인스턴스에 접근을 하겠습니다.
EC2를 이용하여 우분투를 생성하였으면 login 아이디는 ubuntu입니다.
이제 mysql과 pip3를 다운로드 하고 pip3로 pymysql을 다운로드합니다. pymysql은 후에 검증을 위해 python을 이용할 예정이기 때문에 다운로드 받는 것입니다. 필요하지 않으시면 다운로드 하지 않으셔도 됩니다.
sudo apt update -y
sudo apt-get install -y mysql-server python3-pip
sudo pip3 install pymysql
sudo ufw allow 3306
ufw allow 3306은 3306의 포트를 열어둔 것입니다.
이제 DB유저를 생성, DB생성, table생성을 해야합니다.
mysql은 root의 초기 비밀번호가 없으므로 엔터치시고 넘어가시면 됩니다. 저는 간단하게 테이블을 구성했습니다.
sudo mysql -u root -p
create user 'test'@'%' identified by 'test';
grant all privileges on *.* to 'test'@'%';
FLUSH PRIVILEGES;
create database testdb;
use testdb;
CREATE TABLE member_table (
NAME VARCHAR(20),
AGE INT,
PRIMARY KEY(AGE)
) ENGINE=MYISAM CHARSET=utf8;
이제 데이터 베이스의 내부를 채울 시간입니다. 그 전에 앞서서 python 스크립트를 저장할 폴더를 만듭니다.
mkdir script
cd script
vi sc.py
vi로 진입을 하셨으면 인서트 모드로 전환후 내용을 채울 간단한 스크립트를 적어넣습니다.
import pymysql
import time
jh_db = pymysql.connect(
user="test",
passwd="test",
host="127.0.0.1",
db="testdb",
port=3306,
charset='utf8'
)
cursor = jh_db.cursor(pymysql.cursors.DictCursor)
def insertsql():
sql_query = """INSERT INTO member_table(NAME, AGE) VALUES (%s, %s)"""
i = 0
while i < 100:
i = i + 1
cursor.execute(sql_query,('jh'+str(i), i))
jh_db.commit()
time.sleep(1)
jh_db.close()
if __name__ == "__main__":
insertsql()
이후에 파이썬 스크립트를 동작 시킵니다. python 파일의 내용은 본인이 편하신 방법으로 수정하시면 됩니다.
sudo python3 sc.py
참고로 위에 작성된 파이썬 파일은 1초마다 동작하며 jh0, 0부터 100까지 내용을 채우게 됩니다. 다 동작되기까지 시간이 걸리므로 중간에 취소하셔도 상관없습니다. 이제 내용을 확인합니다.
sudo mysql -u test -p
use testdb;
select * from member_table;
이러한 결과를 얻을 수 있게됩니다.
이제 mysql의 외부 접속을 허용을 시켜야합니다. mysql에서 나와서 mysqld.cnf파일을 수정합니다. 참고로 저는 mysql 5.7버전입니다.
cd /etc/mysql/mysql.conf.d
vi mysqld.cnf
bind-address 부분을 주석처리
이제 서비스를 다시 시작합니다.
sudo systemctl restart mysql.service
이렇게 하면 소스의 작업은 끝나게 됩니다.
RDS에서 DB를 생성합니다.
엔진은 mysql이며 버전은 맞추는 것이 좋지만 이번에 저는 다르게 할 예정입니다.
이후에 내용대로 쭉 진행하시면 되는데 DB의 VPC가 없으신 분은 만드시면 됩니다. 또한 퍼블릭으로 진행할 것이기 때문에 퍼블릭 액세스를 허용해두셔야 합니다. 이렇게 하고 DB 생성을 누르시면 DB 생성은 끝납니다.
복제 인스턴스를 생성합니다. 내용이 어렵지 않으니 그냥 보고 입력하시면 됩니다.
엔드포인트를 만듭니다. 엔드포인트는 소스와 타겟 이 두개를 만드셔야 합니다.
사용자 이름과 암호는 db계정을 적으시면 됩니다. 이후 생성을 누르시면 끝납니다. 다시 엔드포인트 생성을 누르시고 대상 엔드포인트, RDS선택을 누르시면 대부분의 정보가 기입되어 있습니다. 활용하시면 됩니다. 마찬가지로 입력하시고 생성누르시면 완료입니다. 이제 타겟 db의 연결테스트를 실시합니다
이름 누르시고 연결에 연결 테스트 하시면 됩니다.
이렇게 나오면 성공한 것입니다.
마찬가지로 소스도 테스트 해줍니다.
성공이 나왔습니다. 이제 마이그레이션 테스크로 이동하여 테스크를 생성한뒤 입력방식에 맞게 입력하시면 됩니다.
테스크 설정에서 필요한 고급테스크 설정을 누르시면 예외적용을 할 수 있습니다. 참고하셔서 하시면 됩니다.
테이블 매핑에서 선택규칙 추가를 누르시고 스키마 입력을 누르시면 스키마 이름이 나옵니다. 이스키마 이름은 db를 적으셔도 되고 와일드카드인 %를 적으셔도 되는데 %를 적으시면 DB의 모든 내용들이 옮겨지기 때문에 필요한 내용만 필터로 추가하셔서 입력하시면됩니다. 반대로 필요없는 부분을 추가하셔서 작업을 제외로 바꾸시면 그 부분을 제외하고 나머지 부분을 마이그레이션 할 수 있습니다. 참고하시면 됩니다.
테스크 생성을 누르시고 생성이 완료되면 테스크가 진행될 것입니다. 이후에 RDS로 접근하셔서 내용을 확인하시면 DB의 내용이 일치할 것입니다.
이 내용은 지속적 복제모드를 선택했을때 발생했던 문제와 그 해결에 대해 적어놓은 것이다.
이런 실패 메시지로 나온 경우이다. 내용을 요약하자면 binary logging을 활성화 시켜야 된다는 내용이다.
해결책
1. 바이너리 로그를 활성화 시킨다.
cd /etc/mysql
vi my.cnf
[mysqld]
log-bin
server-id=1
아래 부분을 추가시켜주면 된다.