欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何進(jìn)行mongodb數(shù)據(jù)庫(kù)的問(wèn)題分析

如何進(jìn)行MongoDB數(shù)據(jù)庫(kù)的問(wèn)題分析,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

創(chuàng)新互聯(lián)是專(zhuān)業(yè)的洪山網(wǎng)站建設(shè)公司,洪山接單;提供成都網(wǎng)站建設(shè)、做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行洪山網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

   MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的。它的特點(diǎn)是高性能、易部署、易使用,存儲(chǔ)數(shù)據(jù)非常方便。公司在測(cè)試和生產(chǎn)環(huán)境使用了MONGODB數(shù)據(jù)庫(kù),日常在使用MONGODB數(shù)據(jù)庫(kù)的過(guò)程中,遇到了一些問(wèn)題,比較典型的三個(gè)問(wèn)題現(xiàn)總結(jié)分享一下。

一、數(shù)據(jù)庫(kù)最大連接數(shù)問(wèn)題

當(dāng)你在后臺(tái)日志中,發(fā)現(xiàn)大量“connection refused because too many open connections: 819”信息時(shí),一般跟你沒(méi)有設(shè)置合適的最大連接數(shù)值有關(guān)。

默認(rèn)情況下,在LINUX系統(tǒng)中,MONGODB默認(rèn)連接數(shù)為819,你可以適當(dāng)調(diào)大這個(gè)值,但注意這個(gè)值不是無(wú)限大,最多可設(shè)置成20000, 參見(jiàn)MONGODB的官方說(shuō)明。

如何進(jìn)行mongodb數(shù)據(jù)庫(kù)的問(wèn)題分析

我們可以在數(shù)據(jù)庫(kù)啟動(dòng)時(shí)加--maxConns 10000參數(shù)來(lái)指定最大連接數(shù)

也可以修改mongodb.conf配置文件,在其中加一句maxConns = 10000保存退出后再啟動(dòng)MONGODB就好了。

當(dāng)然這個(gè)問(wèn)題也跟ulimit限制有關(guān), 可以手動(dòng)修改ulimit -n 來(lái)改動(dòng)open file 的數(shù)目.

如果想使open file的值永久生效的話(huà),請(qǐng)?jiān)?etc/security/limits.conf中添加以下四行, 數(shù)目根據(jù)系統(tǒng)情況具體修改.

*    soft nofile 102400       (*針對(duì)所有用戶(hù))

*    hard nofile 102400

root soft nofile 102400        (針對(duì)ROOT用戶(hù))

root hard nofile 102400

然后在/etc/pam.d/login中添加

session    required     /lib64/security/pam_limits.so

....

reboot后即可永久生效.

環(huán)境變量

[root@localhost ~]# echo "PATH=$PATH:/app/mongodb/bin" >> /etc/profile

[root@localhost ~]# source /etc/profile

mongodb配置文件附例:

port=27017

dbpath=/backup/mongodbData

logpath=/app/mongodb/log/mongodb.log

logappend=true

directoryperdb=true

journal=true

fork=true

maxConns = 10000

二、虛擬內(nèi)存限制問(wèn)題

MongoDB主從配置后, 啟動(dòng)時(shí)報(bào)錯(cuò)“ERROR: mmap failed with out of memory”。  這是因?yàn)閙ongodb在設(shè)置為主從關(guān)系時(shí),會(huì)創(chuàng)建“creating replication oplog of size: 944MB”,這個(gè)OPLOG日志應(yīng)該是放在內(nèi)存中的.

解決方法:

(1)設(shè)置oplog的大小,用參數(shù)--oplogSize來(lái)指定,不默認(rèn)創(chuàng)建944M

(2)放開(kāi)虛擬內(nèi)存的限制(虛擬機(jī)默認(rèn)設(shè)定512M ),編輯/etc/profile文件加入ulimit -v unlimited,使用source /etc/profile讓設(shè)置生效。

再執(zhí)行主從的啟動(dòng)命令就ok了

mongodb比較吃?xún)?nèi)存,也可以限制mongodb的內(nèi)存使用量,操作如下

vi  mongodb.conf

增加 ulimit -m 2560000 (約2.5G 內(nèi)存)

需要注意的幾點(diǎn):

1. MongoDB在32位操作系統(tǒng)出現(xiàn)“mmap failed with out of memory”錯(cuò)誤,這是因?yàn)樵?2位平臺(tái)中MongoDB不允許數(shù)據(jù)庫(kù)文件(累計(jì)總和)超過(guò)2G,而64位平臺(tái)沒(méi)有這個(gè)限制。如果在64位平臺(tái)中也報(bào)這個(gè)錯(cuò),一般是虛擬內(nèi)存不足所致。可以編輯/etc/profile文件加入ulimit -v unlimited,使用source /etc/profile讓設(shè)置生效或重啟生效。

