2.환경 설정
2.1. DB 환경 설정
테스트의 목적으로 아래서는 하나의 서버에 다른 버전의 Mysql (5.7 / 8.0) 으로 구축해보겠습니다.
- Primary
버전: MySQL 5.7
address: 127.0.0.1
port: 3308
- Replica
버전: MySQL 8.0
address: 127.0.0.1
port : 3306
* 그룹 복제 기능은 MySQL 5.7.17 버전 이상 부터 가능합니다.
* 같은 CHARSET 으로 통일하는 것이 좋습니다.
# Primary DB (Mysql 5.7) & Replica DB (Mysql 8.0)
CREATE DATABASE `test_rep_db` ;
CREATE TABLE `test_rep_db`.`rep_table` (
`a` int ,
`b` varchar(45) DEFAULT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;
2.2.복제 관련 시스템 파일 설정 (my.ini, my.cnf)
Primary 시스템 파일 설정 (window/ my.ini)
[mysqld]
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
plugin_load_add='group_replication.dll'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="15113a63-31fa-4be9-b362-46b91958ac7a" # select UUID(); 로 생성 가능
group_replication_start_on_boot=off
group_replication_bootstrap_group=off
group_replication_local_address= "127.0.0.1:33061" # Primary 기본 포트로 33061 권장된다.
group_replication_group_seeds= "127.0.0.1:33061,s2-ip:33061,s3-ip:33061"
group_replication_bootstrap_group=초기 Group Replication 설정 시 필요.
재구축시 Master 1대에서만 진행 (첫 노드만 ON으로 설정하고, 이후에는 OFF로 설정)
Replica 시스템 파일 설정 (window/ my.ini)
[mysqld]
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
plugin_load_add='group_replication.dll'
transaction_write_set_extraction=XXHASH64
* Configuration 변경 후, MySQL 서비스를 다시 시작 해줍니다.
만약, 자동으로 깔리지 않는다면 수동 설치합니다.
-- C:\Program Files\MySQL\MySQL Server 5.7\bin
-- C:\Program Files\MySQL\MySQL Server 8.0\bin
INSTALL PLUGIN group_replication SONAME 'group_replication.so'; # Linux
INSTALL PLUGIN group_replication SONAME 'group_replication.dll'; # Window
2.3. MySQL 계정 설정 및 시작
Primary
CREATE USER 'replication_user1'@'127.0.0.1' IDENTIFIED BY 'replication_password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user1'@'127.0.0.1' ;
SELECT user, host FROM mysql.user;
FLUSH PRIVILEGES;
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members; # 연결 정보 확인
SHOW MASTER STATUS; # Primary의 현재 상태 확인
Replica
CHANGE MASTER TO
MASTER_HOST='127.0.0.1', -- Primary 서버 IP
MASTER_USER='replication_user1', -- 복제를 위한 사용자 (이전에 생성한 사용자)
MASTER_PASSWORD='replication_password', -- 복제를 위한 사용자의 비밀번호
MASTER_PORT=3308, -- Primary 서버의 포트
MASTER_AUTO_POSITION=1 ;
SHOW slave STATUS ; # Replica 상태 확인
START slave;
3. 오류 확인
select * from performance_schema.replication_applier_status_by_worker ; # error log 확인
STOP slave;
reset slave all ;
4. 결과
Primary 에 삽입되는 데이터가 Replica 로 동기화 됩니다.
5. 오류 처리
# 1
Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction 'ANONYMOUS' at source log mysql-album-master-bin.000003, end_log_pos 443. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any.
=> Repliaction 계정 이름이 Primary Replica 같은지 확인해봅니다.
예를 들어, Primary 에 Replication 으로 등록한 User 이름이 Replica 에도 그대로 있는 경우 이 문제가 발생했습니다.
# 2
Column 1 of table 'test_rep_db_master.rep_master_a' cannot be converted from type 'varchar(45(bytes))' to type 'varchar(180(bytes) utf8mb4)'
=> character-set 을 통일해줍니다.
Primary DB ( utf8 ) ---- replication ---> Replica DB ( utf8mb4 )
utf8 을 사용하는 Primary DB에 utf8mb4 를 사용하는 Replica DB 를 구성할 때,
replication 을 연결하면 다른 character-set 으로 연결되어, 에러가 발생하게 됩니다.
# 3
Worker 1 failed executing transaction '15113a63-31fa-4be9-b362-46b91958ac7a:5' at master log binlog.000001, end_log_pos 2139;
⇒ Primary의 로그 상태를 확인해서 Replica 노드와 File Position 를 맞춰 줍니다.
트랜잭션 로그가 맞지 않아 계속 이전 트랜잭션과 충돌하는 에러입니다.
SHOW MASTER STATUS;
CHANGE MASTER TO
MASTER_HOST='127.0.0.1', -- 마스터 서버 IP
MASTER_USER='replication_user1', -- 복제를 위한 사용자 (이전에 생성한 사용자)
MASTER_PASSWORD='replication_password', -- 복제를 위한 사용자의 비밀번호
MASTER_PORT=3308, -- 마스터 서버의 포트
MASTER_LOG_FILE='binlog.000006', -- 마스터의 현재 바이너리 로그 File
MASTER_LOG_POS=2537; -- 마스터의 Position
마침.
참고 링크 :
http://jidum.com/jidums/view.do?jidumId=423
https://aworkingmom.tistory.com/38
https://saramin.github.io/2021-09-28-mysql-group-replication/
https://hoing.io/archives/3111
https://mysqldba.tistory.com/290
'♣ Learning Logs > MYSQL' 카테고리의 다른 글
[MYSQL] Mysql Group Replication 구축(1) (0) | 2024.10.25 |
---|---|
[MySQL] binlog로 시점 복원하기 (1) | 2024.10.03 |