본 포스트는 MongoDB 4.2 공식 도큐먼트를 정리한 문서입니다.
https://docs.mongodb.com/v4.2/core/index-creation/#index-build-process
컬렉션에 인덱스가 생성될 때 mongod는 exclusive X lock을 얻는다.
이 lock은 컬렉션의 (복제 쓰기 작업이나 메타데이터 커맨드를 포함한) 모든 읽기/쓰기를 차단한다.
mongod는 이 lock을 다른 프로세스에 내어주지(yield) 않는다.
mongod는 이 단계에서 3가지의 데이터 구조를 생성한다.
mongod는 exclusive X collection lock을 intent exclusive IX lock으로 다운그레이드 한다.
mongod는 주기적으로 이 lock을 읽기/쓰기 작업을 위해 내어준다.(yield)
mongod는 컬렉션의 각 도큐먼트에 대한 key를 생성한 후 externcal sorter에 덤프한다.
컬렉션을 스캔하며 key를 생성하던 중 중복 키 에러가 발생하면, key는 constraint violation table에 저장되어 나중에 처리된다.
그 외 다른 에러가 발생하는 경우 인덱스 빌드는 에러와 함께 실패한다.
mongod가 컬렉션 스캔을 완료하면, 정렬된 key들을 index로 덤프한다.
mongod는 FIFO 우선순위를 사용하여 side write table의 데이터들을 비운다.
이 때 중복 키 에러가 발생하면 마찬가지로 constraint violation table에 저장되어 나중에 처리되며, 그 외 에러가 발생하면 인덱스 빌드가 실패한다.
이 과정 중 컬렉션에 write된 각 도큐먼트들은, mongod가 key를 생성하여 side write table에 저장한 후 나중에 처리한다. (이것을 Temporary Side Writes Table이라고 지칭하자.)
mongod는 스냅샷 시스템을 사용하여 처리할 key 개수에 대한 limit를 설정한다.
mongod는 intent exclusive IX collection lock을 shared S lock으로 업그레이드한다.
이 lock은 컬렉션의 (복제 쓰기 작업과 메타데이터 커맨드를 포함한) 모든 쓰기 작업을 차단한다.
mongod는 side writes table에 남아있는 데이터들을 이어서 비운다.
이 과정을 수행할 때 replication은 잠시 중단된다.
이 때 중복 키 에러가 발생하면 마찬가지로 constraint violation table에 저장되어 나중에 처리되며, 그 외 에러가 발생하면 인덱스 빌드가 실패한다.
mongod는 shared S collection lock을 exclusive X lock으로 업그레이드한다.
이 lock은 컬렉션의 (복제 쓰기 작업이나 메타데이터 커맨드를 포함한) 모든 읽기/쓰기를 차단한다.
mongod는 이 lock을 다른 프로세스에 내어주지(yield) 않는다.
mongod는 side write table에 남아있는 작업들을 모두 적용한 후 드랍한다.
이 때 중복 키 에러가 발생하면 마찬가지로 constraint violation table에 저장되어 나중에 처리되며, 그 외 에러가 발생하면 인덱스 빌드가 실패한다.
이 시점에서, 인덱스는 컬렉션의 모든 데이터에 대한 key를 갖게 된다.
mongod는 FIFO 우선순위를 사용하여 constraint violation table을 비운 후 드랍한다.
constraint violation table의 key에서 여전히 중복 키 에러가 발생하면, 해당 컬렉션은 드랍되며 인덱스 빌드는 에러와 함께 중단된다.
(IX lock 상태에서 중복 키 에러가 발생한 key들을 따로 빼둔 후, X lock 상태에서 다시 처리하기 위한 과정으로 보인다.)
mongod는 이 인덱스를 사용할 수 있도록 메타데이터를 수정한다.
mongod는 컬렉션에 대한 X lock을 해제한다.
v4.4 인덱스 빌드 프로세스도 해주세요:)