회사 프로젝트에서 기존 A 서버에 있던 MariaDB와 Elasticsearch 데이터를 B 서버로 이관하는 작업에 대해 . 단순히 Docker만 옮기는 게 아니라 다음을 포함한 전체 마이그레이션 작업을 요약해서 생각나는 과정을 적어보겠습니다.
- MariaDB: 구조 / 데이터 / 프로시저 덤프 및 복원
- Elasticsearch: 특정 인덱스만 스냅샷 생성 → 복원
- Docker Compose 기반 환경 유지
- volume 마운트로 데이터 영속성 확보
✅ 1. MariaDB 이관 – 구조, 데이터, 프로시저를 나눠서 복원
📌 1-1. 왜 docker-compose up 이후에 복원 명령이 필요한가?
docker-compose up으로 MariaDB 컨테이너를 실행해도, 컨테이너는 비어있는 DB 인스턴스 상태로 시작된다.
즉, mysqldump로 만든 .sql 파일에 담긴 테이블, 데이터, 프로시저는 명시적으로 복원 명령을 실행해야 반영된다.
🧾 1-2. A 서버 - 3분할 덤프 수행
📄 ① 테이블 구조 (DDL)
mysqldump -u root -pP@ssw0rd --no-data --databases my_service > schema.sql
📄 ② 데이터만 (INSERT)
mysqldump -u root -pP@ssw0rd --no-create-info --databases my_service > data.sql
📄 ③ 프로시저 + 트리거
mysqldump -u root -pP@ssw0rd --no-data --routines --triggers --databases my_service > routine.sql
📤 1-3. B 서버로 .sql 파일 전송
scp schema.sql data.sql routine.sql user@B서버_IP:/home/user/
🐳 1-4. B 서버 - docker-compose로 MariaDB 환경 구성
yaml
# docker-compose.yml
services:
mariadb:
image: mariadb:10.6
container_name: mariadb
environment:
- MYSQL_ROOT_PASSWORD=P@ssw0rd
ports:
- "3306:3306"
volumes:
- ./db_data:/var/lib/mysql
docker-compose up -d
이 상태는 아직 “빈 데이터베이스”만 올라온 상태이며, 아래 단계에서 덤프 파일을 불러와야 진짜 DB가 복원됨.
📥 1-5. 복원 명령 (컨테이너 내부 복사 없이, 파이프로 처리)
docker exec -i mariadb mysql -u root -pP@ssw0rd < ./schema.sql
docker exec -i mariadb mysql -u root -pP@ssw0rd < ./data.sql
docker exec -i mariadb mysql -u root -pP@ssw0rd < ./routine.sql
반드시 순서대로 실행:
스키마 → 데이터 → 프로시저
✅ 2. Elasticsearch 이관 – 특정 인덱스만 스냅샷
🔍 기본 포트 설명
포트역할
| 9200 | HTTP API 요청용 (REST API) |
| 9300 | 클러스터 내부 통신용 (노드 간) |
| 9600 | (Logstash monitoring endpoint, Elasticsearch 기본은 아님) |
Elasticsearch 자체는 9200, 9300을 사용하며, 9600번은 logstash 또는 beats agent가 추가로 사용하는 포트임. 일반 Elasticsearch 단독 구성에는 해당되지 않음.
🎯 2-1. A 서버 - 특정 인덱스만 스냅샷
예: my_index_202507 인덱스만 스냅샷
리포지토리 등록
PUT _snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "/usr/share/elasticsearch/backup"
}
}
스냅샷 생성 (특정 인덱스)
PUT _snapshot/my_backup/snapshot_202507
{
"indices": "my_index_202507",
"ignore_unavailable": true,
"include_global_state": false
}
include_global_state: false는 클러스터 설정까지 복원하지 않도록 하기 위한 옵션
📤 2-2. 스냅샷 디렉토리 복사
scp -r ./es_backup user@B서버_IP:/home/user/
🐳 2-3. B 서버 - Elasticsearch Docker Compose 설정
yaml
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
container_name: elasticsearch
environment:
- discovery.type=single-node
- xpack.security.enabled=false
ports:
- "9200:9200"
- "9300:9300"
volumes:
- ./es_backup:/usr/share/elasticsearch/backup
docker-compose up -d
🔁 2-4. B 서버 - 스냅샷 복원
리포지토리 재등록
PUT _snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "/usr/share/elasticsearch/backup"
}
}
리스토어 실행
POST _snapshot/my_backup/snapshot_202507/_restore
인덱스 확인
GET _cat/indices?v
📦 Docker Volume 마운트 요약
컨테이너호스트 디렉토리컨테이너 내부설명
| MariaDB | ./db_data | /var/lib/mysql | 실제 DB 파일 저장소 |
| Elasticsearch | ./es_backup | /usr/share/elasticsearch/backup | 스냅샷 저장 위치 |
✅ 최종 요약
항목A 서버B 서버
| MariaDB | 구조/데이터/프로시저 3분할 덤프 | 컨테이너 띄운 뒤 파이프 방식으로 순차 복원 |
| Elasticsearch | 특정 인덱스 스냅샷 생성 | 스냅샷 디렉토리 복사 후 리스토어 |
| 공통 | scp, Docker Compose, volume 마운트 활용 |
🧠 실무 팁 정리
- Elasticsearch는 버전 간 스냅샷 호환 여부 반드시 확인
- MariaDB는 덤프를 나눠야 복원 오류, 충돌을 줄일 수 있음
- docker exec -i 방식은 컨테이너 내부 복사 없이 가장 깔끔한 복원 방법
'아키텍쳐 설계 관련 글 > 서버,인프라' 카테고리의 다른 글
| sonarqube (0) | 2025.12.11 |
|---|---|
| 레거시 WAS & Nginx를 Docker로 현대화하기: 마이그레이션 A to Z 가이드 (8) | 2025.07.10 |
| 원격저장소, git 그리고 Gitea (0) | 2025.05.27 |