Open mojh7 opened 1 year ago
auto.cnf
파일 내에 server_uuid 값이 저장되어 있음auto.cnf
파일이 자동으로 생성된다고 하더라도 해당 파일에 저장돼 있는 UUID 값은 복제가 설정된 소스 서버와
레플리카 서버의 GTID 값에 사용되는 값이므로 삭제되지 않도록 주의{uuid1}:1-2, {uuid2}:1-5
gtid_executed_compression_period
시스템 변수에
지정된 수까지 도달하면 스레드에서 압축을 수행하고, 그 후 다시 다음 주기가 돌아올 때까지 슬립 모드를 유지gtid_executed_compression_period
시스템 변수값이 0이면 압축을 수행하지 않다가 필요에 따라 자동으로 실행함복제를 설정하는 명령어
CHANGE REPLICATION SOURCE TO
또는 CHANGE MASTER TO
mysqldump로 백업 받은 파일의 헤더 부분에서 해당 명령어를 참조 할 수 있다
복제 설정 예제
-- // mysql 8.0.23 이상 버전
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='source_server_host',
SOURCE_PORT=3306,
SOURCE_USER='repl_user',
SOURCE_PASSWORD='repl_user_password',
SOURCE_LOG_FILE='binary-log.000002',
SOURCE_LOG_POS=2708
GET_SOURCE_PUBLIC_KEY=1;
-- // mysql 8.0.23 미만 버전
CHANGE MASTER TO
MASTER_HOST='source_server_host',
MASTER_PORT=3306,
MASTER_USER='repl_user',
MASTER_PASSWORD='repl_user_password',
MASTER_LOG_FILE='binary-log.000002',
MASTER_LOG_POS=2708,
GET_MASTER_PUBLIC_KEY=1;
위에 옵션들 말고도 더 있음
GET_SOURCE_PUBLIC_KEY
(또는 GET_MASTER_PUBLIC_KEY
)는 RSA 키 기반 비밀번호 교환 방식의 통신을 위해 공개키를 소스 서버에 요청할 것인지 여부를 나타낸다
복제 설정에 보안된 연결(SSL)과 관련된 옵션들을 명시하지 않아 레플리카 서버와 소스 서버가 암호화되지 않은 통신 방식으로 연결되는 경우 GET_SOURCE_PUBLIC_KEY=1
구문 없이 복제 설정 후 복제 시작시 에러 발생
에러가 발생되는 이유
MySQL 8.0.4버전 부터 기본 인증 플러그인이 바뀜
mysql_native_password → caching_sha2_password
그래서 MySQL 서버에 계정을 생성할 때 별도로 인증 플러그인을 지정하지 않는 이상의 서버의 기본 인증 플러그인인 caching_sha2_password로 설정된다
복제 설정 후 SHOW REPLICA STATUS
(또는 SHOW SLAVE STATUS
) 명령을 실행하면 복제 관련 정보가 레플리카 서버 MySQL에 등록돼 있는 것을 확인할 수 있다
START REPLICA
또는 START SLAVE
명령을 실행하여 동기화 따로 시작
위에 No로 설정된 두 칼럼이 "Yes"로 바뀌고 이 명령어를 11:45에 시작했으면 레플리카 서버는 가능한 10:30(mysqldump 시작 지점) 부터 11:45까지의 데이터 변경사항들을 소스 서버로부터 가져와 적용하게 된다
만약 위에 No로 설정된 두 칼럼이 "Yes"로 바뀌지 않는다면 복제 설정 정보가 잘못 입력됐을 가능성이 상당히 높다
복제로 구성돼 있는 MySQL 서버들을 운영하다 보면 레플리카 서버에서 소스 서버로부터 넘어온 트랜잭션이 제대로 실행되지 못하고 에러가 발생해 복제가 멈추는 현상이 종종 발생함
MySQL 서버의 비정상 종료와 같이 실제 예기치 못한 문제가 있어서 발생할 수도 있음
대부분 사용자의 실수
레플리카 서버의 데이터를 모두 버리고 처음부터 다시 레플리카 서버를 구축한 뒤 복제를 다시 구성해야 할 수도 있다
하지만 경우에 따라 레플리카 서버에서 문제되는 소스 서버의 트랜잭션을 무시하고 넘어가도록 처리해도 괜찮을 때가 있다
443p 책 예제는 바이너리 로그 위치 기반 복제가 설정된 레플리카 서버에서 중복된 키로 인해 INSERT 쿼리가 실패한 상태로 복제가 멈춰져 있다고 가정함
다음과 같이 복제를 중단한 후 sql_slave_skip_counter 변수의 값을 1로 지정하고 레플리케이션 SQL 스레드를 재시작하면 레플리카 서버는 에러가 발생한 INSERT 쿼리를 건너뛰고 정상적으로 복제를 재개하게 된다
-- // MySQL 8.0.22 미만 버전
STOP SLAVE SQL_THREAD;
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE SQL_THREAD;
-- // MySQL 8.0.22 이상 버전
STOP REPLICA SQL_THREAD;
SET GLOBAL sql_slave_skip_counter=1;
START REPLICA SQL_THREAD;
sql_slave_skip_counter에는 적용하지 않고 건너뛸 바이너리 로그 이벤트 그룹 수를 지정
MySQL 서버에서 실행되는 DML 쿼리들이 단순하게 하나의 트랜잭션에 DML 쿼리가 하나만 실행되는 형태라면
그러나 하나의 트랜잭션에 여러 DML 쿼리들이 포함되는 경우에서 에러가 발생한다면
https://dev.mysql.com/doc/refman/8.0/en/replication-howto-slaveinit.html
복제에서 unix socket file을 사용할 수 없고 tcp/ip를 사용하여 source server에 연결할 수 있어야 한다
select thread_id, name, type from performance_schema.threads;
+-----------+----------------------------------------+------------+
| thread_id | name | type |
+-----------+----------------------------------------+------------+
| 1 | thread/sql/main | BACKGROUND |
| 2 | thread/sql/thread_timer_notifier | BACKGROUND |
| 3 | thread/innodb/io_ibuf_thread | BACKGROUND |
| 4 | thread/innodb/io_log_thread | BACKGROUND |
| 5 | thread/innodb/io_read_thread | BACKGROUND |
| 6 | thread/innodb/io_read_thread | BACKGROUND |
| 7 | thread/innodb/io_read_thread | BACKGROUND |
| 8 | thread/innodb/io_read_thread | BACKGROUND |
| 9 | thread/innodb/io_write_thread | BACKGROUND |
| 10 | thread/innodb/io_write_thread | BACKGROUND |
| 11 | thread/innodb/io_write_thread | BACKGROUND |
| 12 | thread/innodb/io_write_thread | BACKGROUND |
| 13 | thread/innodb/page_cleaner_thread | BACKGROUND |
| 15 | thread/innodb/srv_lock_timeout_thread | BACKGROUND |
| 16 | thread/innodb/srv_error_monitor_thread | BACKGROUND |
| 17 | thread/innodb/srv_monitor_thread | BACKGROUND |
| 18 | thread/innodb/srv_master_thread | BACKGROUND |
| 19 | thread/innodb/srv_purge_thread | BACKGROUND |
| 20 | thread/innodb/srv_worker_thread | BACKGROUND |
| 21 | thread/innodb/srv_worker_thread | BACKGROUND |
| 22 | thread/innodb/srv_worker_thread | BACKGROUND |
| 23 | thread/innodb/buf_dump_thread | BACKGROUND |
| 24 | thread/innodb/dict_stats_thread | BACKGROUND |
| 25 | thread/sql/compress_gtid_table | FOREGROUND |
| 26 | thread/sql/con_sockets | BACKGROUND |
| 27 | thread/sql/one_connection | FOREGROUND |
+-----------+----------------------------------------+------------+
다음 스터디
2023-08-07 pm 10:30 월요일
정리 범위