MySQL 아키텍처 - InnoDB 스토리지 엔진 아키텍처

mimdong·2022년 8월 16일
0

InnoDB 스토리지 엔진의 주요 특징에 대해 정리

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

  • 프라이머리 키 값의 순서대로 디스크에 저장
  • 프라이머리 키가 클러스터링 인덱스이므로 프라이머리 키를 이용한 레인지 스캔이 빨리 처리 됨

MVCC(Multi Version Concurrency Control)

  • 잠금을 사용하지 않는 일관된 읽기를 제공(즉, InnoDB에서 읽기 작업은 다른 트랜잭션이 가지고 있는 잠금을 기다리지 않고 읽기 작업이 가능)
  • 언두 로그(Undo log)를 이용하여 하나의 레코드에 대해 여러 개의 버전을 동시에 관리하여 이 기능 구현
  • transaction_isolation에 설정된 격리 수준에 따라 레코드 조회 값이 달라진다.

자동 데드락 감지
잠금 대기 목록을 관리

  • 잠금이 교착 상태에 빠지지 않았는지 체크하기 위함
  • 교착 상태에 빠진 트랜잭션을 강제 종료하기도 함
    - 언두 로그 레코드를 적게 가진 트랜잭션이 강제종료(롤백)의 대상임 (트랜잭션 강제 롤백으로 인한 MySQL 서버의 부하도 덜 유발)
  • innodb_table_locks 활성화(권장)
    - InnoDB 스토리지 엔진은 테이블 잠금은 볼수가 없어서 데드락 감지가 불확실할 수도 있어서, 활성화 시 InnoDB 스토리지 엔진 내부의 레코드 잠금 뿐만아니라 테이블 레벨의 잠금까지도 감지 가능
  • innodb_deadlock_detect
    - 데드락 감지 스레드를 비활성화(innodb_deadlock_detect=OFF)하면 2개 이상의 트랜잭션이 상대방이 가진 잠금을 요구하는 상황(데드락 상황)이 발생해도 무한정 대기
  • innodb_lock_wait_timeout
    - 데드락 상황에서 일정 시간이 지나면 자동으로 요청이 실패하고 에러 메세지 반환
    • 데드락 감지 스레드가 부담되어 데드락 감지 스레드를 비활성화하여 사용하는 경우 기본값(50초)보다 훨씬 낮은 시간으로 변경해서 사용해야 한다.

자동화된 장애 복구
innodb_force_recovery 값을 통해 장애의 자동복구를 수행

InnoDB 버퍼 풀
InnoDB 스토리지 엔진에서 가장 핵심!!!

  • 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해 두는 공간
  • 쓰기 작업을 지연시켜 일괄적으로 처리할 수 있게 해주는 버퍼 역할
    [버퍼 풀의 크기]
  • InnoDB 버퍼 풀 크기 : 전체 물리 메모리의 50%로 설정 후, 조금씩 올려가며 최적점을 찾는다.
  • 레코드 버퍼(각 클라이언트 세션에서 테이블의 레코드를 읽고 쓸 때 버퍼로 사용하는 공간)가 메모리를 상당히 사용, 레코드 버퍼 공간은 설정할 수 없고, 동적으로 해제되기도 하므로 정확히 필요한 메모리 공간의 크기를 계산할 수 없다.
  • innodb_buffer_size로 조절
    - 크리티컬한 변경이므로 서버가 한가한 시점을 골라서 진행
    • 상향하는 건 시스템 영향도가 크지 않으나 하향하는 것은 서비스 영향도가 매우 크므로 가능하면 하향하는 작업은 하지 않는 것이 좋다.
    • 128MB 청크 단위로 쪼개어 관리되며 처리
  • innodb_buffer_pool_instances
    - 버퍼 풀을 여러개로 분리하여 관리
    - 버퍼 풀에 할당할 메모리 < 1GB : 값 1
    - 버퍼 풀에 할당할 메모리 <= 40GB : 값 8(Default)
    - 버퍼 풀에 할당할 메모리 > 40GB : 버퍼 풀 인스턴스당 5GB가 되게 개수 설정
    [버퍼 풀의 구조]
  • innodb_page_size
    - 버퍼 풀이라는 거대한 메모리 공간을 페이지 크기의 조각으로 쪼개어 InnoDB 스토리지 엔진이 데이터를 필요로 할 때 해당 데이터 페이지를 읽어서 각 조각에 저장
    • 디스크의 내부 섹터 크기와 일치하는 페이지 크기를 사용하는 것이 좋습니다. 초기 세대 SSD 장치의 섹터 크기는 4KB인 경우가 많습니다. 일부 최신 장치의 섹터 크기는 16KB입니다. 기본 InnoDB 페이지 크기는 16KB입니다. 페이지 크기를 저장 장치 블록 크기에 가깝게 유지하면 디스크에 다시 쓰여지는 변경되지 않은 데이터의 양이 최소화됩니다.

버퍼 풀 플러시
InnoDB 스토리지 엔진은 버퍼 풀에서 아직 디스크로 기록되지 않은 더티 페이지들을 성능상의 악영향 없이 디스크에 동기화하기 위해 2개 플러시 기능을 백그라운드로 실행

  • 플러시 리스트(Flush_list) 플러시
  • LRU 리스트(LRU_list) 플러시

플러시 리스트 플러시

  • 리두 로그 공간의 재활용을 위해 주기적으로 오래된 리두 로그 엔트리가 사용하는 공간을 비워야 함
  • 오래된 리두 공간이 지워지려면 InnoDB 버퍼 풀의 더티 페이지가 먼저 디스크로 동기화해야 한다.
  • 플러시 리스트 플러시 함수를 호출하여 플러시 리스트에서 오래전에 변경된 데이터 페이지 순서대로 디스크에 동기화
  • 더티 페이지를 디스크에 동기화할 때 서비스에 영향도를 조절하는 아래 시스템 변수
    - innodb_page_cleaners : innodb_buffer_pool_instances 설정값과 동일하게 설정하자.
profile
기록이 필요한 사람 입니다.

0개의 댓글