ProgramingTip

MongoDB는 쓰기를 어떤 수준으로 잠그나요?

bestdevel 2020. 12. 9. 21:31
반응형

MongoDB는 쓰기를 어떤 수준으로 잠그나요? (또는 : "연결 당"이란 무엇을 의미합니까?


mongodb 문서에서 다음과 같이.

버전 2.2부터 MongoDB는 대부분의 읽기 및 쓰기 작업에 대해 데이터베이스별로 잠금을 구현합니다. 일반적으로 여러 데이터베이스를 포함하는 단기 작업과 같은 일부 전역 작업에는 여전히 전역 "인스턴스"전체 잠금이 필요합니다. 2.2 이전에는 mongod 인스턴스 당 하나의 "전역"잠금 만 있습니다.

이 네트워크에서 실행되는 다른 앱에서 mongodb : // localhost / test에 3 개의 연결이있는 상황에서 한 번에 하나만 수 있음을 의미합니까? 아니면 연결 당입니까?

IOW : 연결 전체 / 테스트 데이터베이스가 쓰는 동안에 있습니까?


연결 단위가 아니라 mongod. 즉, 잠금은 test해당 서버 데이터베이스에 대한 모든 연결에 존재 합니다.

또한 읽기 / 쓰기 시작 쓰기가 발생하면 읽기를 기다려합니다. 신뢰할 수있는 MongoDB가 일관된 읽기인지 어떻게 알 수 있습니까?

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


MongoDB 잠금은 번호

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

독자 작가 래치

래치는 다중이고, 단일 한이며 작가 탐욕입니다. 이것은 다음을 의미합니다.

  • 데이터베이스에 동시 독자의 수에 제한이 없습니다.
  • 한 데이터베이스의 모든 컬렉션에는 한 번에 한 명의 작성자 만있을 수 있습니다.
  • 작가는 독자를 차단합니다
  • "writer-greedy"는 쓰기 요청이 들어 오면 쓰기 완료 될 때까지 모든 리더가 차단 의미입니다.

나는 "잠금"이라기보다는 "래치"라고 부른다. 이는 스키마에서 쓰기에 대한 기본 스키마에서 쓰기 잠금이 약 12 ​​마이크로 초 단위로 유지되기 때문입니다. 독자 작성기 잠금에 대한 자세한 내용은 여기참조 하십시오 .

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

원자 문서 업데이트

MongoDB에서 트랜잭션 수준은 단일 문서임을 상기하십시오. 단일 문서에 대한 모든 업데이트는 Atomic입니다. MongoDB는 RAM에서 단일 문서를 업데이트하는 데 시간 동안 만 쓰기 래치를 유지하여 달성합니다. 느리게 실행되는 작업이있는 경우 (특히 문서 또는 인덱스 항목을 디스크에서 페이징 해야하는 경우 ) 작업은 해당 쓰기 래치를 생성 합니다. 작업이 래치를 생성하면 대기중인 다음 작업이 진행될 수 있습니다.

이는 단일 데이터베이스 내의 문서에 대한 쓰기가 생성됨을 의미합니다. 스키마 디자인이 좋지 않은 경우에 오랜 시간이있는 경우 문제가 될 수 있습니다.

작가 욕심쟁이

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

한 번에 한 명의 명의 작성자만이 사용할 수 있습니다. 여러 가지기가 한 번에 걸쇠를 잡을 수 있습니다. 순진한 구현에서 작가는 단일 리더가 작동 중이면 무기한 굶주릴 수 있습니다. MongoDB 구현에서 단일 쓰기가 특정 래치에 대한 쓰기 요청을하면

  • 해당 래치가 필요한 모든 다음은 숨겨져 있습니다.
  • 해당 작가는 현재 모든 독자가 끝날 때까지 기다립니다.
  • 작성자는 쓰기 래치를 금액하고 작업을 수행 한 다음 쓰기 래치를 해제합니다.
  • 이제 대기중인 모든 리더가 진행됩니다.

이 작가 탐욕스러운 행동은 명확하지 않은 방식으로 양보와 상호 작용하기 때문에 복잡합니다. 릴리스 2.2부터는 데이터베이스마다 별도의 래치가 있으므로 데이터베이스 'A'의 컬렉션에 대한 쓰기는 데이터베이스 'B'의 컬렉션에 대한 쓰기보다 별도의 래치가 있습니다.

특정 질문

구체적인 질문에 대해 :

  • 잠금 (실제로 래치)은 단일 문서를 업데이트하는 데 있고 기간 동안 만 MongoDB를 통해 유지됩니다.
  • MongoDB로 데이터베이스 연결이 여러 개있는 각 연결이 유지됩니다.
  • 쓰기 (업데이트 / 삽입 / 삭제)를 수행하는 여러 연결이 모두 인터리브됩니다.

이것은 큰 성능 문제처럼 들리지만 실제로는 속도를 늦추지 언어로합니다. 어떤 방식으로 스키마와 일반적인 워크로드를 통해 MongoDB는 모든 데이터베이스의 잠금 비율이 50 %를 초과하기 SSD의 경우에도 디스크 I / O 용량을 초기화합니다.

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


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

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

  1. MMAPv1 : 기본 스토리지 엔진이며 이전 버전에서 사용 된 엔진입니다. 컬렉션 수준 잠금이 제공됩니다.
  2. WiredTiger : 새로운 스토리지 엔진으로 문서 수준 잠금 및 압축 기능이 제공됩니다. (64 비트 버전에서만 사용 가능)

MongoDB 3.0 릴리스 정보

WiredTiger


질문이 꽤 오래 예는 경우에 여전히 일부 사람들은 혼란스러워합니다 ....

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

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

반응형