Single/Multi Primary Mode
그룹 복제는 Client에서 Failover를 처리하지 않으므로 MySQL Router 8.0, ProxySQL, Connector 등으로 redirection 조치 미들웨어가 추가 되어야 함
- group_replication_single_primary_mode 값을 모두 같은 값으로 설정해야 하며 GR 실행 중에 변경할 수 없음
- group_replication_bootstrap_group=ON 으로 전체 reboot 필요 (안전하게 트랜잭션이 처리되며 실행할 수 있도록 함)
- MySQL 8.0.16 이후부터 group_replication_switch_to_single_primary_mode(), group_replication_switch_to_multi_primary_mode() 함수로 변경 가능
- 멤버 상태 확인
- SELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members;
- SHOW STATUS LIKE 'group_replication_primary_member'
Single Primary
- 읽기-쓰기용 1개와 읽기 전용 여러대 (super_read_only=ON) 으로 설정
- group_replication_single_primary_mode=OFF
- group_replication_enforce_update_everywhere_checks=OFF
- 주 서버 변경
- 주 서버에 문제가 생기면 다른 서버를 주 서버로 자동 변경
- group_replication_set_as_primary()로 변경 가능
- Transaction Consistency 관련 상세 확인
- 주 서버 선출 기준 : 가장 낮은 MySQL 버전의 멤버 > group_replication_member_weight 변수 값이 낮은 멤버 > UUID 순서
![](https://dev.mysql.com/doc/refman/8.0/en/images/single-primary-election.png)
Multi Primary
-
- group_replication_single_primary_mode=ON
- SERIALIZABLE 격리 수준에서 실행되면 동기화 커밋 실패 발생
- 외래 키가 있는 테이블에 대해 트랜잭션이 실행될 경우 동기화 커밋 실패 발생
- 그룹 복제 토폴로지에서 일반적 DDL 실행 시 주의 필요. DDL 문 실행 시 활성화 된 현재 세션의 모든 암시적 트랜잭션이 종료 됨 (명시적 트랜잭션 문내에 DDL 문이 포함될 수 없음을 의미)
![](https://dev.mysql.com/doc/refman/8.0/en/images/multi-primary.png)
Group Replication 설정
그룹 복제 기본 요구 사항
Storage Engine (INNODB transactional storage 엔진만 사용 가능)
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" |
PrimaryKey가 반드시 존재해야 한다.
Network Performance
그룹 복제 설정 순서
- Configuration 변경 후, 모든 서버 MySQL 재시작
- Group Replication 멤버 모든 서버에 Plugin 설치 (수동 설치 시 아래 명령어 사용)
mysql >INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql >INSTALL PLUGIN clone SONAME 'mysql_clone.so';
mysql >SHOW PLUGINS; #확인 - MySQL 서버 재시작
- User 생성 및 권한 설정 (Primary에서 설정)
mysql> SET SQL_LOG_BIN=0;
#각 인스턴스에서 계정을 생성할 경우
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%'; # Dornor가 데이터를 검색하기 위한 분산 복구 연결을 만듦
mysql> GRANT CONNECTION_ADMIN ON *.* TO repl@'%'; # 관련 서버 중 하나가 오프라인일 경우 복제 연결이 종료되지 않도록 함
mysql> GRANT BACKUP_ADMIN ON *.* TO repl@'%'; # 복제 복구를 위한 Dornor 역할
mysql> GRANT GROUP_REPLICATION_STREAM ON *.* TO repl@'%'; # GR을 위해 MySQL communication stack을 사용하여 연결을 생성하고 운영할 수 있는 권한
mysql> FLUSH PRIVILEGES; # from MySQL 8.0.23:
mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='패스워드' FOR CHANNEL 'group_replication_recovery'; - 그룹 부트스트랩 (Primary에서 설정)
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
mysql> SELECT * FROM performance_schema.replication_group_members; #확인
mysql> SET SQL_LOG_BIN=1; - 그룹에 인스턴스 추가 (replica 서버에서 설정)
mysql> SET SQL_LOG_BIN=0;
#각 인스턴스에서 계정을 생성할 경우
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%'; # Dornor가 데이터를 검색하기 위한 분산 복구 연결을 만듦
mysql> GRANT CONNECTION_ADMIN ON *.* TO repl@'%'; # 관련 서버 중 하나가 오프라인일 경우 복제 연결이 종료되지 않도록 함 mysql> GRANT BACKUP_ADMIN ON *.* TO repl@'%'; # 복제 복구를 위한 Dornor 역할
mysql> GRANT GROUP_REPLICATION_STREAM ON *.* TO repl@'%'; # GR을 위해 MySQL communication stack을 사용하여 연결을 생성하고 운영할 수 있는 권한
mysql> FLUSH PRIVILEGES;
# from MySQL 8.0.23:
mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='패스워드' FOR CHANNEL 'group_replication_recovery';
mysql> START GROUP_REPLICATION; mysql> SELECT * FROM performance_schema.replication_group_members; #확인
mysql> SET SQL_LOG_BIN=1;
Failover 확인
Down 되었던 서버의 rejoin 시 START GROUP_REPLICATION; 필요
그룹 복제 관련 Configuration
VariableValueDescriptionDefault Version
변수 | 값 | 상세 | Default |
server_id | 1 | unique identifier number | - |
gtid_mode | ON | gtid 모드 설정 | - |
enforce_gtid_consistency | ON | gtid 모드 설정 | - |
binlog_checksum | NONE | MySQL 8.0.20까지 NONE으로 셋팅 MySQL 8.0.21부터 GR에서 checksum을 지원하여 default인 CRC32로 실행 Checksum지원을 원하지 않으면 NONE으로 셋팅 (체크섬을 사용하지 않으면 각 이벤트에 대한 체크섬이 아닌 이벤트 길이를 작성해서 바이너리 로그에 완전한 이벤트만 작성하는지 확인) |
NONE CRC32 |
plugin_load_add | group_replication.so | 서버 시작 시 로드되는 plugin | - |
group_replication_group_name | aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa | 그룹 복제 명으로 select UUID() 로 생성 | - |
log_bin | binlog | 바이너리로그 active, 파일 명 | binlog |
log_slave_updates (MySQL 8.0.26 미만) log_replica_updates (MySQL 8.0.26 이상) |
ON | 복제 업데이트 기록 | ON |
binlog_format | ROW | MySQL 8.0.19부터 GR에 REQUIRE_ROW_FORMAT이 자동으로 추가 됨 | ROW |
master_info_repository | TABLE | MySQL 8.0.23부터 deprecate | TABLE |
relay_log_info_repository | TABLE | MySQL 8.0.23부터 deprecate | TABLE |
transaction_write_set_extraction | XXHASH64 | MySQL 8.0.26부터 deprecate | XXHASH64 |
group_replication_start_on_boot | off | 서버 시작과 함께 GR이 자동 시작 되지는지 여부 최초 셋업 시 off로 하여 플러그인을 수동으로 구성 후 on으로 변경 |
off |
group_replication_local_address | s1:33061 | 그룹의 다른 멤버와 내부 통신에 사용하는 주소:포트 정보 | - |
group_replication_group_seeds | s1:33061,s2:33061,s3:33061 | 그룹 멤버들의 주소와 호스트 이름과 포트 설정 | - |
group_replication_bootstrap_group | off | 첫 번 째 멤버가 온라인 상태가된 후 설정 변경 그룹에서 한개의 멤버만 GR 실행 중일 때 그룹을 bootstrap 하도록 설정을 ON으로 변경한 후 다시 OFF로 수정 |
off |
group_replication_single_primary_mode | ON | 읽기/쓰기 작업 부하를 처리할 단일 서버를 자동으로 선택 | ON |
GTID 기반 복제 제한 사항
GTID가 활성화 된 MySQL 서버에서는 enforce_gtid_consistency=ON 옵션으로 인해 GTID 일관성을 해칠 수 있는 일부 유형의 쿼리를 실행할 수 없다.
- 트랜잭션을 지원하는 테이블과 지원하지 않는 테이블을 함께 변경하는 쿼리 혹은 트랜잭션
- CREATE TABLE ... SELECT ... 구문
- 트랜잭션 내에서 CREATE TEMPORARY TABLE, DROP TEMPORARY TABLE 구문 사용
- 8.0.13 부터는 binlog_format이 ROW나 Mixed로 설정된 경우 트랜잭션 내에서 CREATE TEMPORARY TABLE, DROP TEMPORARY TABLE을 사용할 수 있다.
- 8.0.21 부터는 Automic DDL을 지원하는 InnoDB 스토리지 엔진 테이블에 한해 CREATE TABLE ... SELECT 구문을 사용할 수 있다.
GTID 기반 복제가 설정된 Replica 서버에서는 sql_slave_skip_counter 시스템 변수를 사용해 복제된 트랜잭션을 건너뛸 수 없다.
CHANGE REPLICATION SOURCE TO 구문에서 IGNORE_SERVER_IDS 옵션은 사용되지 않는다. 이미 적용된 트랜잭션을 식별할 수 있으며 자동으로 무시하므로 옵션이 필요하지 않다.
참조
Chapter 18 Group Replication
MySQL Parallel ReEvaluating MySQL Parallel Replication Part 2: Slave Group Commitplication: All the 5.7 and 8.0 Details (Logical_Cloc
'Database > MySQL, MariaDB' 카테고리의 다른 글
Mysql 계정 정보 복사, 이전 (DB 마이그레이션 시) (0) | 2023.03.08 |
---|---|
MariaDB 버전에 따른 mysql DB 스키마 관련 오류 ([Error] Query caused different errors on mast (0) | 2023.03.06 |
[MY-000068] [Server] unknown option '---'. (0) | 2022.09.13 |
MySQL Group Replication 설정 순서 (0) | 2022.09.04 |
ProxySQL 2.3 - 향상된 Group 복제 운영 방식 (0) | 2022.09.04 |