-
2021.09.11 기록장TIL 2021. 9. 11. 00:43
ToDo
- 알고리즘 문제 풀기
- 책 읽기
Done
- 책 읽기
Weekly goal
- 책 읽기
1. db 풀은 동적으로 어떻게 증가시킬 것인가?
real mysql
InnoDB 스토리지 엔진 아키텍처
100p. MVCC (multi version concurrency control)
하나의 레코드가 여러 개의 버전을 가지고 있는 것이다.
예로 insert 문장이 commit 되면
데이터 베이스의 상태는 다음과 같다.
버퍼에 있다가 백그라운드 스레드에 의해 디스크에 쓰인다.
백그라운드 스레드는 커밋 여부에 상관없이 일정한 간격을 두고 작동된다.
근데 여기서 update 문이 실행된다면?
update문이 실행되고의 모습이다.
버퍼 풀에는 바로 적용이 된다. 디스크에는 백그라운드 스레드가 언제 동작할지 모르기에 확실한 값은 알 수 없다.
update이전의 값은 언두 로그에 저장이 되고 이제 isolation 레벨에 맞춰서 값을 넘겨줄 것이다.
uncommitted일 경우에는 버퍼에 있는 값이 나가겠지만 나머지 read_committed나 repearable_read, serializable 등의 경우는 커밋되기 전의 모습인 언두의 모습이 나갈 것이다.
이를 MVCC라고 표현한다.
이제 커밋이 되면 버퍼 풀에 있는 값은 디스크에 써지고 롤백이 되면 언두에 있는 값이 버퍼 풀에 써진다.
InnoDB는 MVCC를 통해 트랜잭션이 단순히 select만 하고 수정하지 않는다면 언두를 이용해서 락 없이 일관된 데이터를 보내준다.
104p. 자동 데드락 감지
데드락은 서로의 자원을 원할 때 발생할 수 있다.
InnoDB는 자체적으로 데드락 감지 스레드가 존재한다.
이들은 잠금 대기 목록을 그래프 형태로 관리하며 이 그래프를 주시한다.
그러다 교착상태에 빠진 트랜젝션이 있다면 종료를 시킨다.
이때 어느 트랜잭션을 먼저 종료시킬지는 언두 로그의 양으로 판단을 한다. 적은 언두 로그가 있으면 그 트랜잭션을 종료한다. 꼬리가 그래야 롤백을 해도 언두 처리를 할 내용이 줄어들기 때문이다.
이 데드락 감지 스레드는 MySQL 엔진이 관리하는 테이블 잠금은 볼 수가 없는데 그래서 데드락 처리를 덜 효율적으로 할 수밖에 없다. 그래서 이 시스템 변수를 활성화해서 레코드 감지뿐 아니라 테이블 감지도 할 수 있도록 하는 것이 좋다.
108p. innoDB 버퍼 풀
innoDB 스토리지 엔진에서 가장 핵심적인 부분으로 단순히 사용자의 요청을 미리 모아두는 것이 아닌
디스크의 데이터나 인덱스 정보를 캐시 해 주는 역할도 한다.
110p. 버퍼 풀
버퍼 풀은 3가지의 자료구조로 나타낼 수 있다. LRU(Least Recently Used), Flush 리스트, Free 리스트
Free 리스트는 디스크에서 새로운 값을 읽어와야 하는 경우 사용
LRU는 MRU(Most Recently Used) 리스트와 LRU가 결합된 상태라고 이해하면 된다. 이들은 캐시라고 생각하면 되는데 전자는 오래된 게 들어있고 후자는 최근에 읽어온 게 들어있다. 접근할 때마다 age는 초기화되고 접근이 되지 않으면 age는 점차 늘어나 삭제가 된다.
Flush는 데이터의 변경이 있는 데이터 페이지(더티 페이지)를 저장한다. 특정 시점이 되면 디스크에 쓰인다.
데이터가 변경이 될 때 innoDB는 변경 내용을 리두 로그에 기록하고 버퍼 풀의 데이터 페이지에도 변경 내용을 반영한다.
112p. 리두 로그와 버퍼 풀
리두 로그는 변경 이력을 저장해 놓는다
리두 로그는 1개 이상의 고정 크기 파일을 연결해서 순환 고리처럼 사용한다.
즉 계속 덮어 씌우는 작업을 한다는 것이다. 근데 덮어써지지 않게 하는 공간이 있는데 이를 활성 리두 로그라고 한다.
innoDB는 주기적으로 체크포인트 이벤트를 발생시켜 리두 로그와 버퍼 풀의 더티 페이지를 디스크로 동기화하는 작업을 한다.
리두의 공간들을 재활용하기 위해서는 더티 페이지가 디스크에 써져야 하고 이 더티 페이지는 플러시 리스트에 들어가 있다. 이를 디스크에 쓰기 위해 플러시 리스트 플러시를 백그라운드에서 돌려서 디스크에 동기화시킨다.
'TIL' 카테고리의 다른 글
2021.09.14 기록장 (0) 2021.09.14 2021.09.12 기록장 (0) 2021.09.11 2021.09.10 기록장 (0) 2021.09.09 2021.09.09 기록장 (0) 2021.09.05 2021.09.05 기록장 (0) 2021.09.04