MySQL 의 병렬 복 제 를 쉽게 설명 합 니 다.
우선,왜 병행 복제 라 는 개념 이 있 을 까?
1.DBA 는 MySQL 의 복 제 는 binlog 에 기반 한 것 임 을 알 아야 한다.
2.MySQL 복 제 는 두 부분,IO 스 레 드 와 SQL 스 레 드 를 포함한다.
3.IO 스 레 드 는 주로 Master 가 전달 한 binlog 를 끌 어 다가 relay log 에 기록 하 는 데 사 용 됩 니 다.
4.SQL 스 레 드 는 주로 relay log 를 분석 하고 slave 에 적용 합 니 다.
5.아무래도 IO 와 SQL 스 레 드 는 단일 스 레 드 이 고 master 는 다 중 스 레 드 이기 때문에 지연 이 있 을 수 밖 에 없습니다.이 문 제 를 해결 하기 위해 다 중 스 레 드 가 생 겨 났 습 니 다.
6.IO 다 중 스 레 드?
6.1 IO 는 다 중 스 레 드 가 필요 없습니다.IO 스 레 드 는 병목 이 아니 기 때 문 입 니 다.
7.SQL 다 중 스 레 드?
7.1 맞습니다.현재 최신 5.6,5.7,8.0 은 모두 SQL 스 레 드 에서 다 중 스 레 드 를 실현 하여 slave 의 병행 도 를 향상 시 켰 습 니 다.
다음은 MySQL 의 병행 복제 노력 과 성 과 를 살 펴 보 자.
중점
병행 할 수 있 느 냐 없 느 냐 는 여러 사무 간 에 자물쇠 충돌 이 있 느 냐 가 관건 이다.아래 의 병렬 복제 원 리 는 자물쇠 충돌 을 피 하 는 방법 을 보 는 것 이다.
3.MySQL 5.6 schema 기반 병렬 복사
slave-parallel-type=DATABASE(라 이브 러 리 별 트 랜 잭 션,잠 금 충돌 없 음)
앞서 말 했 듯 이 병렬 복 제 는 slave 가 가능 한 한 다 중 스 레 드 를 달 리 는 것 이 목적 입 니 다.물론 라 이브 러 리 등급 을 바탕 으로 하 는 다 중 스 레 드 도 방식 입 니 다.(라 이브 러 리 의 업무 에 따라 잠 금 충돌 이 없습니다)
먼저 장점:실현 은 상대 적 으로 간단 하고 사용자 에 게 도 간단 하 다.
그리고 단점:라 이브 러 리 를 기반 으로 하기 때문에 병행 하 는 입도 가 매우 굵 습 니 다.현재 많은 회사 의 구 조 는 라 이브 러 리 인 스 턴 스 입 니 다.이런 구조 에 대해 5.6 의 병행 복 제 는 어 쩔 수 없습니다.물론 주 된 일의 우선 순위 도 있 고 5.6 에 도 큰 문제 다.
말 이 많 지 않 으 니 그림 을 한 장 찍 어 라
4.MySQL 5.7 group commt 기반 병렬 복사
slave-parallel-type=LOGICAL_CLOCK:Commit-Parent-Based 모드(같은 그룹의 업무[last-commt 동일],잠 금 충돌 이 없습니다.같은 그룹,충돌 이 없 을 것 입 니 다.그렇지 않 으 면 같은 그룹 이 될 수 없습니다)
slave-parallel-type=LOGICAL_CLOCK:Lock-Based 모드(같은 그룹의 업무 가 아니 더 라 도 업무 간 에 잠 금 충돌[prepare 단계]이 없 으 면 동시 다발 할 수 있 습 니 다.같은 그룹 이 아 닙 니 다.N 개의 사무 prepare 단계 만 겹 칠 수 있다 면 잠 금 충돌 이 없 음 을 의미 합 니 다)
group commt,이전 글 에 대한 상세 한 설명 이 있 습 니 다.여 기 는 설명 이 많 지 않 습 니 다.MySQL 5.7 은 그룹 에서 제출 할 때 각 그룹의 업무 에 표 시 를 하기 도 했 는데 지금 생각해 보면 MTS 를 편리 하 게 진행 하기 위 한 것 이 아 닐 까 합 니 다.
저희 가 먼저 binlog 를 보 겠 습 니 다.
last_committed=0 sequence_number=1
last_committed=1 sequence_number=2
last_committed=2 sequence_number=3
last_committed=3 sequence_number=4
last_committed=4 sequence_number=5
last_committed=4 sequence_number=6
last_committed=4 sequence_number=7
last_committed=6 sequence_number=8
last_committed=6 sequence_number=9
last_committed=9 sequence_number=10
4.1 Commit-Parent-Based 모드4.2 잠 금 기반 모드
5.MySQL 8.0 write-set 기반 병렬 복사
메 인 키 기반 충돌 검출(binlogtransaction_depandency_tracking = COMMIT_ORDERE|WRITESET|WRITESET_SESSION,수 정 된 row 의 메 인 키 나 비어 있 지 않 은 키 만 충돌 하지 않 으 면 병행 할 수 있 습 니 다)
5.7.22 도 write-set 메커니즘 을 지원 했다.
사무 의존 관계:
COMMIT_ORDERE:그룹 기반 제출 방식 계속
WRITESET:쓰기 집합 기반 사무 의존 결정
WRITESET_SESSION:쓰기 집합 을 기반 으로 하지만 같은 session 의 사 무 는 같은 last 가 없습니다.committed
사무 검출 알고리즘:
binlog_transaction_depandency_tracking = COMMIT_ORDERE|WRITESET|WRITESET_SESSION
MySQL 은 제출 한 트 랜 잭 션 HASH 값 을 저장 하 는 변수 가 있 습 니 다.제출 한 모든 사무소 에서 수정 한 메 인 키(또는 유일한 키)의 값 은 hash 를 거 친 후에 그 변수의 집합 과 비교 하여 줄 이 충돌 하 는 지 판단 하고 이 를 통 해 의존 관 계 를 확인 합 니 다.여기 서 말 하 는 변 수 는 이 설정 을 통 해 크기 를 설정 할 수 있 습 니 다:binlogtransaction_dependency_history_size
이러한 입 도 는 row 단계 에 이 르 렀 습 니 다.이때 병행 하 는 입도 가 더욱 정교 하고 병행 하 는 속도 가 빠 를 것 입 니 다.어떤 경우 에는 slave 의 병행 도가 master 를 뛰 어 넘 는 것 도 지나 치지 않 습 니 다(master 는 단일 스 레 드 의 쓰기 이 고 slave 도 병행 재생 할 수 있 습 니 다)
6.어떻게 슬 레이 브 의 병행 복사 와 master 의 업무 수행 순서 가 일치 합 니까?
5.7.19 이후 설치 가능
transaction_write_set_extraction = OFF| XXHASH64 | MURMUR32
공식 설명: For multithreaded slaves, enabling this variable ensures that transactions are externalized on the slave in the same order as they appear in the slave's relay log.
Setting this variable has no effect on slaves for which multithreading is not enabled.
All replication threads (for all replication channels if you are using multiple replication channels) must be stopped before changing this variable.
--log-bin and --log-slave-updates must be enabled on the slave.
In addition --slave-parallel-type must be set to LOGICAL_CLOCK.
Once a multithreaded slave has been started, transactions can begin to execute in parallel.
With slave_preserve_commit_order enabled, the executing thread waits until all previous transactions are committed before committing.
While the slave thread is waiting for other workers to commit their transactions it reports its status as Waiting for preceding transaction to commit.
대체적으로 실현 원 리 는 excecution 단계 에서 병행 할 수 있 고 binlog flush 일 때 순서대로 진행 하 는 것 이다.엔진 층 제출 시 binlogorder_commt 도 줄 서기 순서 완성.
이 인 자 를 설정 하면 master 가 어떻게 병행 하 는 지,slave 는 어떻게 병행 하 는 지 하 는 것 이다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL에서 JSON 인덱싱 - aarondfrancis사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 말하지만 완전히 정확하지는 않습니다. MySQL로 JSON 열을 인덱싱하는 것은 완전히 가능합니다! 사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.