안녕하세요!
이번 글은 ncloud의 서비스인 Database Migration Service를 통해 DB 마이그레이션을 해보려합니다!
우선 Database Migration Service는 ncloud의 Cloud DB for MySQL과 같은 완전관리형 데이터베이스로만 옮길 수 있습니다.
그래서 저의 이번 테스트 시나리오는 이렇게 정하였습니다.
시나리오
Naver Cloud Platform 의 서버 하나에 apache + php + mysql 로 간단한 웹서비스를 운영하고 있다. 회원가입 페이지는 php로 짜여져있으며, 회원가입한 정보들은 MySQL 데이터베이스에 담기도록 설정을 해놓음.
웹과 DB 서버를 분리하고 안정적인 운영을 하고 싶었던 관리자는 Naver Cloud Platform의 완전관리형 데이터베이스 서비스인 Cloud DB for MySQL에 이중화로 데이터베이스를 구축하고, 마이그레이션을 진행한다.
마이그레이션 후 정확히 데이터가 옮겨졌는지 확인하고 데이터베이스 연동을 바꾸어도 웹페이지가 정상적으로 실행되는지까지 확인해 본다.
1. 서버 생성
Naver Cloud Platform > VPC > Server
웹,디비 서버로 만들 서버를 생성해줍니다. vCPU 2EA, Memory 4GB로 생성하였습니다.
2. apache + php + mysql 설치
sudo apt update
sudo apt install -y apache2 php php-mysql mysql-server
sudo systemctl start apache2
sudo systemctl enable apache2
sudo systemctl start mysql
sudo systemctl enable mysql
3. MySQL 데이터 베이스, 테이블 생성
이제 예제 페이지를 구현하기 위해 데이터베이스와 테이블을 생성할 것입니다.
mysql> CREATE DATABASE customer;
mysql> use customer;
CREATE TABLE information (
id int NOT NULL AUTO_INCREMENT,
name varchar(30),
email varchar(40),
num varchar(30),
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
이제 customer 라는 데이터베이스 안에 information이라는 테이블이 생겼습니다.
테이블 생성을 마친 후에는 간단한 회원가입 페이지를 구현하기 위한 코드를 짜줍니다.
4. PHP 로 회원가입 페이지 구현
index파일이 있는 /var/www/html 로 이동한 뒤 php 를 이용해 2개의 코드를 짭니다.
cd /var/www/html
vi test.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>YJ 회원가입</title>
</head>
<body>
<h2>회원가입</h2>
<h3>등록할 개인 정보를 입력해주세요</h3>
<hr>
<form action="test_action.php" method="post">
<label>이름 입력</label>
<input type="text" name="name"><br>
<label>E-Mail 입력</label>
<input type="email" name="email"><br>
<label>회원번호 입력</label>
<input type="number" name="num"><br>
<input type="submit" value='회원가입'>
<input type="reset" value="다시 입력하기">
</form>
</body>
</html>
vi test_action.php
<?php
$name = $_POST['name'];
$email = $_POST['email'];
$num = $_POST['num'];
$con = mysqli_connect("DB host", "DB user", "DB 비밀번호", "사용할 DB", 3306);
if (!$con) {
die("MySQL 연결 오류: " . mysqli_connect_error());
}
error_reporting(E_ALL);
ini_set('display_errors', 1);
$query = "INSERT INTO information (name, email, num) VALUES ('$name', '$email', '$num')";
$result = mysqli_query($con, $query);
if ($result) {
?>
<script> alert('회원가입이 완료되었습니다.'); location.href=".."; </script>
<?php
} else {
?>
<script> alert('회원가입에 실패했습니다.\n다시 시도해 주세요.'); location.href=".."; </script>
<?php
}
?>
5. 브라우저로 확인
인터넷 브라우저에서 web서버의 공인ip/test.php 를 접속합니다.
이제 데이터를 넣기 위해 회원가입을 해보겠습니다.
회원가입이 완료되었다는 alert이 뜹니다.
이제 mysql 에서 information 테이블을 확인해보니 회원가입한 데이터가 잘 들어가 있습니다.
6. Cloud DB for MySQL 생성
이제 마이그레이션을 할 target db 를 생성해 줄 것입니다.
VPC > Cloud DB for MySQL > DB Server
이렇게 DB 서버의 버전 및 스펙 등을 선택합니다.
이전에 우분투에 MySQL을 설치할때 8.0.33 버전을 설치했기 때문에 호환성을 위해 8.0.32을 선택합니다.
DB User, DB 접근 ip, 암호, 포트 등을 입력하고 DB Server를 생성합니다.
Cloud DB for MySQL은 약 10~15분 생성 시간이 소요됩니다.
7. Source DB 사전 설정
마이그레이션 전, 방금 Naver Cloud Platform 의 서버에 만들어 주었던 source db 에 사전 설정을 해줍니다.
7.1 바이너리 로그 활성화 및 설정
바이너리 로그를 활성화 해주기 위해 my.cnf 파일에 log-bin, server-id, expire_logs_days 추가
vi /etc/mysql/my.cnf
sudo systemctl restart mysql
[mysqld]
server-id=1
log-bin
expire_logs_days=5
<바이너리 로그 옵션>
- server-id: 서버 식별자를 설정합니다. 각 MySQL 서버는 고유한 서버 식별자를 가져야 합니다.
- log-bin: 바이너리 로그를 활성화합니다.절대 경로 설정 가능, basename을 정의 하지 않을 경우는 <serverName>-bin.00000N 으로 생성됩니다.
- expire_logs_days: 바이너리 로그 파일을 보관하는 기간을 설정합니다. 이 설정을 사용하여 오래된 로그 파일을 자동으로 삭제합니다.
해당 명령어는 log_bin의 변수의 값을 확인하고, 이 변수가 활성화 되어있는지를 보여줍니다.
활성화 되어있는 것을 확인했습니다.
mysql -u root -p -e "SHOW VARIABLES LIKE 'log_bin';"
7.2 GTID 모드를 확인 및 설정
다음 쿼리를 실행하여 현재 MySQL 인스턴스의 GTID 모드를 확인합니다.
SELECT @@global.gtid_mode;
Source DB가 GTID 모드인 경우 아래 명령을 실행해주세요.
[ Target DB 가 8.0.32 버전 미만인 경우 ]
GRANT PROCESS, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '[사용자명]'@'[HOST IP]';
GRANT SELECT ON mysql.* TO '[사용자명]'@'[HOST IP]';
GRANT SELECT, SHOW VIEW, LOCK TABLES, TRIGGER ON [사용자 DB].* TO '[사용자명]'@'[HOST IP]';
[ Target DB 가 8.0.32 버전 이상인 경우 ]
GRANT RELOAD, PROCESS, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '[사용자명]'@'[HOST IP]';
GRANT SELECT ON mysql.* TO '[사용자명]'@'[HOST IP]';
GRANT SELECT, SHOW VIEW, LOCK TABLES, TRIGGER ON [사용자 DB].* TO '[사용자명]'@'[HOST IP]';
Source DB가 GTID 모드가 아닌 경우 아래 명령을 실행해 주세요.
GRANT RELOAD, PROCESS , SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '[사용자명]'@'[HOST IP]';
GRANT SELECT ON mysql.* TO '[사용자명]'@'[HOST IP]';
GRANT SELECT, SHOW VIEW, TRIGGER ON [사용자 DB].* TO '[사용자명]'@'[HOST IP]';
저는 확인을 해보았더니 OFF로 GTID 모드가 비활성화되어 있음을 알 수 있었습니다.
그래서 해당 명령을 통해 권한을 주었습니다.
8. 방화벽(ACG) 오픈
- Source DB 서버의 방화벽(ACG)을 설정하여 Target DB에서 접속할 수 있도록 설정해야 합니다. 다음 트래픽을 허용하도록 Source DB 서버에 적용된 ACG의 Inbound 규칙을 수정해 주세요.
- 프로토콜: TCP
- 접근 소스: NAT Gateway의 IP 주소(Cloud DB for MySQL이 위치한 private subnet에 설정된 NAT Gateway)
- 허용 포트: Target DB 접속 포트
- Target DB 서버의 방화벽(ACG)도 Source DB에서 접속할 수 있도록 설정해야 합니다. 다음 트래픽을 허용하도록 Target DB 서버에 적용된 ACG의 Outbound 규칙을 수정해 주세요.
- 프로토콜: TCP
- 접근 소스: Source DB의 IP 주소
- 허용 포트: Source DB 접속 포트
9. Database Migration Service 설정
9.1. Endpoint Management 생성
미리 Source DB에 대한 Endpoint를 만들어주어야합니다.
9.2. Migration Management 생성
마이그레이션에 필요한 정보를 입력합니다. Target DB는 만들어둔 Cloud DB 서비스에서 선택이 가능합니다.
Test Connection을 누르면 정상적으로 Connection 되고있는지 확인할 수 있습니다.
혹시 Test Connection이 정상적으로 진행되지 않았다면 Source DB의 사전설정 및 방화벽 오픈이 제대로 되어있지 않아서이므로 다시 확인 후 Connection 해주시기 바랍니다.
해당 마이그레이션 작업은 데이터가 적게 들어있으므로 소요시간은 짧게 끝났습니다. 약 5분.
실행단계에 전부 완료가 뜬 것을 확인 후 "완료" 버튼을 클릭해주세요.
"완료" 버튼을 클릭하지 않으면 마이그레이션 작업이 계속 진행중 상태가 됩니다.
10. Database Migration 확인
test_action.php 에 DB를 마이그레이션 한 Target DB 주소로 DB 호스트를 변경해줍니다.
vi test_action.php
저장 후 다시 브라우저에서 회원가입 페이지에 개인정보를 입력해봅니다.
Cloud DB for MySQL에 접속해줍니다.
mysql -h db-****.vpc-cdb.ntruss.com -u test -p --port 3306
DB host 변경 후 데이터베이스 및 데이블도 정상적으로 마이그레이션 되어있는 것을 확인할 수 있습니다.
또, 새로 저장한 데이터도 잘 들어가 있는 것을 확인했습니다. (에디, 타요, 서울 등...)
이렇게 Database Migration Service 를 이용하여 쉽게 데이터베이스를 마이그레이션 해보았습니다.
나름 간단하게 마이그레이션 할 수 있어서 좋았는데요.
다른 분들도 참고하셔서 서비스 사용해보셨으면 좋겠습니다. *^^*
'NaverCloud Platform' 카테고리의 다른 글
Percona Monitoring andManagement(PMM) 설치 및 사용 (0) | 2024.06.05 |
---|---|
[Naver Cloud Platform] CLA(Cloud Log Analytics) 사용 (0) | 2023.08.22 |
[Naver Cloud Platform] Auto Scaling 테스트 (0) | 2023.08.21 |
[Naver Cloud Platform] 리눅스 패스워드 expired 정책 해제 (0) | 2023.08.21 |
[Naver Cloud Platform] ALB redirection 하는법 (0) | 2023.08.21 |