1. Multi-Primary and Single-Primary Modes
그룹 복제는 단일 기본 모드 또는 다중 기본 모드에서 작동합니다. 그룹 모드는 group_replication_single_primary_mode 시스템 변수로 지정되는 그룹 전체 구성 설정이며 모든 구성원이 동일해야 합니다. "ON" 설정은 기본 모드인 단일 기본 모드를 의미하며, "OFF" 설정은 다중 기본 모드를 의미합니다. 그룹의 구성원을 서로 다른 모드로 배포하는 것은 불가능합니다. 예를 들어 한 구성원은 다중 기본 모드로 구성되고 다른 구성원은 단일 기본 모드로 구성하는 것은 불가능합니다.
그룹 복제가 실행되는 동안에는 group_replication_single_primary_mode 값을 수동으로 변경할 수 없습니다 . MySQL 8.0.13부터 group_replication_switch_to_single_primary_mode() 및 group_replication_switch_to_multi_primary_mode() 기능을 사용하여 그룹 복제가 계속 실행되는 동안 그룹을 한 모드에서 다른 모드로 이동할 수 있습니다. 이러한 기능은 그룹 모드 변경 프로세스를 관리하고 데이터의 안전과 일관성을 보장합니다. 이전 릴리스에서는 그룹 모드를 변경하려면 그룹 복제를 중지하고 group_replication_single_primary_mode 모든 구성원의 값을 변경해야 합니다. 그런 다음 그룹의 전체 재부팅(를 사용하는 서버의 부트스트랩 group_replication_bootstrap_group=ON)을 수행하여 새 운영 구성에 대한 변경 사항을 구현합니다.
1.1 Single-Primary Mode
단일 기본 모드( group_replication_single_primary_mode=ON)에서 그룹에는 읽기-쓰기 모드로 설정된 단일 기본 서버가 있습니다. 그룹의 다른 모든 구성원은 읽기 전용 모드로 설정됩니다( 사용 super_read_only=ON). 기본 서버는 일반적으로 그룹을 부트스트랩하는 첫 번째 서버입니다. 그룹에 참여하는 다른 모든 서버는 기본 서버에 대해 학습하고 자동으로 읽기 전용 모드로 설정됩니다.
단일 기본 모드에서 그룹 복제는 단일 서버만 그룹에 쓰도록 강제하므로 다중 기본 모드에 비해 일관성 검사가 덜 엄격할 수 있으며 DDL 문을 특별히 주의해서 처리할 필요가 없습니다. 이 옵션은 group_replication_enforce_update_everywhere_checks 그룹에 대한 엄격한 일관성 검사를 활성화하거나 비활성화합니다. 단일 기본 모드로 배포하거나 그룹을 단일 기본 모드로 변경하는 경우 이 시스템 변수를 로 설정해야 합니다 OFF.
기본 서버로 지정된 구성원은 다음과 같은 방법으로 변경할 수 있습니다.
- 자발적으로든 예기치 않게든 기존 기본 구성원이 그룹을 떠나면 새 기본 구성원이 자동으로 선출됩니다.
- 기능 을 사용하여 특정 구성원을 새로운 기본 구성원으로 지정할 수 있습니다 group_replication_set_as_primary() .
- 이 기능을 사용하여 group_replication_switch_to_single_primary_mode() 다중 기본 모드에서 실행 중인 그룹을 단일 기본 모드로 실행하도록 변경하면 새 기본이 자동으로 선택되거나 기능으로 지정하여 새 기본을 지정할 수 있습니다.
이 기능은 모든 그룹 구성원이 MySQL 8.0.13 이상을 실행하는 경우에만 사용할 수 있습니다. 새로운 기본 서버가 자동으로 선택되거나 수동으로 지정되면 자동으로 읽기-쓰기로 설정되고 다른 그룹 구성원은 보조 서버로 유지되므로 읽기 전용입니다. 그림 20.4, “새 예비선거”는 이 과정을 보여줍니다.
그림 20.4 새로운 예비선거
새로운 기본 서버가 선택되거나 임명되면 이전 기본 서버에는 적용되었지만 아직 이 서버에는 적용되지 않은 변경 사항의 백로그가 있을 수 있습니다. 이 상황에서는 새 기본이 이전 기본을 따라잡을 때까지 읽기-쓰기 트랜잭션이 충돌을 일으키고 롤백될 수 있으며 읽기 전용 트랜잭션으로 인해 오래된 읽기가 발생할 수 있습니다. 빠른 구성원과 느린 구성원 간의 차이를 최소화하는 그룹 복제의 흐름 제어 메커니즘은 활성화되고 적절하게 조정되면 이러한 일이 발생할 가능성을 줄입니다. 흐름 제어에 대한 자세한 내용은 20.7.2절 “흐름 제어”를 참조하십시오 . MySQL 8.0.14부터는 group_replication_consistency 시스템 변수를 사용하여 그룹의 트랜잭션 일관성 수준을 구성하여 이 문제를 방지할 수도 있습니다. 설정 BEFORE_ON_PRIMARY_FAILOVER(또는 더 높은 일관성 수준)은 백로그가 적용될 때까지 새로 선택된 기본에서 새 트랜잭션을 유지합니다. 트랜잭션 일관성에 대한 자세한 내용은 섹션 20.5.3, “트랜잭션 일관성 보장”을 참조하십시오 . 흐름 제어 및 트랜잭션 일관성 보장이 그룹에 사용되지 않는 경우 클라이언트 애플리케이션을 다시 라우팅하기 전에 새 기본이 복제 관련 릴레이 로그를 적용할 때까지 기다리는 것이 좋습니다.
자동 기본 구성원 선택 프로세스에는 각 구성원이 그룹의 새로운 관점을 살펴보고, 잠재적인 새 기본 구성원을 주문하고, 가장 적합한 구성원을 선택하는 과정이 포함됩니다. 각 구성원은 MySQL Server 릴리스의 기본 선택 알고리즘에 따라 로컬에서 자체 결정을 내립니다. 모든 구성원은 동일한 결정에 도달해야 하기 때문에 다른 그룹 구성원이 더 낮은 MySQL Server 버전을 실행하는 경우 구성원은 기본 선택 알고리즘을 조정하여 그룹에서 가장 낮은 MySQL Server 버전을 가진 구성원과 동일한 동작을 하게 됩니다.
예비선거를 선출할 때 회원들이 고려하는 요소는 순서대로 다음과 같습니다.
- 고려되는 첫 번째 요소는 어떤 멤버가 가장 낮은 MySQL Server 버전을 실행하고 있는지입니다. 모든 그룹 구성원이 MySQL 8.0.17 이상을 실행하는 경우 구성원은 먼저 릴리스의 패치 버전을 기준으로 정렬됩니다. 멤버가 MySQL Server 5.7 또는 MySQL 8.0.16 이하를 실행 중인 경우 멤버는 먼저 릴리스의 주요 버전을 기준으로 정렬되고 패치 버전은 무시됩니다.
- 두 명 이상의 멤버가 가장 낮은 MySQL Server 버전을 실행하는 경우 고려되는 두 번째 요소는 group_replication_member_weight 멤버의 시스템 변수에 지정된 각 멤버의 멤버 가중치입니다. 그룹의 멤버 중 하나라도 이 시스템 변수를 사용할 수 없는 MySQL Server 5.7을 실행 중인 경우 이 요소는 무시됩니다.
- 시스템 group_replication_member_weight 변수는 0-100 범위의 숫자를 지정합니다. 모든 구성원의 기본 가중치는 50이므로 순서를 낮추려면 이보다 낮은 가중치를 설정하고 순서를 높이려면 그보다 높은 가중치를 설정합니다. 이 가중치 기능을 사용하면 더 나은 하드웨어 사용의 우선순위를 지정하거나 기본의 예약된 유지 관리 중에 특정 멤버에 대한 장애 조치를 보장할 수 있습니다.
- 둘 이상의 멤버가 가장 낮은 MySQL Server 버전을 실행하고 있고 해당 멤버 중 둘 이상이 가장 높은 멤버 가중치를 갖는 경우(또는 멤버 가중치가 무시되는 경우) 고려되는 세 번째 요소는 각 멤버의 생성된 서버 UUID의 사전순입니다. , 시스템 변수에 지정된 대로 server_uuid. 서버 UUID가 가장 낮은 멤버가 기본 멤버로 선택됩니다. 이 요소는 중요한 요소에 의해 결정될 수 없는 경우 모든 그룹 구성원이 동일한 결정에 도달할 수 있도록 보장되고 예측 가능한 결정의 역할을 합니다.
단일 기본 모드로 배포된 경우 현재 기본 서버인 서버를 확인하려면 MEMBER_ROLE표의 열을 사용하세요 performance_schema.replication_group_members . 예를 들어:
mysql> SELECT MEMBER_HOST, MEMBER_ROLE FROM performance_schema.replication_group_members;
+-------------------------+-------------+
| MEMBER_HOST | MEMBER_ROLE |
+-------------------------+-------------+
| remote1.example.com | PRIMARY |
| remote2.example.com | SECONDARY |
| remote3.example.com | SECONDARY |
+-------------------------+-------------+
상태 group_replication_primary_member 변수는 더 이상 사용되지 않으며 향후 버전에서 제거될 예정입니다.
또는 group_replication_primary_member 상태 변수를 사용하십시오.
mysql> SHOW STATUS LIKE 'group_replication_primary_member'