MySQL Multi Source Replication(MSR) 알아보기

모두·2025년 3월 22일

오늘은 또 다른 방식의 Replication MSR에 대해서 알아보려 한다.

Master/Slave Replication 의 문제점

  • MSA를 위해서 DB를 여러개 사용해야되는 환경이라면…?

    • MSA: 기능 단위로 서비스 분리
    • 공통DB, 유저DB, 서비스DB, 로그DB…
    • 로그인 로그가 많은 유저가 가장 많이 접근한 글을 알고 싶다면?
    • Master/Slave를 여러개 운영해야된다면?

Multi-Source Replication (MSR)

  • 여러 개의 Master 에서 한 개의 Slave 서버로 복제하는 방식
  • 데이터 소스를 통합하고 중앙 집중형 DB를 만드는 목적
    • 데이터 통합
    • 데이터 집계
    • 분산 데이터 관리
  • MSR은 일반적인 Master/Slave Replication과 동일

Multi-Source Replication (MSR) 문제점

  • 충돌 가능성

    • 동일한 DB, Table을 복제할때 충돌이 발생할 수 있음
    • 특히 동일한 Primary Key가 생성된다면 무결성 문제 발생
    • 일반적으로 DB, Table에 prefix를 추가하여 관리
  • Slave 성능 문제

    • 동기화하는 트래픽도 매우 큰 부하
    • 복잡한 쿼리를 수행할 수 있을 정도의 고성능 장비 필요

MySQL MSR 로 재구축

docker-compose 통해 구축

services:
  mysql-master-a:
    image: mysql:5.7
    restart: always
    platform: linux/amd64
    environment:
      MYSQL_ROOT_PASSWORD: code1!
      MYSQL_DATABASE: code-db
      MYSQL_USER: code-user
      MYSQL_PASSWORD: code1!
    ports:
      - "13306:3306"
    volumes:
      - db_data_master_a:/var/lib/mysql
    command:
      --server-id=1
      --log-bin=mysql-bin
      --binlog-format=row
      --master-info-repository=TABLE
      --relay-log-info-repository=TABLE
    networks:
      - mysql-network
  mysql-master-b:
    image: mysql:5.7
    restart: always
    platform: linux/amd64
    environment:
      MYSQL_ROOT_PASSWORD: code1!
      MYSQL_DATABASE: code-db
      MYSQL_USER: code-user
      MYSQL_PASSWORD: code1!
    ports:
      - "13307:3306"
    volumes:
      - db_data_master_b:/var/lib/mysql
    command:
      --server-id=2
      --log-bin=mysql-bin
      --binlog-format=row
      --master-info-repository=TABLE
      --relay-log-info-repository=TABLE
    networks:
      - mysql-network
  mysql-slave:
    image: mysql:5.7
    restart: always
    platform: linux/amd64
    environment:
      MYSQL_ROOT_PASSWORD: code1!
      MYSQL_DATABASE: code-db
      MYSQL_USER: code-user
      MYSQL_PASSWORD: code1!
    ports:
      - "13308:3306"
    volumes:
      - db_data_slave_2:/var/lib/mysql
    command:
      --server-id=3
      --log-bin=mysql-bin
      --binlog-format=row
      --master-info-repository=TABLE
      --relay-log-info-repository=TABLE
    networks:
      - mysql-network
volumes:
  db_data_master_a:
  db_data_master_b:
  db_data_slave_2:

networks:
  mysql-network:
    driver: bridge

기존의 master/slave 구조로 했을 때는 바이너리 로그를 파일로 떨어져있는걸 주어다 사용했는데

  • master가 여러개가 되면 그 방법은 문제가 된다.
  • 바이너리 로그를 직접 가져오기에는 무결성이 떨어질 수 있다.

MySQL 은 무결성을 잘 보장해주니까 로그조차 디비테이블 안에서 관리하겠다는 설정

테이블로 로그를 저장하는 방식

기존에 있는 컨테이너는 충돌이 날 수 있기에 volume 통째로 제거 해준다 .

  • docker-compose down -v

이후 datagrip 통해 포트번호 맞게 연결해주고

  • master 2개 / slave 1개

이후 master 쪽에 slave가 접속 할 수 있게 user 넣어준다.

  • file 이랑 , position 값도 받아온다.
  • 2개의 master에서 모두 유저 생성
  • a, b 깨긋한 상태라 값이 똑같다.

slave는 채널을 2가지 운영해야 한다.

  • file 이랑 , position 값도 넣어준다.

0개의 댓글