✅ 서비스 중지 없이 MySQL 대용량 데이터(80GB) 동기화하는 방법

2025. 3. 23. 08:58PYTHON

반응형

 

📌 rsync + binlog를 활용한 안전한 동기화

이 방법은 MySQL이 실행 중인 상태에서 데이터 파일을 복사한 후, binlog를 적용하여 최신 상태를 유지하는 방식입니다.

🔹 1️⃣ 1차 동기화 (rsync로 변경된 데이터 복사)

Python을 이용하여 MySQL 데이터를 백그라운드에서 변경된 파일만 복사합니다.

 

import subprocess

SOURCE_DIR = "/var/lib/mysql/"
TARGET_DIR = "/var/lib/mysql1/"

def run_command(command):
    """ 시스템 명령 실행 """
    try:
        subprocess.run(command, shell=True, check=True)
        print(f"✅ 실행 완료: {command}")
    except subprocess.CalledProcessError as e:
        print(f"❌ 실행 실패: {command}")
        print(e)

def sync_mysql_data():
    """ MySQL 변경된 데이터만 동기화 (파일 기반, IO 부하 감소) """
    print(f"📌 {SOURCE_DIR} → {TARGET_DIR} 변경된 데이터 동기화 중...")
    rsync_cmd = (
        f"ionice -c2 -n7 rsync -av --update --progress --inplace "
        f"--exclude='*.pid' --exclude='*.sock' {SOURCE_DIR} {TARGET_DIR}"
    )
    run_command(rsync_cmd)

def main():
    sync_mysql_data()

if __name__ == "__main__":
    main()

 

설명:

  • rsync -av --update --progress --inplace → 변경된 파일만 복사
  • --exclude='*.pid' --exclude='*.sock' → MySQL의 실행 관련 파일 제외 (오류 방지)
  • 서비스 중지 없이 동기화 가능

🔹 2️⃣ binlog를 활용한 최신 데이터 동기화

MySQL의 **Binary Log (binlog)**를 사용하여 rsync 이후 변경된 데이터를 동기화합니다.

1️⃣ MySQL에서 binlog 활성화 확인

mysql -u root -p -e "SHOW VARIABLES LIKE 'log_bin';"

 

 

  • ON이면 binlog 사용 가능
  • 만약 OFF라면, /etc/mysql/my.cnf 또는 /etc/my.cnf에서 log_bin 활성화 후 재시작 필요

2️⃣ 현재 binlog 위치 저장 (마스터 서버)

mysql -u root -p -e "SHOW MASTER STATUS;"

 

+------------------+----------+
| File            | Position |
+------------------+----------+
| mysql-bin.000034 | 5678921  |
+------------------+----------+
  • File: mysql-bin.000034 (현재 binlog 파일)
  • Position: 5678921 (현재 데이터 위치)

3️⃣ binlog 적용 (타겟 서버)

동기화 대상 서버에서 mysqlbinlog를 실행하여 최신 데이터를 반영합니다.

mysqlbinlog --host=원본서버_IP --raw --read-from-remote-server --stop-never --user=root --password=your_password /var/lib/mysql/mysql-bin.000034 | mysql -u root -p

 

설명:

  • --raw --read-from-remote-server → 실시간으로 binlog 복사
  • --stop-never → 지속적으로 binlog 반영 (실시간 동기화)