MongoDB에서 잠금

Bilal Shahid 2023년6월20일
  1. MongoDB에서 잠금
  2. MongoDB의 잠금 수준
  3. MongoDB의 잠금 모드
  4. MongoDB에서 잠금 상태 확인
  5. 결론
MongoDB에서 잠금

데이터베이스 관리 시스템에서 잠금 메커니즘은 전체 결과의 일관성을 보장합니다.

예를 들어, 데이터에 대해 일부 쓰기 프로시저가 수행되는 경우 읽기 명령을 동시에 실행할 수 없습니다. 이러한 상황에서 발생하는 데이터의 부정확성을 방지하기 위해 데이터베이스 리소스는 “잠금” 상태입니다.

MongoDB는 또한 여러 클라이언트가 동일한 데이터에 동시에 액세스하거나 수정할 수 있으므로 데이터 일관성을 보장하기 위해 잠금을 사용합니다. 이 기사에서는 MongoDB의 잠금 개념에 대해 설명합니다.

MongoDB에서 잠금

MongoDB의 잠금은 다른 관계형 데이터베이스 관리 시스템의 잠금과 다르게 작동합니다. MongoDB에서 잠금이 작동하는 방식을 설명하겠습니다.

MongoDB는 다중 세분화 잠금을 사용합니다. 즉, 글로벌, 데이터베이스 또는 컬렉션 수준 또는 개별 스토리지 엔진의 문서 수준에서도 프로세스를 잠글 수 있습니다.

이러한 잠금 수준은 문서에서 자세히 설명합니다. v2.2부터 최신 버전의 MongoDB에는 각 데이터베이스에 대한 판독기/기록기 래치가 있습니다.

이러한 리더/라이터 래치로 인해 데이터베이스 리소스에 대한 동시 액세스가 가능합니다. 이것이 어떻게 작동하는지 설명하겠습니다.

리더/라이터 래치

MongoDB의 리더/라이터 래치에는 다음 속성이 있는 것으로 가장 잘 설명할 수 있습니다.

  1. 다중독자입니다. 이는 데이터가 수정되지 않고 읽기만 되므로 데이터의 일관성에 영향을 주지 않고 여러 독자가 동시에 컬렉션에 액세스할 수 있음을 의미합니다.

  2. 싱글라이터입니다. 이는 데이터의 일관성을 보장하기 위해 한 번에 하나의 작성자만 있을 수 있음을 의미합니다.

  3. ‘작가 욕심’이다. 작가 욕심이 많다는 것은 작가가 독자보다 우선시된다는 뜻이다.

    따라서 작성자가 데이터베이스 사용을 요청하면 들어오는 모든 리더가 작업을 완료할 때까지 일시적으로 차단(또는 잠김)됩니다.

    그러나 작가는 현재 독자가 떠날 때까지 기다린다. 이 구현은 작성자가 무한정 기아 상태가 되는 것을 방지합니다.

참고: 리더/라이터 래치를 리더/라이터 잠금이라고 합니다. 그러나 가볍기 때문에 걸쇠라고 부르는 것이 더 적절합니다.

MongoDB에 이 래치가 있기 때문에 주요 잠금 충돌 없이 모든 동시 쿼리를 실행할 수 있습니다.

MongoDB에서는 단일 문서에 작업을 쓰는 모든 사람이 원자성으로 간주되기 때문에 라이터 래치가 흥미로워집니다. 쓰기 작업은 원자적이기 때문에 단일 문서를 업데이트하는 데 걸리는 시간 동안만 MongoDB 커널에 의해 기록기 래치가 유지됩니다.

따라서 느리게 실행되는 쓰기 작업이 실행되면(예를 들어 잘못된 스키마 설계 또는 디스크에서 문서 페이징으로 인해) 래치를 양보했다고 합니다.

주목해야 할 또 다른 사항은 앞에서 설명한 것처럼 MongoDB에는 각 데이터베이스에 대해 별도의 판독기/기록기 래치가 있다는 것입니다. 이를 설명하기 위해 A와 B라는 두 개의 데이터베이스가 있다고 가정합니다.

데이터베이스 A의 쓰기 작업의 경우 작성자는 데이터베이스 B의 쓰기 작업과 비교하여 별도의 래치를 획득합니다.

