使用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追加:
mongoDB複制集維護和切換——記憶體限制
重新開機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的狀态,同時可以使用下面的指令檢視同步進度,這樣就可以保證服務整體可用。