이전 포스트 👉 MySQL GID란?
이번 포스트에서 다룰 주제는 복제 연결 구조에서의 GTID mode 활성화 테스트입니다.
CHANGE MASTER TO MASTER_HOST='ip',MASTER_PORT=13306, MASTER_USER='user_name', MASTER_PASSWORD='password', MASTER_AUTO_POSITION =1;
-- 기존 방식
-- CHANGE MASTER TO MASTER_HOST='ip',MASTER_PORT=13306, MASTER_USER='user_name', MASTER_PASSWORD='password', MASTER_LOG_FILE='???????' ,MASTER_LOG_POS= ???????? ;
https://dev.mysql.com/doc/refman/8.0/en/replication-mode-change-online.html
GTID 모드로 변경할 복제 그룹 내의 모든 서버에서 enforce_gtid_consistency 를 WARN 으로 변경
SET GLOBAL ENFORCE_GTID_CONSISTENCY = WARN;
--> GTID 모드에서 문제가 되는 SQL이 있다면 DB Log에서 Warning 메시지 확인 가능
--> 경고 발생 시 애플리케이션 조치 필요
문제 없다면 복제 그룹 내의 모든 서버에서 enforce_gtid_consistency 를 ON 으로 변경
SET GLOBAL ENFORCE_GTID_CONSISTENCY = ON;
복제 그룹 내의 모든 서버에서 gtid_mode 를 OFF_PERMISSIVE 으로 변경
트랜잭션에 Global Trx ID 값을 부여하지 않지만, 복제를 통해 전달받는 트랜잭션은 Global Trx ID를 받은 트랜잭션과 그렇지 않은(Anonymous) 트랜잭션이 혼재해도 처리 가능하도록 함
SET GLOBAL GTID_MODE = OFF_PERMISSIVE;
복제 그룹 내의 모든 서버에서 gtid_mode 를 ON_PERMISSIVE 으로 변경
트랜잭션에 Global Trx ID 값을 부여함. 이때 만약 gtid_mode 값이 OFF 인 Slave 장비가 남아있다면 복제가 에러 발생하게 되므로 반드시 모든 서버가 OFF_PERMISSIVE 이상으로 설정되어 있는 상태여야 함
SET GLOBAL GTID_MODE = ON_PERMISSIVE;
잔여 ANONYMOUS 트랜잭션 확인
각 서버의 Ongoing_anonymous_transaction_count 값을 확인하고, 값이 0인 상태가 최소 한번은 보일 때 까지 대기
SHOW STATUS LIKE 'Ongoing_anonymous_transaction_count';
+-------------------------------------+-------+
| Variable_name | Value |
+-------------------------------------+-------+
| Ongoing_anonymous_transaction_count | 0 |
+-------------------------------------+-------+
모든 ANONYMOUS 트랜잭션이 모든 서버에 복제될 때까지 대기
https://dev.mysql.com/doc/refman/8.0/en/replication-mode-change-online-verify-transactions.html
Master 에서 현재 status 확인
SHOW MASTER STATUS;
모든 Slave 에서 MASTER_POS_WAIT 값이 0인지 확인
SELECT MASTER_POS_WAIT('filename', position);
6단계 이후로 GTID가 없는 트랜잭션이 포함된 이전 바이너리 로그는 시점 복원 시 사용 불가능함.
도큐먼트에서는 GTID 가 없는 트랜잭션이 포함된 이전 바이너리 로그 및 백업본이 필요하지 않을 때까지 대기 후 다음 단계를 진행하는 것을 권장함
해당 시점에 백업 생성 필요할 지 혹은 다음 백업 주기까지 기다릴지 등등 정책 검토 필요
GTID 활성화 전의 Xtrabackup 으로 신규 인스턴스에 복원하는 경우 신규 인스턴스에는 GTID가 활성화되는지 안되는지 확인 필요
복제 그룹 내의 모든 서버에서 gtid_mode 를 ON 으로 변경
SET GLOBAL GTID_MODE = ON;
복제 그룹 내의 모든 서버의 my.cnf 에 gtid_mode=ON 및 enforce_gtid_consistency=ON 추가
해당 시점부터 더 이상 ANONYMOUS 트랜잭션은 생성되지 않고, 처리되지도 않음
vi my.cnf
# 아래 내용 추가
gtid_mode=ON
enforce_gtid_consistency=ON
복제 그룹 내의 모든 Slave 서버에서 GTID 프로토콜 사용을 위해 복제 연결 재설정
모든 트랜잭션에 GTID가 존재하는 것이 보장되므로 GTID 프로토콜을 통해 자동 장애 조치 수행 가능
STOP SLAVE;
SHOW SLAVE STATUS\G
CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
START SLAVE;
SHOW SLAVE STATUS\G
master log
error.log
2024-09-06T01:55:43.362309Z 2063 [Note] [MY-010034] [Server] Changed ENFORCE_GTID_CONSISTENCY from OFF to ON.
2024-09-06T09:45:11.902707Z 2063 [System] [MY-010035] [Server] Changed GTID_MODE from OFF to OFF_PERMISSIVE.
2024-09-06T09:45:22.421104Z 2063 [System] [MY-010035] [Server] Changed GTID_MODE from OFF_PERMISSIVE to ON_PERMISSIVE.
2024-09-06T09:46:18.583403Z 2063 [System] [MY-010035] [Server] Changed GTID_MODE from ON_PERMISSIVE to ON.
2024-09-06T09:47:26.907729Z 0 [ERROR] [MY-013129] [Server] A message intended for a client cannot be sent there as no client-session is attached. Therefore, we're sending the information to the error-log instead: MY-001158 - Got an error reading communication packets
2024-09-06T09:47:29.865576Z 86 [Warning] [MY-011153] [Repl] Timeout waiting for reply of binlog (file: mysql-bin.000020, pos: 21902), semi-sync up to file mysql-bin.000020, position 21679.
2024-09-06T09:47:29.867683Z 86 [Note] [MY-011155] [Repl] Semi-sync replication switched OFF.
2024-09-06T09:47:29.869402Z 80 [ERROR] [MY-011161] [Repl] Semi-sync source failed on net_flush() before waiting for replica reply.
2024-09-06T09:47:29.869628Z 80 [Note] [MY-011171] [Repl] Stop semi-sync binlog_dump to replica (server_id: 2).
2024-09-06T09:47:29.918932Z 80 [Note] [MY-010914] [Server] Aborted connection 80 to db: 'unconnected' user: 'repl' host: '***' (Found net error).
2024-09-06T09:47:37.523006Z 3012 [Note] [MY-010462] [Repl] Start binlog_dump to source_thread_id(3012) replica_server(2), pos(, 4)
2024-09-06T09:47:37.523318Z 3012 [Note] [MY-011170] [Repl] Start semi-sync binlog_dump to replica (server_id: 2), pos(, 4).
2024-09-06T09:47:37.529284Z 0 [Note] [MY-011156] [Repl] Semi-sync replication switched ON at (mysql-bin.000020, 24481).
bin log
# at 40359
#240906 18:48:27 server id 1 end_log_pos 40436 CRC32 0x1539d79a GTID last_committed=129 sequence_number=130 rbr_only=no original_committed_timestamp=1725616107271220 immediate
_commit_timestamp=1725616107271220 transaction_length=200
# original_commit_timestamp=1725616107271220 (2024-09-06 18:48:27.271220 KST)
# immediate_commit_timestamp=1725616107271220 (2024-09-06 18:48:27.271220 KST)
/*!80001 SET @@session.original_commit_timestamp=1725616107271220*//*!*/;
/*!80014 SET @@session.original_server_version=80034*//*!*/;
/*!80014 SET @@session.immediate_server_version=80034*//*!*/;
SET @@SESSION.GTID_NEXT= '83019ac0-6b64-11ef-8bdf-fa163ed63ea8:187'/*!*/;
# at 40436
#240906 18:48:27 server id 1 end_log_pos 40559 CRC32 0x980781c1 Query thread_id=3013 exec_time=0 error_code=0 Xid = 487089
SET TIMESTAMP=1725616107/*!*/;
/*!80016 SET @@session.default_table_encryption=0*//*!*/;
create database gtid_test
/*!*/;
...
slave log
error.log
2024-09-06T09:47:26.896986Z 29 [Note] [MY-010596] [Repl] Error reading relay log event for channel '': replica SQL thread was killed
2024-09-06T09:47:26.905159Z 29 [Note] [MY-010587] [Repl] Replica SQL thread for channel '' exiting, replication stopped in log 'mysql-bin.000020' at position 21679
2024-09-06T09:47:26.925541Z 28 [Note] [MY-011026] [Repl] Replica I/O thread killed while reading event for channel ''.
2024-09-06T09:47:26.925883Z 28 [Note] [MY-010570] [Repl] Replica I/O thread exiting for channel '', read up to log 'mysql-bin.000020', position 21679
2024-09-06T09:47:37.489612Z 2964 [Note] [MY-011179] [Repl] Replica I/O thread: Start semi-sync replication to source 'repl@***:13306' in log 'mysql-bin.000020' at position 21679.
2024-09-06T09:47:37.489984Z 2964 [Warning] [MY-010897] [Repl] Storing MySQL user name or password information in the connection metadata repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START REPLICA; see the 'START REPLICA Syntax' in the MySQL Manual for more information.
2024-09-06T09:47:37.492382Z 2965 [Note] [MY-010581] [Repl] Replica SQL thread for channel '' initialized, starting replication in log 'mysql-bin.000020' at position 21679, relay log './relay-bin.000001' position: 4
2024-09-06T09:47:37.511778Z 2964 [System] [MY-014002] [Repl] Replica receiver thread for channel '': connected to source 'repl@***:13306' with server_uuid=83019ac0-6b64-11ef-8bdf-fa163ed63ea8, server_id=1. Starting GTID-based replication.
활성화의 역순으로 진행
복제 그룹 내의 모든 Slave 서버에서 GTID 프로토콜을 사용하지 않도록 복제 연결 재설정
STOP SLAVE;
SHOW SLAVE STATUS\G
CHANGE MASTER TO MASTER_AUTO_POSITION = 0, MASTER_LOG_FILE = 'file', MASTER_LOG_POS = position;
START SLAVE;
복제 그룹 내의 모든 서버에서 gtid_mode 를 ON_PERMISSIVE 으로 변경
SET GLOBAL GTID_MODE = ON_PERMISSIVE;
복제 그룹 내의 모든 서버에서 gtid_mode 를 OFF_PERMISSIVE 으로 변경
SET GLOBAL GTID_MODE = OFF_PERMISSIVE;
잔여 GTID 트랜잭션 확인
각 서버의 GTID_OWNED 값을 확인하고, 값이 empty인 상태가 최소 한번은 보일 때 까지 대기
SELECT @@GLOBAL.GTID_OWNED;
모든 GTID 트랜잭션이 모든 서버에 복제될 때까지 대기
Master 에서 현재 status 확인
SHOW MASTER STATUS;
모든 Slave 에서 MASTER_POS_WAIT 값이 0인지 확인
SELECT MASTER_POS_WAIT('filename', position);
5단계 이후로 GTID 트랜잭션이 포함된 이전 바이너리 로그는 시점 복원 시 사용 불가능함.
도큐먼트에서는 GTID 트랜잭션이 포함된 이전 바이너리 로그 및 백업본이 필요하지 않을 때까지 대기 후 다음 단계를 진행하는 것을 권장함
해당 시점에 백업 생성 필요할 지 혹은 다음 백업 주기까지 기다릴지 등등 정책 검토 필요
GTID 비활성화 전의 Xtrabackup 으로 신규 인스턴스에 복원하는 경우 신규 인스턴스에는 GTID가 비활성화되는지 안되는지 확인 필요
복제 그룹 내의 모든 서버에서 gtid_mode 를 OFF 로 변경
SET GLOBAL GTID_MODE = OFF;
복제 그룹 내의 모든 서버에서 enforce_gtid_consistency 를 OFF 로 변경
SET GLOBAL ENFORCE_GTID_CONSISTENCY = OFF;
복제 그룹 내의 모든 서버의 my.cnf 에 gtid_mode=OFF 및 enforce_gtid_consistency=OFF 으로 변경
vi my.cnf
# 아래 내용 추가
gtid_mode=OFF
enforce_gtid_consistency=OFF
다음 포스트에서는 GTID 모드에서의 MHA 고가용성 테스트에 대해 다루겠습니다.