oplog 관리

arky uhm·2025년 5월 21일

MongoDB

목록 보기
6/14

oplog.rs 컬렉션은 복제본 세트(replica set) 환경에서만 생성되는 특수한 캡처드 컬렉션(capped collection)입니다. 이 컬렉션은 주 노드(Primary)의 모든 데이터 변경 사항을 기록하며, 보조 노드(Secondary)들이 이 기록을 기반으로 데이터를 동기화합니다.
oplog.rs는 복제본 세트 구성 시 자동으로 생성되며, 독립 실행형(standalone) MongoDB 인스턴스에는 존재하지 않습니다. 복제본 세트의 모든 멤버(주/보조 노드)는 local.oplog.rs 컬렉션을 보유합니다.



✅ oplog상태 확인
myReplicaSet [direct: secondary] test> rs.printReplicationInfo()
actual oplog size
'15462.6376953125 MB'
---
configured oplog size
'15462.6376953125 MB'
---
log length start to end
'94230 secs (26.18 hrs)'
---
oplog first event time
'Tue May 20 2025 05:18:55 GMT+0000 (Coordinated Universal Time)'
---
oplog last event time
'Wed May 21 2025 07:29:25 GMT+0000 (Coordinated Universal Time)'
---
now
'Wed May 21 2025 07:29:28 GMT+0000 (Coordinated Universal Time)'

. configured oplog size : 현재 설정된 oplog.rs 컬렉션의 최대 크기(단위: MB)
. log length start to end : oplog에 저장된 첫 번째 이벤트부터 마지막 이벤트까지의 시간 간격(단위: 초와 시간)
→ 예) 지금 시점부터 약 26.18 시간 전까지의 변경 이력이 oplog에 남아 있다는 의미로써, 최대 26.18시간 전까지의 변경 이력을 oplog에서 읽어서 따라잡을 수 있다는 것
. oplog first event time : oplog에 저장된 가장 오래된(처음) 이벤트의 타임스탬프
. oplog last event time : oplog에 저장된 가장 최근(마지막) 이벤트의 타임스탬프
. now : 이 명령을 실행한 현재 시각(서버 기준)



✅ oplog 크기 늘리기
myReplicaSet [direct: secondary] test> db.adminCommand({replSetResizeOplog: 1, size: Double(3000)}) ## 단위 : MB → 3GB
myReplicaSet [direct: secondary] local> db.oplog.rs.stats().maxSize ## 저장할 수 있는 최대 용량
3145728000
myReplicaSet [direct: secondary] local> db.oplog.rs.stats().size ## 현재 할당되어 있는 공간으로 maxSize보다 같거나 작을 수 있음
256168

primary, secondary 어느 곳에서 수행해도 상관없음



✅ oplog 크기 줄이기
--1. secondary 모두 수행 
myReplicaSet [direct: secondary] test> db.adminCommand({replSetResizeOplog: 1, size: Double(990)})  ## 최소 oplog 크기는 990MB
myReplicaSet [direct: secondary] test> use local
myReplicaSet [direct: secondary] local> db.runCommand({ "compact" : "oplog.rs" } )
myReplicaSet [direct: secondary] local> db.oplog.rs.stats().maxSize
1038090240
myReplicaSet [direct: secondary] local> db.oplog.rs.stats().size
259051

--2. primary
myReplicaSet [direct: primary] test> rs.stepDown()
myReplicaSet [direct: secondary] test> use local
myReplicaSet [direct: secondary] local> db.oplog.rs.stats().maxSize
16213789952
myReplicaSet [direct: secondary] local> db.oplog.rs.stats().size
260079
myReplicaSet [direct: secondary] local> db.adminCommand({replSetResizeOplog: 1, size: Double(990)})
myReplicaSet [direct: primary] local> db.oplog.rs.stats().maxSize
1038090240
myReplicaSet [direct: primary] local> db.oplog.rs.stats().size
260489

secondary→primary 순으로 작업



✅ oplog 크기

스토리지 엔진에 따라
   . WiredTiger(기본 엔진): 사용 가능한 디스크 공간의 5%
   . MMAPv1(이전 엔진): 물리적 메모리의 5%

예를 들어,
사용 가능한 디스크 공간이 2TB(2000GB)라면
2TB x 0.05 = 100GB
→ 100GB > 50GB이므로, 기본 oplog 크기는 50GB로 설정됩니다.
사용 가능한 디스크 공간이 500GB라면
500GB x 0.05 = 25GB
→ 25GB < 50GB이므로, 기본 oplog 크기는 25GB가 됩니다.



🧾출처

https://www.mongodb.com/ko-kr/docs/manual/core/replica-set-oplog/
https://myjamong.tistory.com/323

0개의 댓글