생계/MySQL2024. 1. 15. 00:30

virtual box 에 mysql master-slave replication 을 구성해보자  

가상머신은 oracle virtual box 을 사용하고 VM 에는 우분투를 설치하자. 

해당 작업은 이전에 작성한 내용을 참고하자

버추얼박스에 우분투 설치하기

1) 서버구성 

- mysql 설치 (master 역할) 

이것도 이전에 작성한 글을 참고해서 mysql 설치하자. 

버추얼박스에 mysql 설치하기

- vm 복제 (slave 역할)

vm 이 내려간 상태에서 vm 관리자 메뉴에서 대상vm을 복제하자

 

이름과 경로를 설정해준다.

 

같은 네트워크 대역을 사용하여 slave 에서 master 로 통신이 가능하게 설정해야한다. 
 vm 시작전 설정 -> 네트워크 -> 호스트전용어댑터


- hostname 변경 

복제한 vm의 hostname 이 그대로 사용중이니 mysql-s 로 변경해준다. 

@slave 

hostname
sudo hostnamectl set-hostname mysql-s

sudo reboot


2) Replication 설정
 2-1) 설정파일

@master
cd /etc/mysql
sudo vi my.cnf
[mysqld]
log-bin=mysql-bin
server-id=1

sudo service mysql restart

*선택적 설정 고려 
max_binlog_size
expire_log_days
binlog_format=statement|mixed|row


@slave
cd /etc/mysql
sudo vi my.cnf

[mysqld]
server-id=2
relay-log=mysql-relay-bin
read_only

sudo service mysql restart


 2-2) Replication 유저 생성
@master
sudo mysql -u root -p1111

-- slave ip 로 생성한다. 
CREATE USER 'REP_ADM'@'192.168.56.102' IDENTIFIED WITH mysql_native_password BY '1111';
GRANT REPLICATION SLAVE ON *.* TO 'REP_ADM'@' 192.168.56.102';
   
SHOW MASTER STATUS;  

File, Position 값을 확인 

@slave 
sudo mysql -u root -p1111

-- master IP 를 넣는다 
CHANGE MASTER TO
MASTER_HOST='192.168.56.101',  
MASTER_USER='REP_ADM',
MASTER_PASSWORD='1111',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=2391;

START SLAVE;

SHOW SLAVE STATUS \G
=> [ERROR] : equal MySQL server UUIDs

sudo rm -rf /var/lib/mysql/auto.cnf
sudo service mysql restart


START SLAVE;


3) Replicatin 연결 확인 

-- 복제확인
sudo mysql --login-path=rootconn -e 'show slave status \G'|egrep "Master_Host|Master_User|Master_Log_File|Master_Log_Pos|ReplicateIgnore_DB|Running|IO_Err|SQL_Err|Seconds_Behind_Master|SQL_Delay"

** 아래 메세지가 보여야 정상 복제중
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates


-- 에러확인
show variables like '%log_error%';
=> tail -100f  /var/log/mysql/error.log



4) Replication 에러 메시지별 대응

[ERROR] [MY-013117] [Repl] Replica I/O for channel '': Fatal error: The replica I/O thread stops because source and replica have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: MY-013117
=> VM 을 복제하면서 동일 uuid 문제 => auto.cnf 삭제 

[ERROR] [MY-013124] [Repl] Replica SQL for channel '': Replica failed to initialize applier metadata structure from the repository, Error_code: MY-013124
=> slave 를 리셋해준다. 
  stop slave; 
  reset slave;
  stop slave;
   
[ERROR] [MY-010584] [Repl] Replica I/O for channel '': Error connecting to source 'REP_ADM@192.17.7.5:3306'. This was attempt 1/86400, with a delay of 60 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061
=> rep user error : Authentication 확인 => mysql.user 의 plugin 확인 후 변경 => WITH mysql_native_password

[ERROR] [MY-010584] [Repl] Replica SQL for channel '': Worker 1 failed executing transaction 'ANONYMOUS' at source log mysql-bin.000003, end_log_pos 342; Error 'Can't create database 'test'; database exists' on query. Default database: 'test'. Query: 'create database test', Error_code: MY-001007
=> 트랜잭션 실패 : 대상 object 가 존재하지 않거나 실행할수 없어서 발생. skip 또는 object 동일하게 만들고 slave 재시작

** 트랜잭션 실패로 인한 에러메세지가 아는 내용이고 굳이 적용할 필요 없으면 아래명령으로 skip 한다. 
stop slave;
set global sql_slave_skip_counter=1;  -- skip 할 error 갯수
start slave;
show slave status\G

 

이상 끗.

도움되었다면 따봉줘!

반응형
Posted by 돌고래트레이너