[MongoDB] 인덱스 빌드 프로세스

So yeong Choe·2022년 2월 5일
1

MongoDB

목록 보기
1/2
post-thumbnail

본 포스트는 MongoDB 4.2 공식 도큐먼트를 정리한 문서입니다.
https://docs.mongodb.com/v4.2/core/index-creation/#index-build-process

1) X Lock

컬렉션에 인덱스가 생성될 때 mongod는 exclusive X lock을 얻는다.
이 lock은 컬렉션의 (복제 쓰기 작업이나 메타데이터 커맨드를 포함한) 모든 읽기/쓰기를 차단한다.
mongod는 이 lock을 다른 프로세스에 내어주지(yield) 않는다.

2) 초기화

mongod는 이 단계에서 3가지의 데이터 구조를 생성한다.

  • 초기 인덱스 메타데이터 entry
  • 임시 테이블 side writes table: 빌드 프로세스 중에 컬렉션에 write가 발생하면, 이 때 생성되는 키를 저장해둔다.
  • 임시 테이블 constraint violation table: 중복 키 제약조건을 위반할 수 있는 모든 도큐먼트들을 저장해둔다.

3) X Lock → IX Lock

mongod는 exclusive X collection lock을 intent exclusive IX lock으로 다운그레이드 한다.
mongod는 주기적으로 이 lock을 읽기/쓰기 작업을 위해 내어준다.(yield)

4) 컬렉션 스캔

mongod는 컬렉션의 각 도큐먼트에 대한 key를 생성한 후 externcal sorter에 덤프한다.

컬렉션을 스캔하며 key를 생성하던 중 중복 키 에러가 발생하면, key는 constraint violation table에 저장되어 나중에 처리된다.
그 외 다른 에러가 발생하는 경우 인덱스 빌드는 에러와 함께 실패한다.

mongod가 컬렉션 스캔을 완료하면, 정렬된 key들을 index로 덤프한다.

5) Side Writes Table 처리

mongod는 FIFO 우선순위를 사용하여 side write table의 데이터들을 비운다.

이 때 중복 키 에러가 발생하면 마찬가지로 constraint violation table에 저장되어 나중에 처리되며, 그 외 에러가 발생하면 인덱스 빌드가 실패한다.

이 과정 중 컬렉션에 write된 각 도큐먼트들은, mongod가 key를 생성하여 side write table에 저장한 후 나중에 처리한다. (이것을 Temporary Side Writes Table이라고 지칭하자.)
mongod는 스냅샷 시스템을 사용하여 처리할 key 개수에 대한 limit를 설정한다.

6) IX Lock → S Lock

mongod는 intent exclusive IX collection lock을 shared S lock으로 업그레이드한다.
이 lock은 컬렉션의 (복제 쓰기 작업과 메타데이터 커맨드를 포함한) 모든 쓰기 작업을 차단한다.

7) Temporary Side Writes Table 처리

mongod는 side writes table에 남아있는 데이터들을 이어서 비운다.
이 과정을 수행할 때 replication은 잠시 중단된다.

이 때 중복 키 에러가 발생하면 마찬가지로 constraint violation table에 저장되어 나중에 처리되며, 그 외 에러가 발생하면 인덱스 빌드가 실패한다.

8) S Lock → X Lock

mongod는 shared S collection lock을 exclusive X lock으로 업그레이드한다.
이 lock은 컬렉션의 (복제 쓰기 작업이나 메타데이터 커맨드를 포함한) 모든 읽기/쓰기를 차단한다.
mongod는 이 lock을 다른 프로세스에 내어주지(yield) 않는다.

9) Side Write Table 드랍

mongod는 side write table에 남아있는 작업들을 모두 적용한 후 드랍한다.

이 때 중복 키 에러가 발생하면 마찬가지로 constraint violation table에 저장되어 나중에 처리되며, 그 외 에러가 발생하면 인덱스 빌드가 실패한다.

이 시점에서, 인덱스는 컬렉션의 모든 데이터에 대한 key를 갖게 된다.

10) Constraint Violation Table 처리

mongod는 FIFO 우선순위를 사용하여 constraint violation table을 비운 후 드랍한다.

constraint violation table의 key에서 여전히 중복 키 에러가 발생하면, 해당 컬렉션은 드랍되며 인덱스 빌드는 에러와 함께 중단된다.

(IX lock 상태에서 중복 키 에러가 발생한 key들을 따로 빼둔 후, X lock 상태에서 다시 처리하기 위한 과정으로 보인다.)

11) 인덱스를 Ready 상태로 표시

mongod는 이 인덱스를 사용할 수 있도록 메타데이터를 수정한다.

12) X Lock 해제

mongod는 컬렉션에 대한 X lock을 해제한다.

profile
IT 공부하는 블로그

2개의 댓글

comment-user-thumbnail
2023년 10월 8일

v4.4 인덱스 빌드 프로세스도 해주세요:)

답글 달기
comment-user-thumbnail
2023년 10월 8일

v4.4 인덱스 빌드 프로세스도 해주세요:)

답글 달기