4.1.2 MySQL 스레딩 구조

박상준·2024년 3월 15일
1

mysql

목록 보기
2/8
post-custom-banner

개요

  • MySQL 은 프로세스 기반이 아니라, 스레드 기반으로 작동한다.

  • 크게 2가지 유형의 스레드로 구분함.

    1. 포그라운드 스레드 (Foreground Threads)

      1. 사용자의 요청을 직접 처리한다.
      2. 커넥션 연결 및 스레드 캐시 관리 등을 담당한다.
    2. 백그라운드 스레드
      1. 데이터 파일, 로그 파일, 캐시 및 버퍼 관리 등의 백엔드 작업 수행
      2. 로그 버퍼 - 디스크 기록, 다양한 시스템 유지 관리 작업 수행함.

      스레드 확인방법

      SELECT thread_id, name, type, processlist_user, processlist_host
      FROM performance_schema.threads
      ORDER BY type, thread_id;

      스레드 모델 특징

    • 실제 사용자의 요청을 처리하는 포그라운드 스레드는 thread/sql/one_connection 이다.

    • 이런식으로 동일한 스레드가 여러개 있는 경우, 여러 스레드가 동일 작업을 병렬로 처리하는 설정때문임.

포그라운드 스레드 ( 클라이언트 스레드 )

정의

  • MySQL 서버에 접속된 각 클라이언트의 요청을 처리하는 스레
  • 클라이언트 사용자가 요청하는 쿼리 문장을 처리한다.
  • 작업 완료 후 커넥션을 종료하면 스레드 캐시로 반환됨

스레드 캐시 관리

  • 스레드 캐시는 재사용을 위하여 대기 중인 스레드를 관리함
  • thread_cache_size 시스템 변수를 통해 스레드 캐시에 유지할 수 있는 최대 스레드 지정 가능
  • 스레드 캐시에 일정 개수 이상의 스레드 있는 경우, 추가 스레드 종료시켜서 자원을 관리함.

데이터 처리

  • 데이터는 MySQL 의 데이터 버퍼캐시 에서 가져온다.
  • 버퍼나 캐시에 없는 경우, 디스크의 데이터나 인덱스 파일에서 직접 읽어옴
  • MyISAM 테이블
    • 포그라운드가 디스크 쓰기 작업까지 처리
  • InnoDB 테이블
    • 포그라운드 스레드는 데이터 버퍼나 캐시까지만 처리함.
    • 디스크까지 기록은 백그라운드 스레드가 처리함.

백그라운드 스레드

  • 역할
    1. 인서트 버퍼 병합 ( Insert Buffer Merging ) 스레드

      1. 비클러스터 인덱스에 대한 INSERT 작업을 더 효율적으로 만들기 위하여 인서트 버퍼를 사용한다.
      2. 해당 스레드는 인서트 버퍼에 저장된 변경사항을 실제 인덱스와 병합한다.

      이해를 돕기 위해..

      • DB 에는 인덱스 라는 정렬 규칙이 있음.

        인덱스

        • 책의 목차 와 같은 역할을 하고
        • 우리가 필요한 데이터를 빠르게 탐색 가능하다.
      • 비클러스터 인덱스와 인서트 버퍼

        비 클러스터 인덱스

        • 데이터가 저장된 순서와 별개

        • 특정 규칙에 따라 별도로 관리되는 인덱스

        • 예시
          - 책의 색인과 같이 본문의 순서와 상관없이 특정 단어가 어디에 있는지 빠르게 찾을 수 있게 해줌

          인서트 버퍼

        • 비클러스터 인덱스에 데이터를 추가하는 경우

        • 바로 인덱스를 업데이트하는 대신 임시로 저장해주는 공간

        • DB 성능을 향상시키기 위한 기술

      • 실생활로 따지면
        • 도서관에 책이 있고, 해당 책들을 바로 책장에 꽂는 대신, 일단 책을 도서관 입구에 임시로 쌓아둔다.
          • 인서트 버퍼
        • 그리고 나중에 도서관 직원이 해당 책을 적절한 책장에 꽂아 정리하는 형태
          • 인서트 버퍼 병합
    2. 로그 기록 스레드

      1. 트랜잭션 내구성을 보장하기 위해 변경 사항을 로그 파일에 저장
      2. 시스템 장애가 발생하여도 데이터를 복구할 수 있게 해준다
    3. 버퍼 풀 데이터 기록 스레드

      1. 메모리에 있는 버퍼 풀의 데이터를 주기적으로 디스크에 기록하여, 데이터의 영속성을 보장함
    4. 데이터 읽기 스레드

      1. 디스크에서 데이터를 읽어와, 버퍼 풀에 적재
      2. 데이터 접근 시간을 단축시키는데 도움
    5. 잠금 및 데드락 모니터링 스레드
      1. DB 잠금 상태를 모니터링
      2. 데드락 감지하여 해결함


    • InnoDB 스토리지 엔진에서 백그라운드 스레드는 DB 의 성능과 안정성을 유지하는 데 중요한 역할을 수행한다.

      스레드 설정

      • MySQL 5.5 이상부터 데이터 쓰기, 데이터 읽기 스레드 개수를 2개 이상으로 지정할 수 있게 됨.

      • 쓰기 스레드 설정의 경우

        • *innodb_write_io_threads*
        • 일반적인 내장 디스크의 경우 2 ~ 4 개의 스레드 유지해야함.
      • 읽기 스레드 설정의 경우
        - *innodb_read_io_threads*
        - 보통 클라이언트 ( 포그라운드 ) 스레드에서 처리하기에, 읽기 스레드 자체는 많이 설정 X

        데이터 처리 방식

      • InnoDB

        • 데이터 쓰기 작업은 지연(버퍼링) 가능성이 있음.
          • 일괄 처리를 통해 성능을 향상시킨다.
        • INSERT, UPDATE, DELETE 쿼리로 데이터가 변경되는 경우
          • 데이터가 디스크 데이터 파일로 완전히 저장될 때까지 기다리지 않아도 됨.
            • ***백그라운드 에서 처리하기 때문***
      • MyISAM

        • 사용자 스레드가 쓰기 작업까지 함께 처리하도록 설계
        • InnoDB 에 비해 쓰기에 제약이 있음
profile
이전 블로그 : https://oth3410.tistory.com/
post-custom-banner

0개의 댓글