mojh7 / real-mysql-study

:orange_book: Real MySQL 8.0 study
0 stars 0 forks source link

2023/08/02 ~ 2023/08/07 #62

Open mojh7 opened 1 year ago

mojh7 commented 1 year ago

다음 스터디

2023-08-07 pm 10:30 월요일

정리 범위

  1. 16.3.1.4 복제 시작(439p) ~ 16.3.2 전까지(444p)
  2. 16.3.2 부터(444p) ~ 16.3.2.3 전 까지(452p)
github-actions[bot] commented 1 year ago

정리 범위 무작위 선택 봇 🔎

  1. 장현
  2. 단비
danbi5228 commented 1 year ago

16.3.2 글로벌 트랜잭션 아이디(GTID) 기반 복제

16.3.2.1 GTID의 필요성

16.3.2.2 글로벌 트랜잭션 아이디

mojh7 commented 1 year ago

16.3.1.1 바이너리 로그 파일 위치 기반의 복제 구축

16.3.1.1.4 복제시작

복제를 설정하는 명령어

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 구문 없이 복제 설정 후 복제 시작시 에러 발생


에러가 발생되는 이유


복제 설정 후 SHOW REPLICA STATUS (또는 SHOW SLAVE STATUS) 명령을 실행하면 복제 관련 정보가 레플리카 서버 MySQL에 등록돼 있는 것을 확인할 수 있다

START REPLICA 또는 START SLAVE 명령을 실행하여 동기화 따로 시작


16.3.1.2 바이너리 로그 파일 위치 기반의 복제에서 트랜잭션 건너뛰기

복제로 구성돼 있는 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 쿼리들이 포함되는 경우에서 에러가 발생한다면


기타 1

https://dev.mysql.com/doc/refman/8.0/en/replication-howto-slaveinit.html

복제에서 unix socket file을 사용할 수 없고 tcp/ip를 사용하여 source server에 연결할 수 있어야 한다


기타 2

https://blog.ex-em.com/1681

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 |
+-----------+----------------------------------------+------------+