2. oplog的大小和內(nèi)存沒(méi)有太大關(guān)系,oplogSize相當(dāng)于MySQL數(shù)據(jù)庫(kù)的binlog,從庫(kù)復(fù)制的數(shù)據(jù)都是從oplog也就是local這個(gè)庫(kù)讀取的。

--oplopgSize,指定了slave同步時(shí),更新日志保存的最大大小,最新版本的mongodb如果不指定參數(shù)的話(huà)默認(rèn)是硬盤(pán)空間的5%,如果設(shè)置太小,slave同步和主庫(kù)相差遠(yuǎn)超過(guò)了oplog的大小的話(huà),有可能會(huì)數(shù)據(jù)不一致。

參看官方文檔說(shuō)明:

http://www.mongodb.org/display/DOCS/Replication+Oplog+Length

3、使用mongoDB建議使用高性能sas硬盤(pán),追求性能可以考慮使用raid10硬盤(pán)。

三、mongodb占用空間過(guò)大的問(wèn)題

1、空間的預(yù)分配:為避免形成過(guò)多的硬盤(pán)碎片,mongodb每次空間不足時(shí)都會(huì)申請(qǐng)生成一大塊的硬盤(pán)空間,而且申請(qǐng)的量從64M、128M、256M那樣的指數(shù)遞增,直到2G為單個(gè)文件的最大體積。隨著數(shù)據(jù)量的增加,你可以在其數(shù)據(jù)目錄里看到這些整塊生成容量不斷遞增的文件。

2、字段名所占用的空間:為了保持每個(gè)記錄內(nèi)的結(jié)構(gòu)信息用于查詢(xún),mongodb需要把每個(gè)字段的key-value都以BSON的形式存儲(chǔ),如果value域相對(duì)于key域并不大,比如存放數(shù)值型的數(shù)據(jù),則數(shù)據(jù)的overhead是最大的。一種減少空間占用的方法是把字段名盡量取短一些,這樣占用空間就小了,但這就要求在易讀性與空間占用上作權(quán)衡了。建議把字段名作個(gè)index,每個(gè)字段名用一個(gè)字節(jié)表示,這樣就不用擔(dān)心字段名取多長(zhǎng)了。但這種索引方式需要每次查詢(xún)得到結(jié)果后把索引值跟原值作一個(gè)替換,再發(fā)送到客戶(hù)端,這個(gè)替換也是挺耗費(fèi)時(shí)間的。

3、刪除記錄不釋放空間:這個(gè)很容易理解,為避免記錄刪除后的數(shù)據(jù)的大規(guī)模挪動(dòng),原記錄空間不刪除,只標(biāo)記“已刪除”即可,以后還可以重復(fù)利用。

可以定期運(yùn)行db.repairDatabase()來(lái)整理記錄釋放空間,但這個(gè)過(guò)程會(huì)比較緩慢。

補(bǔ)充:

1、mongodb客戶(hù)端連接服務(wù)端出現(xiàn)異常

一般是因?yàn)闄C(jī)器異常重啟或硬關(guān)機(jī)造成的,解決方法為:

①刪除mongod.lock文件后,重新啟動(dòng)MongoDB即可。

rm -rf /data/mongodb/mongod.lock (此為mongodb數(shù)據(jù)存放的路徑)

②修復(fù)mongodb

mongod -repair -dbpath=/data/mongodb/data

2、mongodb的啟停

/opt/mongodb/bin/mongod -f /opt/mongodb/mongodb.conf     啟動(dòng)

/opt/mongodb/bin/mongo        停止

use admin

db.shutdownServer()

/opt/mongodb/bin/mongo    查看數(shù)據(jù)庫(kù)狀態(tài)

db.serverStatus()

操作補(bǔ)充:

  • 以下是mongodb啟動(dòng)時(shí)的常用參數(shù)說(shuō)明:

--bind_ip 綁定IP,綁定后只能綁定的IP訪(fǎng)問(wèn)服務(wù)
--dbpath 指定數(shù)據(jù)庫(kù)目錄
--port 指定數(shù)據(jù)庫(kù)端口,默認(rèn)是27107
--logpath 指定日志存放目錄
--logappend 使用追加的方式寫(xiě)日志
--pidfilepath 指定進(jìn)程文件,不指定則不產(chǎn)生進(jìn)程文件
--journal 啟用日志
--maxConns 最大的并發(fā)連接數(shù),默認(rèn)2000
--fork 將服務(wù)放到后臺(tái)運(yùn)行
--notablescan 不允許表掃描

