mysqlbinlog
와 같은 도구를 통해 관리된다.docker container run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=6548 --name dockerMariadb1 mariadb
docker container run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=6548 --name dockerMariadb2 mariadb
docker container run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=6548 --name dockerMariadb3 mariadb
docker exec -it dockerMariadb1 /bin/bash
apt update;
apt install vim;
vi /etc/mysql/my.cnf // 밑에서 추가될 부분 설명
docker restart dockerMariadb1
docker exec -it dockerMariadb1 /bin/bash
mariadb -u root -p
grant replication slave on *.* to 'repl_user'@'%' identified by 'p@ssw0rd';
show master status;
vi /etc/mysql/my.cnf
→ 제일 밑에 추가하기[mysqld]
log-bin = mysql-bin
server-id = 1
binlog_format = row
expire_logs_days = 2
grant replication slave on *.* to 'repl_user'@'%' identified by 'p@ssw0rd';
grant replication slave
: REPLICATION SLAVE
권한을 부여한다. 이 권한은 레플리카(슬레이브) 서버가 마스터 서버로부터 데이터를 복제하는 데 필요하다.on *.*
: 모든 데이터베이스의 모든 테이블에 대해 권한을 부여한다.to 'repl_user'@'%'
: repl_user
라는 사용자 이름으로 어떤 호스트(%
)에서든지 연결을 허용한다. %
는 모든 호스트를 의미하는 와일드카드이다.identified by 'p@ssw0rd'
: repl_user
의 비밀번호를 p@ssw0rd
로 설정한다.show master status;
→ MariaDB에서 현재 마스터 서버의 복제 상태를 보여주는 명령이다.docker exec -it dockerMariadb2 /bin/bash
apt update;
apt install vim;
vi /etc/mysql/my.cnf // 밑에서 추가될 부분 설명
docker restart dockerMariadb2
docker exec -it dockerMariadb2 /bin/bash
mariadb -u root -p
CHANGE MASTER TO MASTER_HOST = '123.45.6.7'
, MASTER_PORT=3306
, MASTER_USER='repl_user'
, MASTER_PASSWORD='p@ssw0rd'
, MASTER_LOG_FILE='mysql-bin.000001'
, MASTER_LOG_POS=523
, MASTER_CONNECT_RETRY=10;
start slave;
SHOW SLAVE STATUS\G;
vi /etc/mysql/my.cnf
→ 제일 밑에 추가하기[mysqld]
log-bin = mysql-bin
server-id = 2 // Slave2는 3으로 두면 된다.
binlog_format = row
expire_logs_days = 2
read_only = 1 // Slave DB는 읽기만 처리하므로 Read_Only로 둔다.
CHANGE MASTER ~~~
MASTER_PORT = 3306
→ 마스터 서버가 리스닝하고 있는 포트 번호이다.MASTER_USER = 'repl_user'
→ 복제를 위해 사용될 마스터 서버의 사용자 계정 이름이다.MASTER_PASSWORD = 'p@ssw0rd'
→ 위 사용자 계정의 비밀번호이다.MASTER_LOG_FILE = 'mysql-bin.000001'
→ 복제를 시작할 마스터 서버의 바이너리 로그 파일 이름이다. show master status;로 확인한 값이다.MASTER_LOG_POS = 523
→ 바이너리 로그 파일 내에서 복제를 시작할 위치(오프셋)이다. show master status;로 확인한 값이다.MASTER_CONNECT_RETRY = 10
→ 연결 실패 시 재시도할 시간 간격(초)이다. 이 경우, 레플리카는 연결 실패 후 10초마다 마스터 서버에 재연결을 시도한다.SHOW SLAVE STATUS\G;
→ 명령은 레플리카 서버의 복제 상태에 대한 정보를 보여준다.Real MySQL 8.0
책에 나온 구문입니다.GTID | 바이너리 로그 파일명 | 바이너리 로그 오프셋 |
---|---|---|
0-0-1 | binart-log.000001 | 232 |
0-0-2 | binart-log.000001 | 444 |
0-0-3 | binart-log.000001 | 1023 |
GTID | 바이너리 로그 파일명 | 바이너리 로그 오프셋 |
---|---|---|
0-0-1 | binart-log.000002 | 40230 |
0-0-2 | binart-log.000002 | 41232 |
0-0-3 | binart-log.000002 | 49801 |
GTID | 바이너리 로그 파일명 | 바이너리 로그 오프셋 |
---|---|---|
0-0-1 | binart-log.000003 | 123456 |
0-0-2 | binart-log.000003 | 162331 |
0-0-3 | binart-log.000003 | 190021 |
read_only = 1
를 삭제한다.Stop Slave;
를 입력한다.read_only = 1
를 삭제한다.[mysqld]
log-bin = mysql-bin
server-id = 2 // Slave2는 3으로 두면 된다.
binlog_format = row
expire_logs_days = 2
read_only = 1 // Slave DB는 읽기만 처리하므로 Read_Only로 둔다.
Docker Restart “도커 컨테이너 이름”
으로 재시작해준다.grant replication slave on *.* to 'repl_user'@'%' identified by 'p@ssw0rd';
→ 기존 사용했던 Master DB와 동일한 권한으로 진행하였다. 이건 사용하기 나름이다.FLUSH PRIVILEGES;
를 입력해준다.select @@GLOBAL.gtid_current_pos;
GTID를 찾아준다.CHANGE MASTER TO MASTER_HOST = '172.17.0.3'
, MASTER_PORT=3306
, MASTER_USER='repl_user'
, MASTER_PASSWORD='p@ssw0rd'
, MASTER_USE_GTID = slave_pos;
MASTER_USE_GTID = slave_pos;
이다.MASTER_USE_GTID
옵션은 두가지가 존재하는데 slave_pos, current_pos이 있다.start slave;
로 시작하고 SHOW SLAVE STATUS\G;
로 확인해보았다.