실시 간 동기 화 MongoDB Oplog 개발 안내
Capped Collections
MongoDB 는 Capped collections 라 는 특수 한 Collection 이 있 습 니 다. 삽입 속도 가 매우 빠 르 고 기본 과 디스크 의 기록 속도 가 많 지 않 으 며 삽입 순서에 따라 효율 적 인 조회 작업 을 지원 합 니 다.Capped collections 의 크기 는 고정 되 어 있 습 니 다. 작업 방식 은 링 버퍼 (circular buffers) 와 같 습 니 다. 남 은 공간 이 부족 할 때 가장 먼저 삽 입 된 데 이 터 를 덮어 씁 니 다.Capped collections 의 특징 은 효율 적 인 삽입 과 검색 이 므 로 Capped collections 에 추가 색인 을 추가 하지 않 는 것 이 좋 습 니 다. 그렇지 않 으 면 삽입 속도 에 영향 을 줄 수 있 습 니 다.Capped collections 는 다음 필드 에 사용 할 수 있 습 니 다:
Capped collections 사용 제한:
db['oplog.rs'].find({}).sort({$natural: -1})
Oplog
Oplog 는 특수 한 Capped collections 로 특수 한 점 은 시스템 급 Collection 으로 데이터 뱅 크 의 모든 조작 을 기록 하고 클 러 스 터 간 에 Oplog 에 의 해 데이터 동기 화 를 하 는 것 이다.Oplog 의 전체 이름 은 local. oplog. rs 로 local 데이터 에 있 습 니 다.local 데이터 가 사용 자 를 만 들 수 없 기 때문에 Oplog 에 접근 하려 면 다른 데이터 베 이 스 를 이용 한 사용자 가 필요 하고 이 사용자 에 게 local 데이터 베 이 스 를 방문 할 수 있 는 권한 을 부여 해 야 합 니 다. 예 를 들 어:
db.createUser({
user: "play-community",
pwd: "******",
"roles" : [
{
"role" : "readWrite",
"db" : "play-community"
},
{
"role" : "read",
"db" : "local"
}
]
})
Oplog 기록 의 조작 기록 은 멱 등 (idempotent) 입 니 다. 이 는 데이터 가 손실 되 거나 일치 하지 않 고 여러 번 실행 할 수 있 음 을 의미 합 니 다.예 를 들 어 $inc 작업 에 대해 Oplog 는 자동 으로 $set 작업 으로 변환 합 니 다. 예 를 들 어 원본 데 이 터 는 다음 과 같 습 니 다.
{ "_id" : "0", "count" : 1.0}
다음 $inc 작업 을 수행 합 니 다:
db.test.update({_id: "0"}, {$inc: {count: 1}})
Oplog 에 기 록 된 로 그 는 다음 과 같 습 니 다.
{
"ts" : Timestamp(1503110518, 1),
"t" : NumberLong(8),
"h" : NumberLong(-3967772133090765679),
"v" : NumberInt(2),
"op" : "u",
"ns" : "play-community.test",
"o2" : {
"_id" : "0"
},
"o" : {
"$set" : {
"count" : 2.0
}
}
}
이런 전환 은 Oplog 의 멱 등 성 을 보장 할 수 있다.또한 Oplog 는 삽입 성능 을 보장 하기 위해 추가 로 색인 을 만 들 수 없습니다.
Timestamps 형식
MongoDB 는 내부 에서 만 사용 할 수 있 는 특별한 시간 형식 인 Timestamps 가 있 습 니 다. 예 를 들 어 위의 Oplog 기록:
Timestamp(1503110518, 1)
Timestamps 길이 64 비트:
동기 화 시작
동기 화 Oplog 를 시작 하기 전에 다음 과 같은 몇 가 지 를 주의해 야 합 니 다.
val tailingCursor =
oplogCol
.find(Json.obj("ns" -> Json.obj("$in" -> Set(s"${db}.common-doc", s"${db}.common-article")), "ts" -> Json.obj("$gte" -> lastTS)))
.options(QueryOpts().tailable.oplogReplay.awaitData.noCursorTimeout)
.cursor[BSONDocument]()
tailingCursor.fold(()){ (_, doc) =>
try {
val jsObj = doc.as[JsObject]
jsObj("op").as[String] match {
case "i" => //
case "u" => //
case "d" => //
}
// ts ,
if (tailCount.get() % 10 == 0) { }
} catch {
case t: Throwable =>
Logger.error("Tail oplog Error: " + t.getMessage, t)
}
}
또한, ReactiveMongo - streaming 의 Akka Stream 은 bug 가 구현 되 었 으 며, 첫 번 째 조회 에 데이터 가 되 돌아 오지 않 으 면 조회 요청 을 지속 적 으로 보 내 1 초 에 수 십 번 에서 수백 번 정도 요청 을 보 내 는데, Oplog 의 조회 비용 이 많이 들 기 때문에 결국 MongoDB 메모리 가 넘 칠 수 있 음 을 알려 드 립 니 다.자세 한 내용 은 쿼 리 를 보 내 는 동안 꼬리 에 맞 는 커서 의 초기 쿼 리 결 과 는 비어 있 습 니 다.
레 퍼 런 스
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.