이 기사에서는 MySQL의 마스터-슬레이브 지연 처리 솔루션에 대한 관련 지식을 제공합니다. MySQL 마스터-슬레이브 복제 및 읽기-쓰기 분리는 인터넷에서 일반적인 데이터베이스 아키텍처입니다. 이 아키텍처에서 가장 비판받는 부분은 데이터의 양입니다. 동시성이 많은 시나리오에서는 마스터-슬레이브 지연이 더욱 심각해집니다. 모두에게 도움이 되기를 바랍니다.
마스터-슬레이브 지연이 왜 그렇게 큰가요?
답변: MySQL은 단일 스레드를 사용하여 RelayLog를 재생합니다.
재생 시간을 어떻게 최적화하고 단축해야 할까요?
답변: RelayLog의 다중 스레드 병렬 재생은 시간을 단축할 수 있습니다.
RelayLog의 다중 스레드 병렬 재생에 어떤 문제가 있나요?
답변: 여러 데이터베이스 인스턴스와 여러 스레드가 불일치 없이 병렬로 RelayLog를 재생할 수 있도록 RelayLog를 분할하는 방법을 고려해야 합니다.
왜 불일치가 있나요?
RelayLog가 다른 재생 스레드에 무작위로 할당된 경우 RelayLog에 세 개의 직렬 수정 레코드가 있다고 가정합니다.
update account set Money=100 where uid=58;
update account set Money= 150 where uid=58;
update account set Money=200 where uid=58;
단일 스레드 직렬 재생의 경우: 모든 슬레이브 라이브러리와 메인 라이브러리의 실행 순서가 일관되도록 보장할 수 있습니다.
음성: 최종 금액은 200입니다.
재생에 여러 스레드가 무작위로 할당된 경우: 여러 재생 스레드가 이 세 가지 문을 동시에 실행하면 누가 마지막으로 실행했는지 확실하지 않으며 최종 슬레이브 데이터베이스 데이터는 마스터 데이터베이스와 다를 수 있습니다.
음성 해설: 여러 개의 노예 도서관에 100, 150, 200의 돈이 있을 수 있지만 확실하지 않습니다.
일관된 데이터를 얻기 위해 여러 슬레이브 라이브러리와 여러 스레드를 배포하고 재생하는 방법은 무엇입니까?
답변: 동일한 라이브러리에 대한 쓰기 작업의 경우 동일한 스레드를 사용하여 RelayLog를 재생하고, 다른 라이브러리에 대한 쓰기 작업의 경우 여러 스레드를 사용하여 RelayLog를 동시에 재생할 수 있습니다.
어떻게 하나요?
해시 알고리즘, hash(db-name) % thread-num을 설계하고 라이브러리 이름을 해시한 다음 스레드 수를 조정하면 동일한 라이브러리에 대한 쓰기 작업을 쉽게 처리할 수 있습니다. 동일한 재생 스레드가 순차적으로 실행됩니다.
음성 해설: 여러 라이브러리의 재생이 병렬로 이루어지므로 재생 속도가 빨라집니다.
이 계획의 단점은 무엇입니까?
답변: 많은 회사에서 MySQL에 "여러 테이블이 있는 단일 데이터베이스"를 사용합니다. 이 경우에도 데이터베이스는 하나뿐이므로 RelayLog의 재생 속도는 향상될 수 없습니다.
계몽: "단일 데이터베이스 및 다중 테이블"의 DB 아키텍처 모델을 "다중 데이터베이스 및 다중 테이블"의 DB 아키텍처 모델로 업그레이드합니다.
음성 해설: 대량의 데이터와 대규모 동시성이 있는 인터넷 비즈니스 시나리오에서 "다중 데이터베이스" 모델은 다음과 같은 다른 많은 장점도 있습니다.
(1) 매우 편리한 인스턴스 확장: DBA는 다양한 라이브러리를 쉽게 확장하여
(2) 비즈니스에 따른 라이브러리 격리: 비즈니스 분리, 비즈니스 격리, 결합 및 상호 영향 감소
(3) 마이크로서비스를 분할하는 것은 매우 편리합니다. 자체 인스턴스
"단일 데이터베이스 및 다중 테이블" 시나리오에서 RelayLog의 다중 스레드 병렬 재생을 어떻게 최적화할 수 있습니까?
답변: 데이터베이스가 하나만 있어도 기본 데이터베이스에서 트랜잭션이 동시에 실행됩니다. 기본 데이터베이스에서 병렬로 실행될 수 있으므로 슬레이브 데이터베이스에서도 병렬로 실행될 수 있어야 합니까?
새로운 아이디어: 메인 데이터베이스에서 병렬로 실행되는 트랜잭션을 그룹으로 나누고 번호를 매깁니다. 슬레이브 데이터베이스에서 이러한 트랜잭션을 병렬로 실행할 수 있습니다(메인 데이터베이스의 트랜잭션 실행은 모두 준비 단계에 들어갑니다). 단계에서는 트랜잭션 간에 충돌이 없다는 점에 유의하십시오. 그렇지 않으면 커밋이 불가능합니다.) 예, 이것이 바로 MySQL이 수행하는 작업입니다.
해결책: GTID 기반 병렬 복제.
MySQL 5.7부터 그룹이 제출한 정보는 GTID에 저장됩니다. mysqlbinlog 도구를 사용하면 그룹 제출 내부 정보를 볼 수 있습니다.
20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=1 20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=2 20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=3 20181014 23:52 server_id 58 XXX GTID last_committed=0 sequence_numer=4
원래 로그와 비교하면 last_committed가 더 많습니다. 및 시퀀스_번호.
last_committed란 무엇인가요?
답변: 트랜잭션 제출 시 마지막으로 제출된 트랜잭션의 번호입니다. 동일한 last_committed가 있으면 그룹에 속해 동시에 재생할 수 있다는 의미입니다.
요약
마스터-슬레이브 동기화 지연을 단축하는 방법인 MySQL 병렬 복제는 다음 아키텍처 아이디어 중 일부를 구현합니다.
멀티 스레딩은 실행 시간을 단축하는 일반적인 방법입니다.
음성 해설: 예를 들어 많은 crontab은 멀티스레딩을 사용하여 데이터를 분할하고 병렬로 실행할 수 있습니다.
멀티 스레드가 작업을 동시에 디스패치하는 경우 멱등성이 보장되어야 합니다. MySQL은 "라이브러리에 따른 멱등성"과 "commit_id에 따른 멱등성"이라는 두 가지 방법을 제공합니다.
음성 해설: 예를 들어 그룹 메시지 group_id를 기반으로 할 수 있으며 사용자 메시지는 user_id에 따라 멱등성을 가질 수 있습니다.
MySQL 마스터-슬레이브 동기화 지연 관련:
mysql5.5: 병렬 복제는 지원되지 않습니다. 모든 사람이 MySQL 버전을 업그레이드해야 합니다.
mysql5.6: 라이브러리에 따라 병렬 복제를 사용하는 것이 좋습니다. "다중 데이터베이스" 아키텍처;
mysql5 .7: GTID에 따른 병렬 복사
추천 학습: mysql 비디오 튜토리얼
위 내용은 MySQL 마스터-슬레이브 지연에 대한 솔루션에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!