본문 바로가기

Backend/MySQL

[MySQL] replication 구성

MySQL에서 replication을 구성했습니다. replication은 간단히 이야기하자면 확장성 및 내결함성을 위해 여러개의 데이터 베이스의 복사본을 둔 것입니다. 아래의 블로그에서 보다 자세히 정리했습니다. 

 

https://ji-seung.tistory.com/65

 

[DB] 분산 데이터 - 복제

여러 장비 간 데이터를 분산하는 이유는 다음과 같다. 확장성 내결함성/ 고가용성 지연시간 수직확장 vs 수평확장 수직확장은 용량확장이라고도 불리며 더 강력한 장비(CPU, 메모리 칩, 디스크)를

ji-seung.tistory.com

 

리더(master)와 팔로워(replica, slave)로 구성되어 있으며 오늘 블로그에서는 하나의 리더, 하나의 팔로워가 있는 단일 리더 구조를 구현할 것입니다. 기본적으로 각각의 데이터베이스가 서로 다른 서버 위에 존재해야 합니다. 서로 다른 도커를 두 개 띄워 각 도커 안에 이미지로 mysql을 가지게 하였습니다. 


MySQL 복제 원리

MySQL 복제 원리

 

1. 리더 (master)에서 데이터의 변경이 이루어지면, 바이너리 로그를 남깁니다.

2. 팔로워(slave) I/O 쓰레드에서 한 줄씩 바이너리 로그를 읽습니다. 그리고 Relay 로그에 해당 내용들을 복사합니다.

3. 팔로워(slave) SQL 쓰레드에서 Relay 로그를 읽고 팔로워(slave) 인스턴스에 최대한 빠르게 적용합니다.


MySQL setting in Docker 

docker를 이용해 MySQL 이미지를 pull합니다. mysql 버전은 지금 최신버전인 8.4.0 입니다. 

docker pull mysql

 

image를 기반으로 master를 docker 로 실행합니다. 

docker run -p 3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=1234 -d docker.io/mysql

 

docker의 exec 명령어로 mysql 내부로 접속합니다. 

docker exec -it mysql-master /bin/bash

 

루트 계정으로 mysql을 열어줍니다. 비밀번호는 초기에 설정한 1234입니다. 

mysql -u root -p

 

 

master DB에서 사용할 계정을 생성합니다. 이 계정이 slave DB에서 복제할 예정입니다. bookroot라는 계정을 새로 생성하고, 모든 ip에 대해서 권한을 열어줍니다.

CREATE USER 'bookroot'@'%' IDENTIFIED BY '1234';

GRANT REPLICATION SLAVE ON *.* TO 'bookroot'@'%';

FLUSH PRIVILEGES;

 

bookclub 데이터베이스, testtable 테이블을 만들어주고 예시 데이터 또한 삽입해주었습니다.

create database bookclub;
use bookclub;
create table testttable ( text varchar (20) );
insert into testttable values ('test row');

 

 

docker로 다시 master DB에 접속하고, dump를 합니다.

docker exec -it mysql-master /bin/bash

mysqldump -u root -p bookclub > dump.sql

 

mysql 접속을 종료하고, 로컬 환경에 dump.sql을 가져옵니다.

docker cp mysql-master:dump.sql .

cat dump.sql

 

아래와 같이 dump 파일의 내용을 알 수 있으며, testtable 정보가 있습니다.

 

slave DB 계정 생성하기

slave DB를 생성하기 위해 도커를 이용해 새로운 MySQL를 생성합니다.

docker run -p 3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=1234 --link mysql-master -d docker.io/mysql

 

--link mysql-master는 mysql-master 컨테이너 이름을 Host 주소로 사용하기 위해서 사용한 옵션입니다. 

 

이제 master, slave 2개의 DB가 실행됨을 확인할 수 있습니다.

slave의 경우, master 와 server-id가 달라야 하기 때문에 server-id를 바꿔주었습니다.

docker exec -it mysql-slave /bin/bash

mysql -u root -p

SET GLOBAL server_id = 2;

 

도커의 mysql-slave를 재시작합니다.

docker restart mysql-slave

 

로컬 환경에 있는 dump 파일을 mysql-slave에 복사합니다.
또한, slave DB에 접속해, bookclub 저장소를 생성하고 dump 파일을 적용합니다.

docker cp dump.sql mysql-slave:.
docker exec -it mysql-slave /bin/bash

mysql -u root -p
mysql> CREATE DATABASE bookclub;

mysql> exit

mysql -u root -p bookclub < dump.sql

 

slave DB에 접속해서 bookclub을 확인하면, master DB에서 생성한 testtable과 데이터가 잘 복제되어 있습니다.

 

slave를 master에 연결하기 위해 master(source)의 host name, user name, log file 이름과 postion이 필요합니다. master-mysql에 접속한 후 해당 정보를 얻을 수 있습니다. 

SHOW BINARY LOG STATUS\G

 

log file name은 binlog.00002이며, postion은 1615입니다. 

이제 slave-mysql 에 접속한 뒤 master-mysql와 연결할 수 있습니다. 

mysql> CHANGE REPLICATION SOURCE TO
    ->     SOURCE_HOST='source_host_name',
    ->     SOURCE_USER='replication_user_name',
    ->     SOURCE_PASSWORD='replication_password',
    ->     SOURCE_LOG_FILE='recorded_log_file_name',
    ->     SOURCE_LOG_POS=recorded_log_position;

 

source_host_name: master 서버의 호스트명

replication_user_name: master 서버의 mysql에서 REPLICATION SLAVE 권한을 가진 User 계정의 이름

replication_password: master 서버의 mysql에서 REPLICATION SLAVE 권한을 가진 User 계정의 비밀번호

recorded_log_file_namd: master 서버의 바이너리 로그 파일명

recorded_log_position: master 서버의 현재 로그의 위치

 

저 같은 경우 아래와 같이 입력하였습니다.

CHANGE REPLICATION SOURCE TO
SOURCE_HOST='mysql-master',
SOURCE_USER='bookroot',
SOURCE_PASSWORD='1234',
SOURCE_LOG_FILE=“binlog.000002”,
SOURCE_LOG_POS=1615;

#my case

 

연결 후, slave에서 연결정보를 조회해 보면, 아래와 같이 mysql-master와 연결된 정보가 나옵니다.

mysql> SHOW REPLICA STATUS\G

 

이제 mysql-master에 3개의 데이터를 insert 하고 mysql-slave에서 조회해 봅시다. master와 똑같이 복사된 것을 확인할 수 있습니다. 

 

참고

https://escapefromcoding.tistory.com/710

https://dev.mysql.com/doc/refman/8.4/en/replication.html

'Backend > MySQL' 카테고리의 다른 글

[MySQL] partitioning 구성  (0) 2024.05.14
[MySQL] 기본 구조와 show databases  (0) 2024.04.29
[MySQL] git clone MySQL  (0) 2024.04.21
[MySQL] Hello MySQL!  (0) 2024.04.20