Kubernetes MySQL Cluster DB Migration using mysqldump
MySQL DB 마이그레이션은 데이터베이스를 한 환경에서 다른 환경으로 옮기는 과정입니다. 주로 물리적 서버의 변경, 클라우드로의 이동, 데이터베이스 버전 업그레이드, 또는 다른 DBMS로의 전환 등이 마이그레이션의 주요 이유입니다.
MySQL DB 마이그레이션 과정
- 사전 준비
- 목표 설정: 마이그레이션의 목표를 명확히 정의합니다. (예: 성능 개선, 클라우드로의 이전 등)
- 현재 환경 분석: 현재 MySQL 데이터베이스의 구조, 데이터 양, 그리고 종속성(애플리케이션, 외부 시스템 등)을 분석합니다.
- 백업: 기존 데이터베이스의 전체 백업을 생성합니다. 이는 마이그레이션 중 문제 발생 시 복구할 수 있는 안전장치입니다.
- 데이터베이스 스키마 마이그레이션
- DDL 스크립트 생성: 기존 데이터베이스의 테이블 구조, 인덱스, 트리거, 뷰 등을 포함한 DDL(Data Definition Language) 스크립트를 생성합니다.
- 스키마 적용: 새 환경에 이 스크립트를 실행하여 동일한 스키마를 생성합니다.
- 데이터 마이그레이션
- 데이터 추출: MySQL의 mysqldump 명령어를 사용하여 데이터를 덤프합니다.
- 데이터 전송: 덤프된 데이터를 새로운 데이터베이스로 전송합니다. 이 과정에서 네트워크 속도, 데이터 무결성 등을 고려해야 합니다.
- 데이터 로드: 새 환경에 데이터를 로드합니다. 이 과정에서 데이터 일관성 및 무결성을 다시 한번 확인합니다.
- 애플리케이션 및 서비스 마이그레이션
- 데이터베이스 연결 정보를 새 환경으로 업데이트합니다.
- 새 데이터베이스가 애플리케이션과 올바르게 연동되는지 확인합니다.
- 테스트 및 검증
- 기능 테스트: 모든 애플리케이션 기능이 정상적으로 작동하는지 확인합니다.
- 성능 테스트: 마이그레이션 후 성능이 개선되었는지, 또는 저하되지 않았는지 확인합니다.
- 데이터 무결성 테스트: 데이터의 손실이나 변형이 없는지 점검합니다.
- 최종 전환 및 모니터링
- 기존 데이터베이스를 종료하고 새 데이터베이스로 전환합니다.
- 초기 단계에서의 모니터링을 통해 잠재적 문제를 신속히 해결합니다.
- 문서화 및 피드백
- 마이그레이션 과정에서 발생한 문제와 해결 방안을 문서화합니다.
- 향후 유사한 프로젝트에 도움이 되도록 피드백을 수집합니다.
주의사항
- 데이터 무결성: 마이그레이션 과정에서 데이터가 손상되거나 누락되지 않도록 하는 것이 매우 중요합니다.
- 다운타임 최소화: 서비스 중단 시간을 최소화하는 방법을 고려해야 합니다. 예를 들어, 롤백 계획을 수립하거나, 무중단 마이그레이션 전략을 사용할 수 있습니다.
- 테스트 필수: 실제 전환 전에 충분한 테스트를 통해 문제를 사전에 발견하고 해결해야 합니다.
이 과정은 신중하게 진행되어야 하며, 특히 대규모 시스템의 경우 충분한 계획과 테스트가 필수적입니다.
MySQL DB dump
저는 기존에 Container 기반 형태로 DB를 운영하고 있어 다음과 같이 mysqldump를 활용해 dump를 진행하였습니다.
호스트에서 Container 내부에 있는 데이터를 가져옵니다.
docker exec -it x-mysql-container bash
mysql -u root -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| x_chat |
| x_user |
mysqldump -u root -p --databases x_chat > x_chat.sql
cat x_chat.sql
---
-- MySQL dump 10.13 Distrib 8.0.35, for Linux (x86_64)
--
-- Host: localhost Database: fancian_chat
-- ------------------------------------------------------
-- Server version 8.0.35
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
...
docker cp x-mysql-container:/x_chat.sql x_chat.sql
MySQL DB Load
Master 노드에 위에 복사한 데이터를 가져와 mysql-cluster-0에 데이터를 복사하고, mysqldump를 활용해 데이터를 밀어넣었습니다.
kubectl cp -nmysql-cluster fancian_x.sql mysql-cluster-0:/tmp/fancian_x.sql -c mysql
kubectl exec -it -nmysql-cluster mysql-cluster-0 -c mysql -- /bin/bash
bash-5.1$ cd /tmp/
mysql -u root -p < x_chat.sql
정상적으로 들어갔는지 확인해봅니다.
MySQL mysql-cluster.mysql-cluster.svc.cluster.local:3306 ssl fx_user SQL > SHOW databases;
+-------------------------------+
| Database |
+-------------------------------+
| x_chat |
| x_coin |
| x_universe |
| x_user |
| information_schema |
| mysql |
| mysql_innodb_cluster_metadata |
| performance_schema |
| sys |
+-------------------------------+
9 rows in set (0.0017 sec)
완료하였습니다!
읽어주셔서 감사합니다.
'MySQL' 카테고리의 다른 글
MySQL DB backup 정책 (1) | 2024.10.29 |
---|---|
Kubernetes MySQL Operator 설치 (0) | 2024.08.16 |