對 MongoDB 記憶體佔用進行限制以及從 3.2 升級到 4.0
前幾天往 MongoDB 中寫入了幾個 G 的資料,發現 MongoDB 記憶體佔用太 TMD 高了。不使用的時候也不釋放,搞得交換空間都整了好幾 G,其他程序的服務訪問起來也慢得要死。沒辦法啊,人窮,能省就省。今天本來只是準備想辦法限制一下 MongoDB 的記憶體佔用的,可惜很多事情不折騰不行啊。
系統中安裝的是 Debian 9 官方 apt 源提供的 MongoDB 包,3.2 的。在配置檔案中設定 wiredTigeredCacheSizeGB = 0.5 後,終端輸入
service mongodb start service mongodb status
服務無法啟動,顯示狀態是 dead,啟動日誌提示 wiredTigeredCacheSizeGB 是整數。
查官方和鄉下資料,折騰了半天沒有解決,想著升級一下得了。Debian 9 提供的最新版本只到 3.2.10,沒法再升了,只能找找官方的看看。
解除安裝原有版本
apt purge mongodb
apt autoremove
在官方網站查到的最新版本安裝方法如下
curl https://www.mongodb.org/static/pgp/server-4.0.asc | apt-key add - echo "deb http://repo.mongodb.org/apt/debian stretch/mongodb-org/4.0 main" | tee /etc/apt/sources.list.d/mongodb-org-4.0.list apt update apt install mongodb-org
可惜,直接安裝 4.0 不相容啊。指定資料目錄為原來的資料目錄後,啟動不起來,試了 3.6 也不行。
看網上有人說需要先升 3.4,再升 3.6,最後才能升到 4.0。到官網找到 3.4 的安裝說明,只有針對 Debian 8 的包,試試
curl https://www.mongodb.org/static/pgp/server-3.4.asc | apt-key add - echo "deb http://repo.mongodb.org/apt/debian jessie/mongodb-org/3.4 main" | tee /etc/apt/sources.list.d/mongodb-org-3.4.list apt update apt install mongodb-org=3.4.20 mongodb-org-server=3.4.20 mongodb-org-shell=3.4.20 mongodb-org-mongos=3.4.20 mongodb-org-tools=3.4.20
安裝不上,錯誤資訊顯示找不到 libssl1.0.1,系統安裝的 libssl 版本太高了,1.1 的。這東西也不好解除安裝重灌啊,依賴它的軟體太多了。想想算了,還是按最終方案,先把資料匯出,升級後再匯入吧。
網上找到的 MongoDB 匯入匯出以及資料庫備份的文章
-------------------MongoDB資料匯入與匯出-------------------
1、匯出工具:mongoexport
1、概念:
mongoDB中的mongoexport工具可以把一個collection匯出成JSON格式或CSV格式的檔案。可以通過引數指定匯出的資料項,也可以根據指定的條件匯出資料。
2、語法:
mongoexport -d dbname -c collectionname -o file --type json/csv -f field
引數說明:
-d :資料庫名
-c :collection名
-o :輸出的檔名
--type : 輸出的格式,預設為json
-f :輸出的欄位,如果-type為csv,則需要加上-f "欄位名"
3、示例:
sudo mongoexport -d mongotest -c users -o /home/python/Desktop/mongoDB/users.json --type json -f "_id,user_id,user_name,age,status"
2、資料匯入:mongoimport
1、語法:
mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field
引數說明:
-d :資料庫名
-c :collection名
--type :匯入的格式預設json
-f :匯入的欄位名
--headerline :如果匯入的格式是csv,則可以使用第一行的標題作為匯入的欄位
--file :要匯入的檔案
2、示例:
sudo mongoimport -d mongotest -c users --file /home/mongodump/articles.json --type json
-------------------MongoDB備份與恢復-------------------
1、MongoDB資料庫備份
1、語法:
mongodump -h dbhost -d dbname -o dbdirectory
引數說明:
-h: MongDB所在伺服器地址,例如:127.0.0.1,當然也可以指定埠號:127.0.0.1:27017
-d: 需要備份的資料庫例項,例如:test
-o: 備份的資料存放位置,例如:/home/mongodump/,當然該目錄需要提前建立,這個目錄裡面存放該資料庫例項的備份資料。
2、例項:
sudo rm -rf /home/momgodump/
sudo mkdir -p /home/momgodump
sudo mongodump -h 192.168.17.129:27017 -d itcast -o /home/mongodump/
2、MongoDB資料庫恢復
1、語法:
mongorestore -h dbhost -d dbname --dir dbdirectory
引數說明:
-h: MongoDB所在伺服器地址
-d: 需要恢復的資料庫例項,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2
--dir: 備份資料所在位置,例如:/home/mongodump/itcast/
--drop: 恢復的時候,先刪除當前資料,然後恢復備份的資料。就是說,恢復後,備份後新增修改的資料都會被刪除,慎用!
2、例項:
mongorestore -h 192.168.17.129:27017 -d itcast_restore --dir /home/mongodump/itcast/
在終端執行
mongodump -d dbname -o bkpdirectory
很好,成功備份到其他目錄了。
忽然想起,既然是匯出資料再升級,何必非要先安裝 3.6,直接裝 4.0 試試再說不是更好?咱的資料結構不復雜,說不定會相容。
安裝完成後,重新在配置檔案中指定資料目錄。為防意外,先移動原來的資料檔案,建立一個新資料夾,然後再啟動
mv /opt/data/mongodb /opt/data/mongodb1
mkdir /opt/data/mongodb
service mongod start
service mongod status
啟動不了,看來資料夾不是 MongoDB 使用者組還不行。換個方式
rm -R /opt/data/mongodb
mv /opt/data/mongodb1 /opt/data/mongodb
mkdir /opt/data/bkp
mv /opt/data/mongodb/* /opt/data/bkp
service mongod start
service mongod status
OK,啟動起來了。
然後就是還原備份了。
mongorestore -d dbname --dir bkpdirectory
資料量比較大,備份的時候還算快,可還原起來就慢了。特別是大的集合,1 M 要六七秒鐘,有的資料項數量多但單個比較小,更慢。總共花了大概兩個半小時。還好,沒出什麼問題。
刪除原來的資料檔案
rm -R /opt/data/bkp
然後回到正題,在配置檔案中新增記憶體限制。在 storage 下面
wiredTiger:
engineConfig:
cacheSizeGB: 0.5
最後,重新新增使用者。在 admin 集合建立超級使用者
db.createUser({user:'name',pwd:'pwd',roles:['userAdminAnyDatabase']})
在資料集合建立一般使用者
db.createUser({user:'name',pwd:'pwd',roles:['dbAdmin', 'readWrite']})
在配置檔案中啟用基於角色的訪問控制
security:
authorization: enabled
完成。
其他在網路上查到的:
MongoDB 3.6 的安裝
curl https://www.mongodb.org/static/pgp/server-3.6.asc | apt-key add -
echo "deb http://repo.mongodb.org/apt/debian stretch/mongodb-org/3.6 main" | tee /etc/apt/sources.list.d/mongodb-org-3.6.list
apt install mongodb-org=3.6.12 mongodb-org-server=3.6.12 mongodb-org-shell=3.6.12 mongodb-org-mongos=3.6.12 mongodb-org-tools=3.6.12
匯入資料的時候如果不相容,可以指定 --noIndexRestore 引數不匯入索引
mongorestore -h host --port port -u username -p password --noI