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%입니다.