MySql 주종 복제 실현 원리 및 설정

데이터베이스 읽 기와 쓰기 분 리 는 대형 시스템 이나 방 문 량 이 높 은 인터넷 응용 에 있어 없어 서 는 안 될 중요 한 기능 이다.MySQL 에 있어 표준 적 인 읽 기와 쓰기 분 리 는 주종 모드 이 고 하나의 쓰기 노드 Master 뒤에 여러 개의 읽 기 노드 가 따라 다 니 며 읽 기 노드 의 수량 은 시스템 의 압력 에 달 려 있 으 며 보통 1-3 개의 읽 기 노드 의 설정 이다.한편,일반적인 읽 기와 쓰기 분리 중간 부품,예 를 들 어 Mycat 의 읽 기와 쓰기 분리 와 자동 전환 메커니즘 은 mysql 의 주종 복제 메커니즘 의 협조 가 필요 하 다.

마스터 설정 에 주의 할 점
1.메 인 DB server 와 DB server 데이터베이스 버 전이 일치 합 니 다.
2.주 DB server 와 DB server 데이터베이스 데이터 이름 일치
3.메 인 DB server 에서 바 이 너 리 로 그 를 엽 니 다.메 인 DB server 와 DB server 에서 의 serverid 는 모두 유일한 MySQL 메 인 서버 설정 이 필요 합 니 다.
첫 번 째 단계:my.conf 파일 수정:
[my sqld]세그먼트 에 추가:

binlog-ignore-db=mysql

