1. 程式人生 > >對 MongoDB 記憶體佔用進行限制以及從 3.2 升級到 4.0

對 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