Database/MySQL, MariaDB

MySQL Group Replication

BabyTT 2022. 9. 17. 07:13

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 순서

Multi Primary

    • group_replication_single_primary_mode=ON
    • SERIALIZABLE 격리 수준에서 실행되면 동기화 커밋 실패 발생
    • 외래 키가 있는 테이블에 대해 트랜잭션이 실행될 경우 동기화 커밋 실패 발생
    • 그룹 복제 토폴로지에서 일반적 DDL 실행 시 주의 필요. DDL 문 실행 시 활성화 된 현재 세션의 모든 암시적 트랜잭션이 종료 됨 (명시적 트랜잭션 문내에 DDL 문이 포함될 수 없음을 의미)

Group Replication 설정

그룹 복제 기본 요구 사항

Storage Engine (INNODB transactional storage 엔진만 사용 가능)

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

PrimaryKey가 반드시 존재해야 한다.
Network Performance

그룹 복제 설정 순서

  1. Configuration 변경 후, 모든 서버 MySQL 재시작
  2. Group Replication 멤버 모든 서버에 Plugin 설치 (수동 설치 시 아래 명령어 사용) 
    mysql >INSTALL PLUGIN group_replication SONAME 'group_replication.so';
    mysql >INSTALL PLUGIN clone SONAME 'mysql_clone.so';
    mysql >SHOW PLUGINS; #확인
  3. MySQL 서버 재시작
  4. 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';
  5.  그룹 부트스트랩 (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;
  6. 그룹에 인스턴스 추가 (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