아키텍쳐 설계 관련 글/서버,인프라

🚀 A 서버에서 B 서버로 MariaDB & Elasticsearch 이관기 (실무 예시 중심)

recording or reCoding 2025. 7. 5. 13:10

 

회사 프로젝트에서 기존 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 방식은 컨테이너 내부 복사 없이 가장 깔끔한 복원 방법