1. 程式人生 > >mongoDB複製集維護和切換——記憶體限制

mongoDB複製集維護和切換——記憶體限制

使用mongoDB是因為用到了graylog,部署執行2-3個月之後,發現mongoDB佔用實體記憶體巨大,50G+,公司的資料架構居然質問我為什麼不設定-Xmx堆記憶體大小,我尼瑪只能呵呵醉了!

簡單說mongoDB似乎沒有配置項可以限制使用實體記憶體,粗略理解mongoDB本身不管理記憶體塊,而是全部交給作業系統,如何限制mongoDB記憶體呢?

網上有說使用ulimit等,但是事實證明無效。

應對的辦法就是使用cgroup,cgconfig是什麼東西我就不說了,可以看我另一篇部落格。

這裡介紹下具體實施步驟。我們的複製集一共有3個節點,部署在三臺機器上面,首先通過mongo ip:27017這種方式登入,檢視每個幾點的角色

rs0:SECONDARY>這種就是secondary了,rs0:PRIMARY>這種就是primary。

1、逐個處理secondary

第一步:
db.adminCommand({"replSetMaintenance":true})
保險起見,執行這個命令,讓secondary進入維護模式,這時流量就會切走。
第二步:
kill mongoDB的程序號,等待mongo程序退出。
第三步:
準備好cgconfig配置。在/etc/cgconfig.conf檔案追加
在/etc/cgrules.conf追加:
重啟cgconfig服務,service cgconfig restart
在/cgroup/memory目錄中可以看到DBLimitedGroup目錄,說明生效了
第四步,重啟secondary,不過前面要加上
cgexec -g memory:DBLimitedGroup bin/mongod -dbpath=./data/ -logpath=./logs/mongod.log --fork --replSet rs0 -bind_ip=192.168.32.189
    2、primary切換,然後處理之前的primary
mongo登陸primary,然後執行rs.stepDown(15)這時候,執行rs.status觀測新的primary有沒有選舉出來
一般來說都會正常選舉,這時候,執行上面的步驟,限制老primary的記憶體。
說明,可以通過rs.status()檢視primary和secondary的狀態,同時可以使用下面的命令檢視同步進度,這樣就可以保證服務整體可用。