37. MongoDB Replication Part 7. - sync

Slave 노드가 시작될 때 가장 먼저하는 일은 master 노드의 데이터 전체를 동기화하는 것입니다.

Slave 노드는 master 노드의 모든 도큐먼트를 복제하는데 이것은 엄청 부담이 되는 연산입니다. 초기 동기화가 완료되면 slave 노드는 master 노드의 oplog를 쿼리하고 연산을 수행하여 최신 상태로 데이터를 유지합니다.

만약 slave 노드의 연산이 master 노드에서 수행되고 있는 연산에서 매우 뒤쳐져 있는 상황이라면 slave 노드의 동기화는 실패하게 될 것입니다. 즉, 동기화에 실패한 slave 노드는 master 노드에서 수행되고 있는 연산 속도를 더 이상 따라잡지 못하게 되는 상황이 발생하게 됩니다.

동기화에서 이탈하게 되면 slave 노드는 복제를 멈추고 master 노드의 데이터 전체를 다시 동기화하는 것이 바람직합니다.

재동기화는 다음 명령을 통해 수동으로 수행합니다:

> use admin
switched to db admin
> db.runCommand({resync: 1})

또는 slave 노드 시작 시 다음과 같이 옵션을 추가합니다:

$ mongod --dbpath [YOUR_DATA_PATH] --slave --autoresync

참고로 resync 연산이 수행되면 처리가 완료될 때까지 전체 데이터 쓰기 잠금(Global Write Lock) 상태가 되며 다른 연산의 수행은 막힙니다.

데이터를 복제(Master-Slave 노드 간 데이터 동기화)는 매우 부담되는 연산이기 때문에 복제 자체보다는 master 노드의 연산 이력을 저장하는 oplog 사이즈를 충분히 설정하여 slave 노드가 데이터의 직접 복제 대신 oplog를 통해 동일한 연산을 수행하도록 하는 것이 훨씬 유리합니다.

oplog 파일 사이즈를 크게 잡을수록 데이터 동기화에 있어서는 유리하지만 디스크 용량을 많이 차지합니다. 이런 점을 잘 감안하여 상황에 맞게 적절하게 사이즈를 잡는 것이 좋습니다.

oplog 파일 사이즈의 디폴트 사이즈는 남은 디스크 공간의 5%입니다.