Docker를 이용한 Mysql / MariaDB 단방향 이중화 구성

이동기·2023년 4월 8일
1
post-thumbnail

[STEP-0] 참고

  1. [Kotlin] Spring Boot JPA Mysql / Maria DB 단방향 이중화 설정하기 와 연계 됩니다.
  2. git bash 설치 또는 git bash와 동일한 기능을 할 수 있는 콘솔이 있다고 가정합니다.
  3. work bench 설치 또는 mysql 쿼리를 쓸만한 툴이나 콘솔 접근 법을 알고 있다고 가정합니다.
  4. docker가 설치되어 있다고 가정합니다.
  5. 해당 포스팅은 windows 10에서 진행하였습니다.
  6. 단방향 이중화란 Master DB에서 일어난 DDL 및 INSERT, UPDATE, DELETE를 Slave DB로 복제하는 기능을 의미합니다.
  7. 보통 Master DB에 Write 기능을 일임하고 Slave에 Read 기능을 일임하여 부하를 분산하고 Master DB의 데이터를 Slave DB에 백업하기 위한 용도로 주로 사용합니다.

[STEP-1] 디렉토리 구성

D드라이브
	ㄴ docker
    	ㄴ database
        	ㄴ mariadb
            	ㄴ first
                	ㄴ data
                ㄴ second
                	ㄴ data

[STEP-2] docker compose.yml 구성

파일위치 : D:\docker\database\docker-compose.yml

version: '3.1'

services:
  firstMariadb:
    container_name: mariadb-first-container
    image: mariadb:latest
    restart: always
    environment:
      MARIADB_ROOT_PASSWORD: root
    ports:
      - 13306:3306
    volumes:
      - "/d/docker/database/mariadb/first/data:/var/lib/mysql"
    networks:
      default_bridge:
        ipv4_address: 172.26.0.10
  secondMariadb:
    container_name: mariadb-second-container
    image: mariadb:latest
    restart: always
    environment:
      MARIADB_ROOT_PASSWORD: root
    ports:
      - 23306:3306
    volumes:
      - "/d/docker/database/mariadb/second/data:/var/lib/mysql"
    networks:
      default_bridge:
        ipv4_address: 172.26.0.11
    depends_on:
      - firstMariadb
networks:
  default_bridge:
    ipam:
      driver: default
      config:
        - subnet: 172.26.0.0/16

volumes는 DB 백업용 기능으로 호스트 서버의 디렉토리(d/docker/database/mariadb/{first or second}/data)와 컨테이너 내부의 /var/lib/mysql 경로의 모든 파일을 연동합니다. 즉 컨테이너 내부에서 만들어진건 호스트 서버의 volumes로 지정된 경로에 생성되거나 삭제되고 마찬가지로 호스트 서버에서 생성되거나 삭제된 부분은 컨테이너 내부에도 영향을 미칩니다. 그래서 컨테이너나 이미지가 모종의 이유로 삭제되더라도 데이터가 초기화 되는 것이 아닌 호스트 서버에 있는 파일들로 이전에 쓰던 db를 그대로 실행 할 수 있습니다.

depends_on으로 지정한 값은 지정한 값이 로드되어 실행단계에 들어가야지 run 하겠다는 의미입니다. 보통 master db가 slave db보다 먼저 실행되어야하기 때문에 지정하였습니다.

networks는 docker 기본 내부망 대역인 172.26.0.0/16를 사용하여 고정 ip를 컨테이너에 부여하기 위함입니다. 내부망이므로 외부에서 해당 ip로 접근은 불가능 합니다.

ports는 포트포워딩 기능입니다. {호스트 포트}:{컨테이너 포트}로 지정함으로써 호스트 서버에 포트가 겹치는 현상을 방지하고 docker의 격리성을 살려 여러 컨테이너를 띄우기 위해서 사용합니다. 컨테이너 외부에서 컨테이너에 접근하려면 {호스트 ip}:{지정한 호스트포트}로 접근하면 자동으로 {컨테이너 ip}:{컨테이너 포트}로 변환되어 접근 할 수 있게 해줍니다.


[STEP-3] Docker compose 실행

1. git bash 실행
2. cd /d/docker/database
3. docker-compose up -d

Git Bash 화면

Docker Desktop 화면


[STEP-4] Master 설정 1(first db)

1. git bash 실행
2. winpty docker exec -it mariadb-first-container bash
3. apt-get update
4. apt-get install vim
5. cd /etc/mysql
6. vi my.cnf
7. my.cnf 최하단에 아래 [master my.cnf 예시] 내용 붙여 넣기
8. shift + ; 후 wq! 치고 enter
9. exit 명령어로 컨테이너 벗어나기
10. work bench 실행 또는 dbms 아무거나
11. create database prime; 명령어로 복제대상 DB 생성

[master my.cnf 예시]

log-bin=mysql-bin
server-id=1


[STEP-5] Slave 설정 1 (second db)

1. git bash 실행
2. winpty docker exec -it mariadb-second-container bash
3. apt-get update
4. apt-get install vim
5. cd /etc/mysql
6. vi my.cnf
7. my.cnf 최하단에 아래 [slave my.cnf 예시] 내용 붙여 넣기
8. shift + ; 후 wq! 치고 enter
9. exit 명령어로 컨테이너 벗어나기
10. work bench 실행 또는 dbms 아무거나
11. create database prime; 명령어로 복제대상 DB 생성

[slave my.cnf 예시]

server-id=2
replicate-do-db='prime'


[STEP-6] Master / Slave DB 재기동

1. git bash 실행
2. cd /d/docker/database
3. docker-compose down
3. docker-compose up -d

[STEP-7] Master 설정 2 (first db)

1. work bench 실행 또는 dbms 아무거나
2. use mysql;
3. create user 'repl_user'@'%' identified by 'test1234';
4. grant all privileges on prime.* to 'repl_user'@'%';
5. flush privileges;
6. show master status; 명령어로 Position 값 확인


[STEP-8] Slave 설정 2 (second db)

1. work bench 실행 또는 dbms 아무거나
2. use mysql;
3. STOP SLAVE;
4. 아래 내용 실행
change master to
    master_host='172.26.0.10',
    master_user='repl_user',
    master_password='test1234',
    master_log_file='mysql-bin.000001',
    master_log_pos=342;
5. START SLAVE;
6. show slave status; 명령어 쳐서 나온 row에서 모든 ~_Errno 컬럼이 0인지 확인

[STEP-9] 복제 확인 1(first db)

아래 쿼리 실행

use prime;

CREATE TABLE `TEST2` (
  `TEST2_ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `TEST2` VARCHAR(20) DEFAULT NULL,
  PRIMARY KEY (`TEST2_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO TEST2(TEST2) VALUES('TEST2 입니다.');

[STEP-9] 복제 확인 2(second db)

아래 쿼리 실행하여 first db에서 생성하고 삽입한 테이블과 데이터가 조회 되는지 확인

use prime;
SELECT * FROM TEST2;


profile
개발자가 되고 싶은 '개'발자입니다. https://github.com/lee-dong-gi

0개의 댓글