天天看點

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追加:      
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的狀态,同時可以使用下面的指令檢視同步進度,這樣就可以保證服務整體可用。      

繼續閱讀