08 / 09
데이터베이스
물리 서버 DB 현황 분석, Docker MariaDB 구성, EBS 마운트, 계정 분리, mysqldump 기반 데이터 이관
기존 DB 운영 현황
통합 포탈 서비스 이전 환경에서는 서비스별로 물리 서버에 DB가 분산 운영되고 있었습니다. AWS 이관을 위해 각 서비스의 DB 구조와 포트 사용 현황을 먼저 정리하였습니다.
| 서비스 | 서버 환경 | 포트 |
|---|---|---|
| OMS, Automobile | Automobile 서버 | 3307 |
| Tax, Auth (Portal) | 리눅스 물리 서버 | 3307 / 3306 |
Data Migration 순서
서비스 의존도와 우선순위를 고려하여 다음 순서로 마이그레이션을 진행하였습니다. auth와 tax를 먼저 이관하고, 이후 backoffice → auto/oms 순으로 진행합니다.
Auth (Portal Back Server)
포탈 인증 서비스 DB — 가장 먼저 이관하여 포탈 기본 기능 확보
Tax
세금 관련 서비스 DB — auth와 함께 핵심 서비스로 우선 이관
Back Office
관리자 서비스 DB — 핵심 서비스 이관 후 순차 진행
Auto / OMS
자동차/OMS 서비스 DB — 최종 단계에서 이관
DEV 환경 DB 서버 구성
DEV(Staging) 환경의 DB 서버는 NLB를 통해 접근하며, 내부 로드밸런서의 2022 포트로 연결됩니다. EC2 인스턴스에 EBS를 마운트하고, Docker 기반 MariaDB 컨테이너를 실행하는 구조입니다.
접근 경로
DB 서버 생성 및 EBS 마운트
EC2 인스턴스 생성 후 데이터 전용 EBS 볼륨을 추가하고, SWAP용 EBS도 별도로 구성하여 메모리 안정성을 확보하였습니다.
데이터 EBS
EBS 볼륨 생성 및 EC2에 Attach
파티션 생성 (fdisk)
파일시스템 포맷 (mkfs.xfs)
/data/db 경로에 마운트
fstab 등록으로 영구 마운트
SWAP EBS
SWAP 전용 EBS 볼륨 추가
mkswap으로 스왑 영역 설정
swapon으로 활성화
fstab 등록으로 영구 적용
메모리 부족 시 안정성 확보
Docker MariaDB 컨테이너 구성
Docker를 설치하고 MariaDB 10.11.11 컨테이너를 실행합니다. 데이터 디렉토리를 호스트 EBS에 마운트하여 컨테이너 재시작 시에도 데이터가 유지되도록 구성하였습니다.
데이터 디렉토리 준비
mkdir -p /data/db/mariadb/data mkdir -p /data/db/mariadb/conf mkdir -p /data/db/mariadb/logs
my.cnf 주요 설정
[mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_general_ci datadir = /var/lib/mysql log-error = /var/log/mysql/error.log port = 3306 bind-address = 0.0.0.0
컨테이너 실행
docker run -d \ --name mariadb \ --restart always \ -p 3306:3306 \ -v /data/db/mariadb/data:/var/lib/mysql \ -v /data/db/mariadb/conf:/etc/mysql/conf.d \ -v /data/db/mariadb/logs:/var/log/mysql \ -e MYSQL_ROOT_PASSWORD=[ROOT_PASSWORD] \ mariadb:10.11.11
네트워크 / 보안그룹 점검
DB 서버가 정상적으로 접근 가능하도록 보안그룹 인바운드 규칙을 점검합니다. TCP 3306 포트가 필요한 소스(ECS 서비스, 관리자 IP 등)에서 접근 가능해야 합니다.
| 항목 | 설정 | 비고 |
|---|---|---|
| 프로토콜 | TCP | MariaDB 기본 프로토콜 |
| 포트 | 3306 | MariaDB 기본 포트 |
| 소스 | ECS SG / 관리자 IP | 필요한 소스만 허용 |
| 방향 | 인바운드 | DB 서버로의 접근 허용 |
DB 및 계정 생성
DEV 환경용 데이터베이스와 서비스별 전용 계정을 생성합니다. auth_dev, tax_dev 데이터베이스를 분리하고, 각 서비스에 필요한 최소 권한만 부여하는 계정 분리 전략을 적용하였습니다.
-- 데이터베이스 생성 CREATE DATABASE auth_dev CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE tax_dev CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 서비스별 계정 생성 및 권한 부여 CREATE USER 'auth_user'@'%' IDENTIFIED BY '[AUTH_PASSWORD]'; GRANT ALL PRIVILEGES ON auth_dev.* TO 'auth_user'@'%'; CREATE USER 'tax_user'@'%' IDENTIFIED BY '[TAX_PASSWORD]'; GRANT ALL PRIVILEGES ON tax_dev.* TO 'tax_user'@'%'; FLUSH PRIVILEGES;
계정 분리를 통해 서비스 간 DB 접근을 격리하고, 장애 발생 시 영향 범위를 최소화합니다. prod 환경에서는 Secrets Manager를 통해 자격 증명을 관리합니다.
동작 테스트
DB 서버 구성 완료 후, 컨테이너 상태 확인 → 로컬 접속 테스트 → 원격 접속 테스트 순으로 검증합니다.
# 컨테이너 상태 확인 docker ps | grep mariadb # 로컬 접속 테스트 docker exec -it mariadb mysql -u root -p # 원격 접속 테스트 (ECS 또는 관리자 환경에서) mysql -h [DB_HOST] -P 3306 -u auth_user -p auth_dev
컨테이너 상태 확인
docker ps로 MariaDB 컨테이너가 정상 실행 중인지 확인
로컬 접속 테스트
docker exec로 컨테이너 내부에서 직접 접속하여 DB/계정 확인
원격 접속 테스트
ECS 서비스 또는 관리자 환경에서 보안그룹을 통한 원격 접속 검증
기존 물리 서버 DB 이관
물리 서버에서 운영 중이던 DB를 AWS 환경으로 이관합니다. mysqldump를 사용하여 스키마와 데이터를 추출하고, Docker MariaDB 컨테이너로 복원하는 방식으로 진행합니다.
물리 서버 (Source)
# 덤프 추출 mysqldump -u root -p \ --databases auth tax \ --single-transaction \ --routines --triggers \ > dump_auth_tax.sql
AWS DB 서버 (Target)
# 덤프 복원 docker exec -i mariadb \ mysql -u root -p \ < dump_auth_tax.sql # 데이터 검증 docker exec -it mariadb \ mysql -u root -p -e \ "SELECT COUNT(*) FROM auth_dev.users;"
물리 서버에서 mysqldump 추출
--single-transaction 옵션으로 서비스 중단 없이 일관된 덤프 생성
덤프 파일 전송
SCP 또는 S3를 통해 AWS EC2 DB 서버로 덤프 파일 전송
Docker 컨테이너에 복원
docker exec를 통해 MariaDB 컨테이너에 덤프 파일 import
데이터 정합성 검증
테이블 수, 레코드 수, 주요 데이터 샘플링으로 이관 결과 검증
Summary
통합 포탈 서비스의 DB 환경은 물리 서버에서 AWS EC2 + Docker MariaDB 구조로 이관하였습니다. EBS 기반 데이터 영속성, SWAP 메모리 안정성, 서비스별 계정 분리를 통해 안정적이고 격리된 DB 운영 환경을 구성하였으며, mysqldump 기반 마이그레이션으로 기존 데이터를 무중단 이관하였습니다.