--syncdelay 數(shù)據(jù)寫(xiě)入硬盤(pán)的時(shí)間(秒),0是不等待,直接寫(xiě)入

  • shell操作數(shù)據(jù)庫(kù):

    • 1.  超級(jí)用戶(hù)相關(guān):
              1. #進(jìn)入數(shù)據(jù)庫(kù)admin
               use admin
              2. #增加或修改用戶(hù)密碼
               db.addUser('name','pwd')
              3. #查看用戶(hù)列表
               db.system.users.find()
              4. #用戶(hù)認(rèn)證
               db.auth('name','pwd')
              5. #刪除用戶(hù)
               db.removeUser('name')
              6. #查看所有用戶(hù)
               show users
              7. #查看所有數(shù)據(jù)庫(kù)
               show dbs
              8. #查看所有的collection
               show collections
              9. #查看各collection的狀態(tài)
               db.printCollectionStats()
             10. #查看主從復(fù)制狀態(tài)
               db.printReplicationInfo()
             11. #修復(fù)數(shù)據(jù)庫(kù)
               db.repairDatabase()
             12. #設(shè)置記錄profiling,0=off 1=slow 2=all
               db.setProfilingLevel(1)
             13. #查看profiling
               show profile
             14. #拷貝數(shù)據(jù)庫(kù)
               db.copyDatabase('mail_addr','mail_addr_tmp')
             15. #刪除collection
               db.mail_addr.drop()
             16. #刪除當(dāng)前的數(shù)據(jù)庫(kù)
               db.dropDatabase()

  • 2. 增刪改 (其中下面的foo與user_addr為collection)
            1. #存儲(chǔ)嵌套的對(duì)象
               db.foo.save({'name':'ysz','address':{'city':'beijing','post':100096},'phone':[138,139]})
            2. #存儲(chǔ)數(shù)組對(duì)象
               db.user_addr.save({'Uid':'yushunzhi@sohu.com','Al':['test-1@sohu.com','test-2@sohu.com']})
            3. #根據(jù)query條件修改,如果不存在則插入,允許修改多條記錄
               db.foo.update({'yy':5},{'$set':{'xx':2}},upsert=true,multi=true)
            4. #刪除yy=5的記錄
               db.foo.remove({'yy':5})
            5. #刪除所有的記錄
               db.foo.remove()

  •   3. 索引 (其中下面的foo與user_addr為collection)
            1. #增加索引:1(ascending),-1(descending)
            2. db.foo.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
            3. #索引子對(duì)象
            4. db.user_addr.ensureIndex({'Al.Em': 1})
            5. #查看索引信息
            6. db.foo.getIndexes()
            7. db.foo.getIndexKeys()
            8. #根據(jù)索引名刪除索引
            9. db.user_addr.dropIndex('Al.Em_1')

  • 4. 查詢(xún) (其中下面的foo與user_addr為collection)
            1. #查找所有
           2. db.foo.find()
           3. #查找一條記錄
           4. db.foo.findOne()
           5. #根據(jù)條件檢索10條記錄
           6. db.foo.find({'msg':'Hello 1'}).limit(10)
           7. #sort排序
           8. db.deliver_status.find({'From':'ixigua@sina.com'}).sort({'Dt',-1})
            9. db.deliver_status.find().sort({'Ct':-1}).limit(1)
           10. #count操作
           11. db.user_addr.count()
           12. #distinct操作,查詢(xún)指定列,去重復(fù)
           13. db.foo.distinct('msg')
           14. #”>=”操作
           15. db.foo.find({"timestamp": {"$gte" : 2}})
           16. #子對(duì)象的查找
           17. db.foo.find({'address.city':'beijing'})

  •   5. 管理  (其中下面的deliver_status為collection)
            1. #查看collection數(shù)據(jù)的大小
            2. db.deliver_status.dataSize()
            3. #查看colleciont狀態(tài)
            4. db.deliver_status.stats()
            5. #查詢(xún)所有索引的大小
            6. db.deliver_status.totalIndexSize()

看完上述內(nèi)容,你們掌握如何進(jìn)行mongodb數(shù)據(jù)庫(kù)的問(wèn)題分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)站題目:如何進(jìn)行mongodb數(shù)據(jù)庫(kù)的問(wèn)題分析
網(wǎng)頁(yè)地址:http://chinadenli.net/article10/gogjdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)域名注冊(cè)服務(wù)器托管面包屑導(dǎo)航微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司