36. MongoDB Replication Part 6. - oplog

oplog (operation log)는 master 노드에 요청되는 연산들이 로그로 기록되는 파일이며, local이라는 이름의 db 내의 oplog.rs (rsReplica Set의 이름)이라는 이름의 컬렉션 내에 저장됩니다.

예를 들어 oplog의 내용을 출력하면 다음과 같습니다:

> show dbs
local   4.279296875GB
test    0.0625GB
> use local
switched to db local
> db.getCollectionNames()
[
        "oplog.rs",
        "slaves",
        "startup_log",
        "system.indexes",
        "system.replset"
]
> db.oplog.rs.find().pretty()
{
        "ts" : Timestamp(1396096489, 1),
        "h" : NumberLong(0),
        "v" : 2,
        "op" : "n",
        "ns" : "",
        "o" : {
                "msg" : "initiating set"
        }
}
{
        "ts" : Timestamp(1396096495, 1),
        "h" : NumberLong("-8745255044808441839"),
        "v" : 2,
        "op" : "n",
        "ns" : "",
        "o" : {
                "msg" : "Reconfig set",
                "version" : 2
        }
}
{
        "ts" : Timestamp(1396096507, 1),
        "h" : NumberLong("-4666497119748582412"),
        "v" : 2,
        "op" : "n",
        "ns" : "",
        "o" : {
                "msg" : "Reconfig set",
                "version" : 3
        }
}
{
        "ts" : Timestamp(1396097326, 1),
        "h" : NumberLong("2929377522288628653"),
        "v" : 2,
        "op" : "i",
        "ns" : "test.tmp",
        "o" : {
                "_id" : ObjectId("5336c12e07a320abf7b320e3"),
                "username" : "gchoi",
                "pwd" : 1234
        }
}

도큐먼트는 위와 같이 ts, h, v, op, ns, o 등의 키를 포함하는데 주요 키에 대한 설명은 다음과 같습니다.

  • ts

    연산에 대한 타임스탬프(Timestamp). 4 바이트의 타임스탬프와 4 바이트의 증가 카운터로 구성되어 있습니다.

  • op

    1 바이트 코드로 수행되는 연산 유형. i는 insert를 의미합니다.

  • ns

    연산이 수행되었던 컬렉션 이름(네임스페이스).

  • o

    수행할 연산을 지정하는 도큐먼트.

oplog에 대한 몇가지 특징을 살펴보겠습니다:

  1. oplog는 master와 slave 노드 간 데이터를 동기화하는 것이 주목적이므로 데이터의 쓰기 등과 관련된 연산만 기록된다는 것입니다. 즉, 이미 저장된 데이터에 대한 처리를 위한 쿼리는 기록되지 않으며 사실상 기록될 필요가 없습니다.

  2. oplog에 저장된 연산들은 master 서버에서 수행된 연산들과 정확히 일치하는 것은 아닙니다.

  3. oplogCapped Collection에 저장됩니다.