마찬가지로 데이터베이스에 대한 여러 연결이 쓰기 작업을 동시에 수행하는 경우 데이터베이스별로 래치가 유지됩니다. 또한 이러한 동시 연결은 인터리브됩니다.

참고: 잠금 때문에 데이터베이스 시스템의 성능과 속도가 영향을 받는 것처럼 느껴질 수 있습니다. 실제로 이것은 평균 부하의 경우 MongoDB가 데이터베이스의 잠금 비율이 50%보다 커지기 전에 디스크 또는 SSD의 I/O 용량을 포화시키므로 큰 문제가 되지 않습니다.

따라서 MongoDB의 잠금은 연결당이 아니라고 말합니다. 오히려 mongod 당입니다.

‘mongod’는 데이터 요청, 데이터 액세스 및 기타 백그라운드 작업을 관리하는 MongoDB 시스템의 기본 백그라운드 프로세스를 나타냅니다.

MongoDB의 잠금 수준

MongoDB에는 네 가지 수준의 잠금이 있습니다.

  1. 전역 수준 잠금: 인스턴스 수준 잠금이라고도 합니다. 이것은 모든 데이터베이스가 잠겨 있음을 의미합니다.
  2. 데이터베이스 수준 잠금: 이 유형의 잠금에서는 지정된 데이터베이스만 잠깁니다.
  3. 컬렉션 수준 잠금: MongoDB에서 컬렉션은 관련 문서 그룹입니다(기존 RDBMS의 테이블과 유사). 컬렉션 수준 잠금은 개별 컬렉션에 대한 잠금을 처리합니다.
  4. Document-level Locking: MongoDB의 문서는 필드와 값 쌍이 있는 레코드라고 할 수 있습니다. 이 유형의 잠금은 특정 문서만 잠급니다.

MongoDB의 잠금 모드

MongoDB에는 아래에 설명된 네 가지 잠금 모드가 있습니다.

  1. R: 공유(S) 잠금을 나타냅니다. 이 잠금 모드는 판독기에 사용됩니다.

    리소스는 이 모드에서 동시에 액세스하면서 판독기 간에 공유됩니다.

  2. W: 독점(X) 잠금을 나타냅니다. 이 잠금 모드는 작성자에게 사용됩니다.

    이 모드에서는 다른 동시 판독기 또는 기록기가 리소스를 사용할 수 없습니다.

  3. r: Intent Shared (IS) 잠금을 나타냅니다. 더 높은 수준의 의도 잠금입니다.

    이러한 잠금은 하위 수준 잠금으로 이동하기 전에 획득됩니다. 예를 들어 데이터베이스 수준에서 r 잠금을 획득한 경우 컬렉션 및 문서(하위) 수준에서 R 잠금을 획득할 수 있음을 의미합니다.

  4. w: Intent Exclusive (IX) 잠금을 나타냅니다. 또한 더 높은 수준의 의도 잠금입니다.

    r 잠금이 작동하는 방식과 유사하게 데이터베이스 수준에서 w 잠금이 획득되면 W 잠금이 이제 수집 및 문서(하위) 수준에서 획득될 수 있음을 의미합니다.

MongoDB에서 잠금 상태 확인

그렇다면 mongod 인스턴스의 잠금 상태를 확인할 수 있는 방법이 있습니까? 예, 다음 방법을 사용하여 그렇게 할 수 있습니다.

db.serverStatus()

이 방법을 사용하여 다양한 수준에서 잠금을 모니터링할 수 있습니다. 예를 들면 다음과 같습니다.

  1. 전역 수준의 경우 db.serverStatus().globalLock 코드를 사용합니다.
  2. 데이터베이스 수준의 경우 db.serverStatus().locks.Database 코드를 사용합니다.
  3. 수집 수준의 경우 db.serverStatus().locks.Collection 코드를 사용합니다.
  4. oplog(작업 로그)에서 잠금을 모니터링하려면 db.serverStatus().locks.oplog 코드를 사용하십시오.

다음 방법을 사용할 수도 있습니다.

db.currentOp()

결론

이 기사에서는 MongoDB의 잠금 개념과 다양한 수준 및 모드에 대해 설명했습니다. 이러한 개념을 이해할 수 있기를 바랍니다.

작가: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub