MySQL

[MySQL] Replication Master To Master

bbugge 2019. 7. 2. 15:36

MASTER TO MASTER

A server - IP : 10.0.2.10

 

$ vi my.cnf
// 아래 내용을 추가해준다.
[mysqld]
bind-address     = 10.0.2.10
server-id        = 1                          // 서버 고유아이디, Slave와 다르게 설정
log-bin          = mysql-bin               // MySQL(오라클의 redo로그와 유사) 로그생성 설정
expire_logs_days = 7                      // 로그 보관주기 설정(일)
replicate-do-db  = repl              // Replication 대상 DB 지정, 이 옵션을 제거시 모든 DB 복제




/*
* 참고(binlog_do_db/replicate-do-db 차이)
- binlog_do_db : Master 기준 어떤 DB를 Replication 허용할 것인지 설정(제외조건 binlog_ignore_db)
- replicate-do-db : Slave 기준 어떤 DB를 Replication 할 것인지 설정(제외조건 replicate-ignore-db)
*/




$ service mysqld restart             // mysql을 재실행




// 이중화할 때 사용될 사용자 계정 생성 및 권한 설정
mysql> CREATE USER 'replicator'@'%' IDENTIFIED BY 'replicator';
mysql> FLUSH PRIVILEGES;
mysql> GRANT SELECT, PROCESS, FILE, SUPER, REPLICATION CLIENT, REPLICATION SLAVE, RELOAD ON *.* TO 'replicator'@'%' IDENTIFIED BY 'replicator'   // 8버전에서는 IDENTIFIED BY를 붙이지 않는다. 그럼에도 불구하고 이중화가 안됨.
mysql> FLUSH PRIVILEGES;


// B server의 master 정보를 확인한다.

 

// B server의 master 정보를 A server에 설정
mysql> stop slave;
mysql> change master to master_host='10.0.2.20', master_user='replicator', master_password='replicator', master_log_file='mysql-bin.000004',master_log_pos=1441;
mysql> start slave;

 

 

 

 

B server - IP : 10.0.2.20

$ vi my.cnf
// 아래 내용을 추가해준다.
[mysqld]
bind-address     = 10.0.2.20
server-id        = 2                          // 서버 고유아이디, Slave와 다르게 설정
log-bin          = mysql-bin               // MySQL(오라클의 redo로그와 유사) 로그생성 설정
expire_logs_days = 7                      // 로그 보관주기 설정(일)
replicate-do-db  = repl              // Replication 대상 DB 지정, 이 옵션을 제거시 모든 DB 복제




$ service mysqld restart             // mysql을 재실행




// 이중화할 때 사용될 사용자 계정 생성 및 권한 설정
mysql> CREATE USER 'replicator'@'%' IDENTIFIED BY 'replicator';
mysql> FLUSH PRIVILEGES;
mysql> GRANT SELECT, PROCESS, FILE, SUPER, REPLICATION CLIENT, REPLICATION SLAVE, RELOAD ON *.* TO 'replicator'@'%' IDENTIFIED BY 'replicator'   // 8버전에서는 IDENTIFIED BY를 붙이지 않는다.
mysql> FLUSH PRIVILEGES;

 

// A server의 master 정보를 확인한다.

 

// A server의 master 정보를 B server에 설정
mysql> stop slave;
mysql> change master to master_host='10.0.2.10', master_user='replicator', master_password='replicator', master_log_file='mysql-bin.000004',master_log_pos=1794;
mysql> start slave;

 

 

A server

 

// slave 상태 확인

mysql> show slave status \G;

 

// Last_Errono 와 Last_Error 의 내용이 없다면 성공적으로 replication 수행 중
// 위와 같이 특정 메시지가 나온다면 다시 설정




// 생성하고자 하는 데이터베이스를 생성하여 잘 동작하는지 확인.
mysql> create database repl;




// 생성된 데이터베이스에 테이블 생성하여 사용하고자 한다면 권한을 추가해줘야한다.
mysql> GRANT CREATE, DROP ON repl.* TO 'replicator'@'%' IDENTIFIED BY 'replicator';
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 VARCHAR(30));
mysql> GRANT ALTER, SELECT, DELETE, UPDATE, INSERT ON repl.t1 TO 'replicator'@'%' IDENTIFIED BY 'replicator';
mysql> insert into t1 values (1,'xxxx');

 

B server

 

// slave 상태 확인

mysql> show slave status \G;

 

// Last_Errono 와 Last_Error 의 내용이 없다면 성공적으로 replication 수행 중




// 생성하고자 하는 데이터베이스를 생성하여 잘 동작하는지 확인.
mysql> create database repl;




// 생성된 데이터베이스에 테이블 생성하여 사용하고자 한다면 권한을 추가해줘야한다.
mysql> GRANT CREATE, DROP ON repl.* TO 'replicator'@'%' IDENTIFIED BY 'replicator';
mysql> GRANT ALTER, SELECT, DELETE, UPDATE, INSERT ON repl.t1 TO 'replicator'@'%' IDENTIFIED BY 'replicator';


// 설치 시 에러 

// 양쪽의 mysql server UUID가 같아서 생기는 문제

 

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

// 해결 방법 :  A,B server /var/lib/mysql/auto.cnf 의 server-uuid 값을 다르게 해주고 replication 재실행

// SSL 통신 필요해서 생기는 문제

Last_IO_Error: error connecting to master 'replicator@192.168.105.8:3306' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

// 해결 방법 1 : A,B server  CHANGE MASTER TO GET_MASTER_PUBLIC_KEY=1; 수행 후 replication 재실행

// 해결 방법 2 : default_authentication_plugin variable 을 mysql_native_password 로 변경