데이터 조회만 가능한 서버. Master 에 있는 로그를 받아와서 뭐가 추가되고 수정됐는지 로그를 보고 데이터를 동기화한다.
Slave에서는 데이터를 수정, 삭제하면 안 된다.
Master 서버 설정 (10.10.10.124)
vi /etc/mysql/mariadb.conf.d/50-server.cnf
[mariadb] 아래에 내용 추가
[mariadb]
log-bin # log로 남겨라
server_id=1 # 양쪽이 다르기만 하면 됨 (Master 1, Slave 2)
log-basename=master1 # log 파일 이름
binlog-format=mixed # 로그를 남기는 형식 (섞어 쓰겠다)
설정 저장 후 mariadb 재시작
systemctl restart mariadb
로그파일 생성된 거 확인
mariadb -u root -p
show master status;
master1-bin.000001 이라는 이름으로 생성된 것이 보인다.
bin 뒤에 숫자와 Position 숫자는 내용이 추가될 때마다 바뀐다.
Slave 서버에서 사용할 사용자 계정 추가
CREATE USER 'slave_user'@'%' IDENTIFIED BY 'qwer1234';
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';
FLUSH PRIVILEGES;
Slave 서버 설정 (10.10.10.30)
vi /etc/mysql/mariadb.conf.d/50-server.cnf
[mariadb] 밑에 server_id 설정 추가
=> 이 때, Master 서버의 server_id 와 달라야 한다.
[mariadb]
server_id=2
설정 후 mariadb 재시작
systemctl restart mariadb
Master 지정
=> 이 때, 내용이 추가될 때마다 로그파일 이름과 position 번호가 바뀌기 때문에
=> 현재 show master status 했을 때의 로그파일 이름과 position 번호로 입력해야 한다.
mariadb -u root -p
CHANGE MASTER TO
MASTER_HOST='[Master 서버 IP]',
MASTER_USER='slave_user',
MASTER_PASSWORD='qwer1234',
MASTER_PORT=3306,
MASTER_LOG_FILE='[마스터에서 show master status 했을 때 File 이름 = 로그파일 이름]',
MASTER_LOG_POS=[마스터에서 show master status 했을 때 position 번호],
MASTER_CONNECT_RETRY=10;
START SLAVE;
Slave 확인
SHOW SLAVE STATUS\G
Slave_IO_Running: Yes 여야 하고, Slave_SQL_Running: Yes 여야 한다.
Master(서버1) - Slave(서버2), Master(서버2) - Slave(서버1) 이렇게 양방향 Replication으로 설정하는 것을 미러 사이트라고 한다.
위에서 Master, Slave 를 지정했던 것처럼
Slave에서는 Master 설정을, Master에서는 Slave 설정을 지정해주면 된다.
Slave 중지
서버 2에서 일단 아까 Start 시켜놨던 Slave를 중지시키기
STOP SLAVE;
Slave -> Master로 설정
서버 2를 Master 로 설정해준다.
vi /etc/mysql/mariadb.conf.d/50-server.cnf
[mariadb]
log-bin # log로 남겨라
server_id=2 # 양쪽이 다르기만 하면 됨
log-basename=master2 # log 파일 이름
binlog-format=mixed # 로그를 남기는 형식 (섞어 쓰겠다)
설정 후 mariadb 재시작
systemctl restart mariadb
Master 로그 파일 확인
서버 2에도 master 로그 파일이 보이는 것을 확인할 수 있다.
mariadb -u root -p
show master status;
사용자 권한 추가
서버 1에서 Slave로 사용할 사용자를 만들어준다.
CREATE USER 'slave_user'@'%' IDENTIFIED BY 'qwer1234';
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';
FLUSH PRIVILEGES;
Master 설정
서버 1(아까 Master 설정했던 서버)에 설정을 해준다.
내 경우 10.10.10.124 컴퓨터 (서버 1)에 아래 설정 추가 (Master 서버 IP를 10.10.10.30으로 지정)
CHANGE MASTER TO
MASTER_HOST='[Master 서버 IP]',
MASTER_USER='slave_user',
MASTER_PASSWORD='qwer1234',
MASTER_PORT=3306,
MASTER_LOG_FILE='[마스터에서 show master status 했을 때 File 이름]',
MASTER_LOG_POS=[마스터에서 show master status 했을 때 position 번호],
MASTER_CONNECT_RETRY=10;
START SLAVE;
설정이 잘 되었나 확인
Slave_IO_Running: Yes Slave_SQL_Running: Yes
SHOW SLAVE STATUS\G
서버 1(10.10.10.124)의 SHOW SLAVE STATUS\G서버 2(10.10.10.30)의 SHOW SLAVE STATUS\G
💡연결은 잘 되었는데 SQL_Running 이 No가 뜰 때
내 경우 서버 2에서 show slave status를 보았을 때 error가 났었음
정확한 건 모르겠지만,,, 슬레이브에서 먼저 사용자를 생성하고 마스터에서 생성한 경우 마스터에서 실행된 create user 명령이 슬레이브로 복제된다. 사용자가 이미 존재했기 때문에 명령문의 실행 시도가 실패한 것...
아래 명령어를 실행해주니 잘 되었다.
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;