데이터베이스

InnoDB 스토리지 엔진 아키텍처

kimjy 2023. 2. 21. 22:09

프라이머리 키에 의한 클러스터링

  • 프라이머리 키는 다른 보조 인덱스에 비해 높은 비중
  • 다른 인덱스는 프라이머리 키를 논리적인 주소로 활용

외래키

  • 외래키 지원함
  • 다만 데이터의 수정이 다른 테이블로 전파되므로, 데드락 등의 잠금이 발생할 가능성이 큼

MVCC

  • 멀티버전: 하나의 레코드에 여러 개의 버전이 동시에 관리
  • 목적: 잠금을 사용하지 않는 일관된 읽기 제공
  • 레코드가 트랜잭션 중에 읽기 요청이 발생할 경우, 격리 수준에 따라 제공되는 값이 다름
    • READ_UNCOMMITED: 트랜잭션에 의해 변경된 값을 반환
    • REPEATABLE_READ, SERIALIZABLE: 트랜잭션 이전의 값을 반환

잠금 없는 일관된 읽기

  • MVCC 기술을 이용해 트랜잭션 중이더라고 잠금 없이 읽기가 가능
  • 격리수준에 따라 읽기 명령의 값이 달라짐
  • 격리수준에 따라 언두 로그를 참조하는 명령어들이 많아질 수 있기 때문에, 트랜잭션이 실행되면 최대한 빨리 롤백이나 커밋을 수행하는 것이 좋음

자동 데드락 감지

  • 데드락 상태를 확인하기 위하여 잠금 대기 목록을 그래프(wait-for-List) 형태로 관리
  • 데드락 감지 스레드가 주기적으로 잠금 대기 그래프를 검사하고, 데드락에 빠진 트랜잭션 중 하나를 종료함
    • 이 때 언두로그 양을 제일 적게 갖고있는 트랜잭션을 종료
    • 실행해야 할 언두 명령어가 가장 적으므로 서버의 부하를 줄이기 위함임
  • 데드락 감지 스레드는 잠금 목록을 검사해야하기 때문에 리스트를 잠그고 데드락 스레드를 검사
    • 따라서 그동안 작업을 수행할 다른 스레드는 작업 수행 불가
  • 이를 위해 innodb_deadlock_detect 시스템 변수를 제공하여 off로 설정할 시 데드락 감지 스레드는 작동하지 않음
    • 이 경우에는 데드락 때문에 서버가 멈출 가능성이 큼
    • 이를 위해 innodb_lock_wait_timeout이 있어서 데드락 상황에서 일정 시간이 지나면 자동으로 요청을 실패하고 에러메세지를 반환하게 됨

자동화된 장애 복구

  • 기본적으로 MySQL 서버가 실행될 때 항상 자동 복구 수행
  • 자동 복구가 불가능한 경우 복구를 멈추고 MySQL 서버를 강제종료
    • innodb_force_recovery 시스템 변수를 설정해서 MySQL 서버를 시작해야 함

InnoDB 버퍼 풀

  • InnoDB 스토리지 엔진의 가장 핵심적인 부분. 디스크의 데이터파일이나 인덱스 정보를 메모리에 캐시해두는 공간
  • 이를 통해 디스크 작업 횟수를 줄일 수 있음

버퍼 풀의 크기 설정

  • 버퍼 풀은 동적으로 설정이 가능하며, 이렇게 설정하는 것이 효율적일 것
  • 또한 버퍼 풀 설정은 비싼 작업이므로, 데이터베이스의 작업이 많지 않을 때 설정할 것

버퍼 풀의 구조

  • 버퍼풀은 페이지 단위로 관리
  • 버퍼풀에 캐시된 데이터는 포인터로 관리
  • 포인터는 링크드 리스트로 관리
  • 오랫동안 사용하지 않은 데이터는 버퍼풀에서 삭제

버퍼 풀 상태 백업 및 복구

  • MySQL 5.5 이전 버전에서는 MySQL 서버가 재시작되면 버퍼풀이 초기화
  • 캐시 데이터가 삭제되었으므로, 워밍업에 시간이 소비
  • 이 후 버전부터는 버퍼 풀 덤프 및 적재 기능이 추가되어 이러한 상황 방지

언두로그

  • InnoDB 스토리지 엔진은 트랜잭션과 격리 수준을 보장하기 위해 DML로 변경되기 이전 버전의 데이터를 별도로 백업, 이 데이터를 언두로그라고 함
  • 언두 로그의 데이터는 두가지 용도로 사용
    • 트랜잭션이 롤백 대비용
    • 트랜잭션의 격리 수준을 유지하면서 동시성 유지

언두 테이블스페이스

  • 언두 로그가 저장되는 공간을 언두 테이블스페이스라고 함
  • 언두 테이블 스페이스의 크기에 따라서 사용가능한 트랜잭션 개수가 달라짐

리두 로그 및 로그 버퍼

  • 리두 로그는 ACID 요소 중 D와 관계
  • 리두 로그는 하드웨어나 소프트웨어 등의 문제로 인해 서버가 비정상적으로 종료되었을 때 데이터 파일에 기록되지 못한 데이터를 분실하지 않게 함
  • 리두 로그는 기본값이 16MB이나, BLOB이나 TEXT와 같이 데이터가 자주 변경되는 경우에는 더 크게 설정하는 것이 좋음

어댑티브 해시 인덱스

  • InnoDB 스토리지 엔진은 자주 읽히는 데이터 페이지의 키 값을 이용해 해시 인덱스를 만들고, 필요할 때 해시 인덱스를 활용
  • 다만 데이터 페이지의 키 값을 읽어오는 까닭으로 값을 디스크에서 가져오는 경우에는 큰 도움이 되지 않음

'데이터베이스' 카테고리의 다른 글

MySQL 아키텍처  (0) 2023.02.06