如何進(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ō)明。
我們可以在數(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)