sourcetip

MongoDB는 쓰기를 어느 수준까지 잠급니까?(또는: "연결당"은 무엇을 의미합니까?

fileupload 2023. 5. 8. 22:24
반응형

MongoDB는 쓰기를 어느 수준까지 잠급니까?(또는: "연결당"은 무엇을 의미합니까?

mongodb 문서에는 다음과 같이 나와 있습니다.

버전 2.2부터 MongoDB는 대부분의 읽기 및 쓰기 작업을 위해 데이터베이스 단위로 잠금을 구현합니다.일반적으로 여러 데이터베이스와 관련된 짧은 기간의 작업인 일부 글로벌 작업에서는 여전히 글로벌 "인스턴스" 와이드 잠금이 필요합니다.2.2 이전 버전에서는 mongod 인스턴스당 하나의 "글로벌" 잠금만 있습니다.

즉, 네트워크에서 실행 중인 서로 다른 앱에서 mongodb://localhost/test에 3개의 연결이 있는데 한 번에 하나만 쓸 수 있다는 것입니까?아니면 그냥 연관성에 따른 것일까요?

IOW: 연결 단위입니까, 아니면 쓰기 중에 전체/테스트 데이터베이스가 잠겨 있습니까?

MongoDB 잠금이 다릅니다.

MongoDB의 잠금은 RDBMS의 잠금과 같이 작동하지 않으므로 약간의 설명이 필요합니다.MongoDB의 이전 버전에는 단일 글로벌 리더/라이터 래치가 있었습니다.MongoDB 2.2부터는 각 데이터베이스에 대한 리더/라이터 래치가 있습니다.

리더라이터 래치

래치는 다중 판독기, 단일 작성기이며 쓰기 욕심이 많습니다.이는 다음을 의미합니다.

  • 데이터베이스에 동시 판독기가 무제한으로 있을 수 있습니다.
  • 한 데이터베이스의 모든 컬렉션에는 한 번에 한 명의 작성자만 있을 수 있습니다(이에 대한 자세한 내용은 잠시 후).
  • 작가는 독자를 차단합니다.
  • "writer-greedy"는 일단 쓰기 요청이 들어오면 쓰기가 완료될 때까지 모든 판독기가 차단된다는 것을 의미합니다(나중에 자세히 설명).

이를 "잠금"이 아닌 "잠금"이라고 부릅니다.이는 경량이고 적절하게 설계된 스키마에서 쓰기 잠금이 12마이크로초 정도 유지되기 때문입니다.독서자-작가 간 잠금에 대한 자세한 내용은 여기를 참조하십시오.

MongoDB에서는 원하는 만큼 동시에 쿼리를 실행할 수 있습니다. 관련 데이터가 RAM에 있는 한 잠금 충돌 없이 모두 충족됩니다.

원자력 문서 업데이트

MongoDB에서 트랜잭션 수준은 단일 문서입니다.단일 문서에 대한 모든 업데이트는 원자력입니다.MongoDB는 RAM에서 단일 문서를 업데이트하는 데 걸리는 시간 동안만 쓰기 래치를 유지하여 이를 달성합니다.실행 속도가 느린 작업(특히, 디스크에서 문서 또는 색인 항목을 호출해야 하는 경우)이 있는 경우, 해당 작업을 수행하면 쓰기 래치가 생성됩니다.작업이 래치를 생성하면 대기 중인 다음 작업을 계속할 수 있습니다.

즉, 단일 데이터베이스 내의 모든 문서에 대한 쓰기가 직렬화됩니다.스키마 설계가 부실하고 쓰기에 시간이 오래 걸리지만 제대로 설계된 스키마에서는 잠금이 문제가 되지 않을 수 있습니다.

작가-그리디

작가-탐욕심에 대한 몇 마디 더:

한 번에 한 명의 라이터만 래치를 고정할 수 있으며 한 번에 여러 판독기가 래치를 고정할 수 있습니다.순진한 구현에서, 만약 한 명의 독자가 운영된다면 작가들은 무기한으로 굶을 수 있습니다.이를 방지하기 위해 MongoDB 구현에서 단일 스레드가 특정 래치에 대한 쓰기 요청을 하면

  • 해당 래치가 필요한 모든 후속 판독기가 차단됩니다.
  • 해당 작성자는 현재 판독기가 모두 완료될 때까지 기다립니다.
  • 기록기가 쓰기 래치를 획득하고 작업을 수행한 다음 쓰기 래치를 해제합니다.
  • 대기 중인 모든 판독기가 지금 진행됩니다.

이 작가-욕심 많은 행동은 명백하지 않을 수 있는 방식으로 양보하는 것과 상호 작용하기 때문에 실제 행동은 복잡합니다.릴리스 2.2부터는 각 데이터베이스에 대해 별도의 래치가 있으므로 데이터베이스 'A'의 모든 컬렉션에 대한 쓰기는 데이터베이스 'B'의 모든 컬렉션에 대한 쓰기보다 별도의 래치를 획득합니다.

구체적인 질문

특정 질문과 관련하여:

  • 잠금 장치(실제 래치)는 단일 문서를 업데이트하는 데 걸리는 시간 동안만 MongoDB 커널에 의해 유지됩니다.
  • MongoDB에 연결된 여러 개의 연결이 있고 각 연결이 일련의 쓰기를 수행하는 경우, 래치는 해당 쓰기가 완료되는 데 걸리는 시간 동안만 데이터베이스별로 유지됩니다.
  • 쓰기(업데이트/삽입/삭제)를 수행하는 데 들어오는 여러 연결이 모두 인터리빙됩니다.

이는 성능에 큰 문제가 될 것으로 보이지만 실제로는 속도를 늦추지 않습니다.적절하게 설계된 스키마와 일반적인 워크로드를 사용하면 MongoDB는 Disk I/O 용량(SSD의 경우에도)을 포화한 후 데이터베이스의 잠금 비율이 50%를 초과합니다.

제가 알고 있는 가장 큰 용량의 MongoDB 클러스터는 현재 초당 200만 번의 쓰기를 수행하고 있습니다.

연결 단위가 아니라 연결 단위입니다.mongod즉, 잠금 장치는 모든 연결에 걸쳐 존재합니다.test해당 서버의 데이터베이스.

또한 읽기/쓰기 잠금이므로 쓰기가 발생하면 읽기가 대기해야 합니다. 그렇지 않으면 MongoDB가 일관된 읽기인지 어떻게 알 수 있습니까?

그러나 MongoDB 잠금은 사용자가 받는 SQL/일반 트랜잭션 잠금과 매우 다르며 일반적으로 평균 업데이트 사이에 약 마이크로초 동안 잠금이 유지됩니다.

Mongo 3.0은 이제 수집 수준 잠금을 지원합니다.

이 외에도 Mongo는 스토리지 엔진을 만들 수 있는 API를 만들었습니다.Mongo 3.0에는 2개의 스토리지 엔진이 제공됩니다.

  1. MMAPv1: 기본 스토리지 엔진이며 이전 버전에서 사용되는 엔진입니다.수집 수준 잠금 기능이 함께 제공됩니다.
  2. 새로운 스토리지 엔진인 WiredTiger는 문서 수준의 잠금 및 압축 기능을 제공합니다(64비트 버전에서만 사용 가능).

MongoDB 3.0 릴리스 정보

와이어드 타이거

질문이 꽤 오래된 것은 알지만, 여전히 몇몇 사람들은 혼란스러워 합니다.

MongoDB 3.0부터는 64비트 빌드에서 WiredTiger 스토리지 엔진(문서 수준 동시성 사용)을 사용할 수 있습니다.

WiredTiger는 쓰기 작업에 문서 수준의 동시성 제어를 사용합니다.따라서 여러 클라이언트가 동시에 컬렉션의 다른 문서를 수정할 수 있습니다.

대부분의 읽기 및 쓰기 작업에서 WiredTiger는 낙관적인 동시성 제어를 사용합니다.WiredTiger는 글로벌, 데이터베이스 및 수집 수준에서 인텐트 잠금만 사용합니다.스토리지 엔진이 두 작업 간의 충돌을 감지하면 쓰기 충돌이 발생하여 MongoDB가 해당 작업을 투명하게 재시도합니다.

일반적으로 여러 데이터베이스와 관련된 짧은 기간의 작업인 일부 글로벌 작업에서는 여전히 "인스턴스 전체" 잠금이 필요합니다.컬렉션 삭제와 같은 일부 다른 작업에서는 여전히 전용 데이터베이스 잠금이 필요합니다.

문서 수준 동시성

언급URL : https://stackoverflow.com/questions/17456671/to-what-level-does-mongodb-lock-on-writes-or-what-does-it-mean-by-per-connec

반응형