복제 아키텍처
Mysql 서버에서 발생하는 변경사항(데이터, 데이터베이스 구조변경, 계정 권한변경 == 이벤트) 은 바이너리 로그 파일에 기록된다. 이때 바이너리 로그파일은 변경내역을 저장하는 파일이다. 이 바이너리 로그파일을 레플리카한테 보내서 릴레이로그라는 로컬디스크에 저장해두고 데이터에 반영시킨다.
동작 방식
- 트랜잭션 스레드가 데이터처리
- 레플리카 서버가 데이터 동기화를 위해 소스서버에 접속해서 바이너리 로그 보내달라함
- 바이너리 로그 덤프 스레드 생성
- 이벤트를 하나씩 락걸고 읽어서 레플리케이션 I/O 스레드한테 보내줌
- 레플리케이션 I/O 스레드는 바이너리 로그 덤프 스레드가 보내준 이벤트를 릴레이로그에 저장
- 상태는 SHOW REPLICA STATUS 로 볼 수 있음.
- SQL 스레드는 가져온 바이너리 로그를 레플리카 DB에 씀.(이때 I/O 스레드랑은 별개)
복제를 위한 정보
- 릴레이로그
- 커넥션 메타데이터
- 레플리케이션 I/O 스레드에서 소스서버에 연결할 때 사용하는 DB 커넥션 정보를 담고있다
- FILE, TABLE 기본값은 테이블
- 어플라이어 메타데이터
- SQL스레드에서 이벤트들 적용하는 컴포넌트 == 어플라이어
- 어플라이어가 최근 적용한 이벤트가 어디 저장되어있는지 릴레이로그 파일명, 파일내 위치정보
- 이거 보고 어디까지 했는지 본다음에 다음 이벤트들 적용한다
- FILE, TABLE 기본값은 테이블
기본값이 테이블인 이유?
레플리케이션 IO스레드랑 SQl스레드가 동작할때 동기화되지 않는 경우가 발생하기 때문이다.
- 레플리카서버가 비정상 종료되는 경우엔 바이너리로그위치와 파일저장위치가 일치하지 않을 수 있다
- 파일이 손상되는 경우도 있다
테이블이면 뭐가 좋은지?
테이블로 설정하면 InnoDB 설정으로 관리한다.
SQL 스레드가 트랜잭션 적용할때 slave relay log info 테이블도 아토믹하게 업데이트한다.
→ 크레시 세이프 복제