#       
log-bin=mysql-bin
//        ,   :statement/row/mixed
binlog_format=row
#      ID,   IP    
server-id=82
두 번 째 단계:my sql 서 비 스 를 다시 시작 합 니 다.
service mysql restart
세 번 째 단계:계 정 을 만 들 고 slave 에 권한 을 부여 합 니 다.
mysql>GRANT FILE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slavepw';
mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'slave'@'%' identified by 'slavepw';
일반적으로 루트 계 정 을 사용 하지 않 습 니 다.'%'는 모든 클 라 이언 트 가 연 결 될 수 있 음 을 나타 냅 니 다.계 정,비밀번호 가 정확 하면 구체 적 인 클 라 이언 트 IP 로 대체 할 수 있 습 니 다.예 를 들 어 192.168.145.226 등 으로 안전 을 강화 할 수 있 습 니 다.
새로 고침 권한
mysql> FLUSH PRIVILEGES;
STEP 4:master 상태 조회

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |   881 |       | mysql      |          |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
MySQL 서버 설정
첫 번 째 단계:my.conf 파일 수정
[my sqld]\#서버 에서 유일한 ID 를 가 져 옵 니 다.보통 IP 마지막 server-id=83 을 가 져 옵 니 다.
두 번 째 단계:서버 에서 설정
mysql>change master to master_host='192.168.11.82',master_port=3306,master_user='slave',master_password='slavepw',master_log_file='mysql-bin.000001',master_log_pos=881;
문장 중간 에 끊 기지 않도록 주의 하 세 요,masterport 는 my sql 서버 포트 번호(따옴표 없 음),masteruser 는 동기 화 작업 을 수행 하기 위 한 데이터베이스 계 정 입 니 다."881"은 따옴표 가 없습니다.(여기 881 은 show master status 에서 보 이 는 position 의 값 입 니 다.여기 my sql-bin.00001 은 file 에 대응 하 는 값 입 니 다.)
세 번 째 단계:서버 에서 복사 기능 시작
mysql>start slave;
네 번 째 단계:서버 에서 복사 기능 상 태 를 검사 합 니 다.
mysql> show slave status;
Slave_IO_실행:Yes//이 상 태 는 YES 여야 합 니 다
Slave_SQL_실행:Yes//이 상 태 는 YES 여야 합 니 다
비고:SlaveIO 및 SlaveSQL 프로 세 스 는 YES 상태 로 정상적으로 실행 되 어야 합 니 다.그렇지 않 으 면 모두 잘못된 상태 입 니 다.(예 를 들 어 NO 는 모두 오류 입 니 다)
검증 을 진행 하 다
메 인 노드 에 표를 만 들 고 데 이 터 를 삽입 하면 노드 에서 도 표를 만 들 고 데 이 터 를 삽입 하 는 것 을 발견 할 수 있 습 니 다.
MySQL 의 주종 복제 원 리 는 무엇 입 니까?
주 라 이브 러 리 는 binlog 로 그 를 변경 하고 라 이브 러 리 에서 주 라 이브 러 리 로 연결 한 후 라 이브 러 리 에 IO 스 레 드 가 있 습 니 다.주 라 이브 러 리 의 binlog 로 그 를 자신의 로 컬 로 복사 하여 relay 중계 로그 에 기록 합 니 다.이 어 라 이브 러 리 에서 SQL 스 레 드 가 중계 로그 에서 binlog 를 읽 은 다음 에 binlog 로그 의 내용 을 실행 합 니 다.즉,자신의 로 컬 에서 SQL 을 다시 실행 하면 메 인 라 이브 러 리 의 데이터 와 같 음 을 보증 할 수 있 습 니 다.
여기 서 매우 중요 한 것 은 라 이브 러 리 에서 메 인 라 이브 러 리 데 이 터 를 동기 화 하 는 과정 이 직렬 화 된 것 이다.즉,메 인 라 이브 러 리 에서 병행 하 는 작업 은 라 이브 러 리 에서 직렬 로 실 행 될 것 이다.그래서 이것 은 매우 중요 한 점 이다.라 이브 러 리 에서 메 인 라 이브 러 리 에서 로 그 를 복사 하고 직렬 로 SQL 을 실행 하 는 특징 때문에 높 은 병행 장면 에서 라 이브 러 리 의 데 이 터 는 반드시 메 인 라 이브 러 리 보다 느 리 고 지연 이 있 을 것 이다.그래서 메 인 라 이브 러 리 에 기 록 된 데 이 터 는 읽 을 수 없 을 수도 있 고 몇 십 밀리초,심지어 몇 백 밀리초 가 지나 야 읽 을 수 있 습 니 다.
그리고 여기 서 또 다른 문 제 는 만약 에 메 인 라 이브 러 리 가 갑자기 다운 되 고 데이터 가 라 이브 러 리 에서 동기 화 되 지 않 으 면 일부 데 이 터 는 라 이브 러 리 에서 없 을 수도 있 고 일부 데 이 터 는 잃 어 버 릴 수도 있다 는 것 이다.
그래서 MySQL 은 실제 적 으로 이 블록 에 두 가지 메커니즘 이 있 는데 하 나 는 반 동기 복제 로 메 인 라 이브 러 리 데이터 손실 문 제 를 해결 하 는 데 사용 된다.하 나 는 동기 화 지연 문 제 를 해결 하기 위해 병렬 복사 입 니 다.
이 반 동기 복사 란semi-sync복사 라 고도 합 니 다.메 인 라 이브 러 리 가 binlog 로 그 를 쓴 후에 데 이 터 를 라 이브 러 리 에서 라 이브 러 리 로 동기 화하 도록 강제 합 니 다.라 이브 러 리 에서 로 그 를 자신의 로 컬 relay log 에 기록 한 다음 에 ack 을 메 인 라 이브 러 리 에 되 돌려 주 고 메 인 라 이브 러 리 에서 최소한 하나의 ack 를 받 은 후에 야 쓰기 작업 이 완료 되 었 다 고 생각 합 니 다.
병렬 복사 란 라 이브 러 리 에서 여러 스 레 드 를 열 고 relay log 의 서로 다른 라 이브 러 리 로 그 를 병렬 로 읽 은 다음 에 서로 다른 라 이브 러 리 로 그 를 병렬 로 재생 하 는 것 을 말 합 니 다.이것 은 라 이브 러 리 등급 의 병렬 입 니 다.
질문
동기 지연 문제 로 인 한 온라인 bug 를 전선 에서 확실히 처리 한 것 은 소형 생산 사고 에 속한다.
이 장면 이 야?어떤 학우 가 코드 논 리 를 이렇게 썼 다.먼저 데 이 터 를 삽입 한 후에 그것 을 찾 아 낸 후에 이 데 이 터 를 업데이트 합 니 다.생산 환경의 절정 기 에 쓰기 병발 이 2000/s 에 이 르 렀 는데 이때 주종 복제 지연 시간 은 대략 몇 십 밀리초 에 달한다.온라인 에서 매일 그런 데이터 가 있 는 것 을 발견 할 수 있 습 니 다.우 리 는 중요 한 데이터 상 태 를 업데이트 하 기 를 기대 하지만 절정 기 에는 업데이트 되 지 않 았 습 니 다.사용자 와 고객 센터 는 피드백 을 하고 고객 센터 는 우리 에 게 피드백 을 할 것 이다.
우 리 는 MySQL 명령 을 통 해:
show status
보기Seconds_Behind_Master라 이브 러 리 에서 메 인 라 이브 러 리 를 복사 하 는 데이터 가 몇 ms 뒤 처 진 것 을 볼 수 있 습 니 다.
일반적으로 주종 지연 이 심각 하면 다음 과 같은 해결 방안 이 있다.
라 이브 러 리 를 나 누 면 하나의 메 인 라 이브 러 리 를 여러 개의 메 인 라 이브 러 리 로 나 누 면 모든 메 인 라 이브 러 리 의 쓰기 와 병행 이 몇 배 줄 어 듭 니 다.이때 메 인 지연 은 무시 할 수 있 습 니 다.MySQL 이 지원 하 는 병렬 복 사 를 열 고 여러 라 이브 러 리 를 병렬 복사 합 니 다.만약 에 어떤 라 이브 러 리 의 기록 과 동시 다발 이 매우 높다 면 단일 라 이브 러 리 의 기록 과 동시 다발 은 2000/s 에 달 했 고 동시 복 제 는 의미 가 없다.코드 를 다시 쓰 고 코드 를 쓰 는 학생 은 신중 해 야 합 니 다.데 이 터 를 삽입 할 때 바로 조회 하지 못 할 수도 있 습 니 다.만약 존재 하 는 것 이 확실 하 다 면 반드시 먼저 삽입 해 야 한다.즉시 요구 하면 조회 한 다음 에 바로 일부 조작 을 반대로 실행 하고 이 조회 에 대해 메 인 라 이브 러 리 를 직접 설정 해 야 한다.이런 방법 을 추천 하지 않 는 다 면,네가 이렇게 하면 읽 기와 쓰기 가 분 리 된 의 미 를 잃 게 될 것 이다.병렬 복사 열기
다 중 스 레 드 복 제 를 시작 합 니 다.기본 관건 적 인 매개 변 수 는 두 가지 가 있 습 니 다.

mysql> show variables like 'slave_parallel_%';
+------------------------+----------+
| Variable_name     | Value  |
+------------------------+----------+
| slave_parallel_type  | DATABASE |
| slave_parallel_workers | 0    |
+------------------------+----------+
2 rows in set (0.00 sec)
slave-parallel-type 기본 값 은 database 입 니 다.
slave-parallel-workers 기본 값 은 0 입 니 다.
오픈:

mysql> stop slave sql_thread;

Query OK, 0 rows affected (0.05 sec)

mysql> set global slave_parallel_type='LOGICAL_CLOCK';

Query OK, 0 rows affected (0.00 sec)

mysql> set global slave_parallel_workers=4;

Query OK, 0 rows affected (0.00 sec)

mysql> start slave sql_thread;

Query OK, 0 rows affected (0.07 sec)
참고 자료:
https://www.jianshu.com/p/3932551e0221
https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/mysql-read-write-separation.md
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기