Ta biết rằng khi thực hiện xóa một số document trong một collection (hoặc xóa cả collection) , vùng nhớ bị chiếm của những dữ liệu này sẽ không được trả cho hệ điều hành . Muốn giải phóng vùng nhớ này , phải thực hiện repairDatabase()
Cách thực hiện repair một replicaSet :
1 . Shut down instance mongod slave . Sau đó chạy repair (bằng cách start nó với tùy chọn --repair và không sử dụng replicaSet , không có tùy chọn --replSet). Sau đó start lại instance này với cấu hình replicaSet như cũ và chờ cho nó đồng bộ với master
2. Chuyển instance mongod từ master sang slave bằng cách kết nối vào instance này , sau đó dùng lệnh rs.stepDown() . Master sẽ được chuyển giao cho instance slave lúc đầu (lưu ý trường hợp có nhiều slave , nếu muốn chọn slave nào sẽ trở thành master dùng command rs.replSetFreeze() cho các slave còn lại). Ví dụ ta có A , B , C thuộc cùng 1 replicaSet , master là A . Muốn chuyển master cho B ta phải "freeze" C .
$ mongo --host C > // first check that everyone is healthy and in the states we expect: > rs.status() > // C : not eligible to be primary for 120 seconds > rs.freeze(120) > exit $ mongo --host A > // A : step down as primary and ineligible to be primary for 120 seconds > rs.stepDown(120) > // B will now become primary. for this to work B must be up to date.
Sau đó làm tương tự bước 1 cho instance vừa mới bị chuyển thành slave .
3. Đối với arbiter không cần làm gì .
Đó là các bước repair đối với replicaSet . Tuy nhiên từ mongoDb phiên bản 1.9 + , có command compact có tác dụng đối với 1 collection cụ thể , không như repairData() sẽ có tác dụng với tất cả collection (gây tốn nhiều thời gian nếu như ta chỉ muốn thực hiện trên 1 collection cụ thể , trong thời gian repair , mongod sẽ bị lock )
db.runCommand( { compact : 'mycollectionname' } )
Comments