什么是MongoDB
創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,先為伊金霍洛等服務(wù)建站,伊金霍洛等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為伊金霍洛企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
MongoDB是由C++語言編寫的,是一個基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng)。
在高負(fù)載的情況下,添加更多的節(jié)點,可以保證服務(wù)器性能。
MongoDB旨在為web應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案。
MongoDB將數(shù)據(jù)存儲為一個文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對組成。MongoDB文檔類似于JSON對象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。
![](/upload/otherpic53/99634.jpg)
##主要特點
* MongoDB的提供了一個面向文檔 存儲,操作起來比較簡單和容易。
* 可以在MongoDB記錄中設(shè)置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現(xiàn)更快的排序。
* 可以通過本地或者網(wǎng)絡(luò)創(chuàng)建數(shù)據(jù)鏡像,這使得MongDB有更強(qiáng)的擴(kuò)展性。
* 如果負(fù)載的增加(需要更多的存儲空間和更強(qiáng)的處理能力),他可以分布在計算機(jī)網(wǎng)絡(luò)其他節(jié)點上,這就是所謂的分片。
* MongoDB支持豐富份查詢表達(dá)式,查詢指令使用JSON形式的標(biāo)記,可輕易查詢文檔中內(nèi)嵌的對象及數(shù)組。
* MongoDB使用update()命令可以實現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段。
* MongoDB中的Map/reduce主要用來對數(shù)據(jù)進(jìn)行批量處理和聚合操作。
* map和reduce。Map函數(shù)調(diào)用emit(key,value)遍歷集合中所有的記錄,將key和value傳給reduce函數(shù)處理。
* map函數(shù)和reduce函數(shù)使用JavaScript編寫的并可以通過db.runcommand或marpreduce命令執(zhí)行MapReduce操作。
* GridFS是MongDB中的一個內(nèi)置功能,可以用于存放大量小文件。
* MongoDB允許在服務(wù)端執(zhí)行腳本,可以用JavaScript編寫某個函數(shù),直接在服務(wù)端執(zhí)行,也可以把函數(shù)的定義存儲在服務(wù)端,下次直接調(diào)用即可。
* MongoDB支持各種編程語言:RUBY,PYTHON,JAVA,C++.PHP,C#等多種語言。
* MongoDB安裝簡單。
##MongoDB工具
有幾種可用于MongoDB的管理工具。
###監(jiān)控
MongoDB提供了網(wǎng)絡(luò)和系統(tǒng)監(jiān)控工具M(jìn)unin,它作為一個插件應(yīng)用于MongoDB中。
Gangila是MongoDB高性能的系統(tǒng)監(jiān)視的工具,它作為一個插件應(yīng)用于MongoDB中。
基于圖形界面的開源工具 Cacti, 用于查看CPU負(fù)載, 網(wǎng)絡(luò)帶寬利用率,它也提供了一個應(yīng)用于監(jiān)控 MongoDB 的插件。
###GUI
* Fang of Mongo – 網(wǎng)頁式,由Django和jQuery所構(gòu)成。
* Futon4Mongo – 一個CouchDB Futon web的mongodb山寨版。
* Mongo3 – Ruby寫成。
* MongoHub – 適用于OSX的應(yīng)用程序。
* Opricot – 一個基于瀏覽器的MongoDB控制臺, 由PHP撰寫而成。
* Database Master — Windows的mongodb管理工具
* RockMongo — 最好的PHP語言的MongoDB管理工具,輕量級, 支持多國語言.
##MongoDB安裝與部署
###1.安裝依賴包
` yum install -y openssl-devel openssl`
###2.下載mongodb包
`cd /home/test/tools`
`wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.4.tgz`
`tar xf mongodb-linux-x86_64-rhel62-3.2.4.tgz`
`mv mongodb-linux-x86_64-rhel62-3.2.4 /application/mongodb-3.2.4/`
`ln -s /application/mongodb-3.2.4/ /application/mongodb `
`mkdir -p /data/mongodb`
`mkdir -p /data/logs/mongodb`
`touch /data/logs/mongodb/mongodb.log`
`chmod -R 777 /data/logs/mongodb/mongodb.log`
###3.配置文件
vim /application/mongodb/bin/mongodb.conf
port=27017 #端口
dbpath= /data/mongodb #數(shù)據(jù)文件存放目錄
logpath=/data/logs/mongodb/mongodb.log #日志文件存放目錄
logappend=true #使用追加的方式寫日志
fork=true #以守護(hù)程序的方式啟用,即在后臺運行
maxConns=5000 #最大同時連接數(shù) 默認(rèn)2000
bind_ip=127.0.0.1,172.16.20.126 #只允許通過局域網(wǎng)IP:172.16.20.126及本機(jī)訪問
noauth=true #不啟用驗證
nohttpinterface=true
rest=false
###4.環(huán)境變量設(shè)置
echo 'export PATH=/application/mongodb/bin:$PATH' >> /etc/profile
source /etc/profile
###5.啟動與關(guān)閉
numactl --interleave=all /application/mongodb/bin/mongod --config /application/mongodb/bin/mongodb.conf
或
# numactl --interleave=all /application/mongodb/bin/mongod -f /application/mongodb/bin/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 20394
child process started successfully, parent exiting
正常停止方法:
/application/mongodb/bin/mongod --shutdown --dbpath /data/mongodb/
# ps aux | grep mongod
# kill -2 PID
或
# /application/mongodb/bin/mongo -port 27017
> use admin
> db.shutdownServer();
2015-03-19T00:43:27.760+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2015-03-19T00:43:27.760+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
不重啟服務(wù)器的情況下解決辦法,在Linux下執(zhí)行:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
服務(wù)器重啟后立即生效辦法:
# vi /etc/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
/bin/echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
/bin/echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
###6.開機(jī)自動啟動mongodb
vi /etc/rc.d/rc.local
/bin/rm -rf /data/mongodb/mongod.lock
/usr/bin/numactl --interleave=all /application/mongodb/bin/mongod -f /application/mongodb/bin/mongodb.conf
#Mongodb配置文件詳解
###在Mongod安裝包中,包含2個進(jìn)程啟動文件:mongod和mongos;其中mongod是核心基礎(chǔ)進(jìn)程,用來接收讀寫請求、負(fù)責(zé)存儲實際數(shù)據(jù),mongodb實例是構(gòu)成集群的基本單位,比如Replication set、sharding Cluster、Config Servers等;mongos是Sharding Cluster架構(gòu)模式中法人“路由”進(jìn)程,即客戶端請求訪問mongos,然后有mongos將請求轉(zhuǎn)發(fā)給合適的sharding server執(zhí)行操作,并將result返回給客戶端,所以mongos基本不存儲數(shù)據(jù),只是內(nèi)存中緩存部分shark key與sharding server的對應(yīng)關(guān)系,便于路由。
##重要配置參數(shù)講解
###1.processManagement:
fork:
#####描述:是否以fork模式運行mongod/mongos進(jìn)程,默認(rèn)false。
pidFilePath:<路徑>
#####描述:配合“fork:true”參數(shù),將mongod/mongos進(jìn)程ID寫入指定的文件,如果不指定,將不會創(chuàng)建PID文件。
###2.net:
bindip:<127.0.0.1>
#####描述:mongod/mongos進(jìn)程綁定的IP,application通過此IPport建立連接??梢越壎ㄔ谌我饩W(wǎng)卡接口上,如果你的mongos/mongod只需要內(nèi)網(wǎng)訪問,可以綁定在內(nèi)網(wǎng)IP,如果需要外網(wǎng)訪問,那么則綁定外網(wǎng)IP,如果此時值為“0.0.0.0”,則綁定到所有接口即內(nèi)網(wǎng)、外網(wǎng)IP均可以訪問。(不建議)可以綁定多個IP上,IP地址之間用“,”分割。
port:27017
#####描述:mongos、mongod偵聽端口,默認(rèn)27017;不過因為mongodb有兩種典型的架構(gòu)模式:replica set 和sharding,如果開發(fā)者在一個節(jié)點上部署多個mongod實例,需要注意修改此端口已避免沖突。
maxincomconnections:65536
#####描述:mongod/mongos進(jìn)程允許的最大連接數(shù),如果此值超過操作系統(tǒng)的配置的連接數(shù)閥值,將不會生效(ulimit);默認(rèn)值為65536.通常客戶端將會使用連接池機(jī)制,可以有效的控制每個客戶端的連接個數(shù)。
wireObjectCheck:true
#####描述:當(dāng)客戶端寫入數(shù)據(jù)時,mongod/mongos是否檢測數(shù)據(jù)的有效性(BSON),如果數(shù)據(jù)格式不良,此inster、update操作將會被拒絕;默認(rèn)為true
ipv6:false
#####描述“是否支持mongos/mongod多個實例之間使用IPV6網(wǎng)絡(luò),默認(rèn)值為false。此值需要整個cluster中保持一致。
###3.storage:
dbpath:db
#####描述:mongod進(jìn)程存儲數(shù)據(jù)目錄,此配置僅對mongod有效。默認(rèn)值為:/data/db
indexBuildRetry:true
#####描述:當(dāng)構(gòu)建索引時mongod意外關(guān)閉,那么在次啟動是否重新構(gòu)建索引;索引構(gòu)建失敗,mongod重啟后將會刪除尚未完成的索引,但是否重建由此參數(shù)決定。默認(rèn)值為true。
repairPath:_tmp
#####描述:配合--repair啟動命令參數(shù),在repair期間使用此目錄存儲臨時數(shù)據(jù),repair結(jié)束此目錄下數(shù)據(jù)將被刪除,此配置僅對mongod進(jìn)程有效,不建議在配置文件中配置,而是使用mongod啟動命令指定。
engine:mmapv1
#####描述:存儲引擎類型,mongod3.0之后支持“mmapv1”、“wiredTiger”兩種引擎,默認(rèn)值為“mmapv1”;官方宣稱wiredTiger引擎更加優(yōu)秀。
journal:enable;true
#####描述:是否開啟journal日志持久存儲,journal日志用來數(shù)據(jù)恢復(fù),是mongod最基礎(chǔ)的特性,通常用于故障恢復(fù)。64位系統(tǒng)默認(rèn)為true,32位默認(rèn)為false,建議開啟,僅對mongod進(jìn)程有效。
directoryPerDB:false
#####描述:是否將不同DB的數(shù)據(jù)存儲在不同的目錄中,dbPath的子目錄,目錄名為db的名稱。對已經(jīng)存儲數(shù)據(jù)的mongod修改此值,需要首先使用mongodump指令將數(shù)據(jù)導(dǎo)出,然后關(guān)閉mongod,再修改此值和指定新的dbPath,然后使用mongorestore指令重新導(dǎo)入數(shù)據(jù)。(即導(dǎo)出數(shù)據(jù),并使用mongorestore將數(shù)據(jù)重新寫入mongod的新目錄)
#####對于replica set架構(gòu)模式,只需要在每個secondary依次操作:關(guān)閉secondary ,然后配置新的dbPath,然后啟動即可(會執(zhí)行初始化sync,從primary中將數(shù)據(jù)去完全同步到本地)。最好操作primary。此參數(shù)僅對mongod進(jìn)程有效,默認(rèn)值為false,不建議修改此值
syncPeriodSecs:60
#####描述:mongod使用fsync操作將數(shù)據(jù)flush到磁盤的時間間隔,默認(rèn)值為60(單位:秒),強(qiáng)烈建議不要修改此值;mongod將變更的數(shù)據(jù)寫入journal后寫入內(nèi)存,并間歇性的將內(nèi)存數(shù)據(jù)flush到磁盤中,即延遲寫入磁盤,有效提升磁盤效率。此指令不影響journal存儲,僅對mongod有效。
mmapv1:(如下配置僅對MMAPV1引擎生效)
quota:enforce;false
#####描述:配額管理,是否限制每個DB所能持有的最大文件數(shù)據(jù),僅對mongod有效,默認(rèn)值為false,建議保持默認(rèn)值。
maxFilesPerDB:8
#####描述:如果enforce開啟,每個DB所持有的存儲文件不會超過此閥值。僅對mongod進(jìn)程有效。
smallFile:false
#####描述:是否使用小文件存儲數(shù)據(jù);如果此值為true,mongod將會限定每個數(shù)據(jù)文件的大小為512M(默認(rèn)最大為2G),journal降低到128M(默認(rèn)為1G)如果DB的數(shù)據(jù)量較大,將會導(dǎo)致每個DB創(chuàng)建大量的小文件,這對性能有一定的影響。在production環(huán)境下,不建議修改此值,在測試時可以設(shè)置為true,節(jié)約磁盤。
journal:commitlntervalMs:100
#####描述:mongod進(jìn)程提交journal日志的時間間隔,即fsync的間隔??紤]到磁盤效果,mongod間歇性的flush日志數(shù)據(jù);此值越小,數(shù)據(jù)丟失的可能性越低,磁盤消耗越低,性能越低。如果希望write操作強(qiáng)制立即寫入journal,可以傳遞參數(shù)選項“journal:true”(在客戶端write操作中指定此選項即可),此操作(包括此前尚未提交的)將會立即fsync到磁盤。僅對mongod有效,單位:毫秒
#####nsSize:每個database的namespace文件的大小,默認(rèn)為16,單位:M;最大值可以設(shè)置為2048,即會增加一下“.ns”后綴文件的大小。16M基本上可以保存24000條命名條目,新建一個collection或者index信息,即會增加一個namespace條目;如果你的database下需要創(chuàng)建大量的collection(比如數(shù)據(jù)分析),則可以適度調(diào)大此值。
wiredTiger:(如下配置僅對wiredTiger引擎生效 3.0以上版本)
engineConfig:cacheSizeGB:8
#####描述:wiredTiger緩存工作集(working set)數(shù)據(jù)的內(nèi)存大小,單位:GB,此值決定了wiredTiger與mmapv1的內(nèi)存模型不同,它可以限制mongod對內(nèi)存的使用量,而mmapv1則不能(依賴于系統(tǒng)級別的mmap)。默認(rèn)情況下,cacheSizeGB的值為假定當(dāng)前節(jié)點只部署一個mongod實例,此值的大小為物理內(nèi)存的一半;如果當(dāng)前節(jié)點部署了多個mongod進(jìn)程,那么需要合理配置此值。如果mongod部署在虛擬容器中(比如,lxc,cgroups,Docker)等,它將不能的使用整個系統(tǒng)的物理內(nèi)存,則需要適當(dāng)調(diào)整此值。默認(rèn)值為物理內(nèi)存的一半。
journalCompressor:snappy
#####描述:journal日志的壓縮算法,可選值為“none”"snappy"、“zlib”
directoryForlndexes:false
#####描述:是否將索引和collection數(shù)據(jù)分別存儲在dbPath單獨的目錄中。即index數(shù)據(jù)保存“index”子目錄,collection數(shù)據(jù)保存在“collection”子目錄,默認(rèn)值為false,僅對mongod有效。
collectionconfig:
blockCompressor:snappy
#####描述:collection數(shù)據(jù)壓縮算法,可選值“none”、“snappy”、“zlib”。開發(fā)者在創(chuàng)建collection時可以指定值,以覆蓋此配置項。如果mongod中已經(jīng)存在數(shù)據(jù),修改次值不會帶來問題,舊數(shù)據(jù)仍然使用原來的算法解壓,新數(shù)據(jù)文件將會采用新的解壓縮算法。
indexConfig:
prefixcompress:true
#####描述:是否對索引數(shù)據(jù)使用“前綴壓縮”(prefix compress,一種算法)。前綴壓縮,對那些經(jīng)過排序的值存儲,有很大的幫助,可以有效的減少數(shù)據(jù)的內(nèi)存使用量,默認(rèn)值為true.
###4.operationProfiling:
slowOpThresholdMs:100
####描述:數(shù)據(jù)庫profile判定一個操作是”慢查詢“的時間閥值,單位毫秒;mongdb將會把慢查詢記錄到日志中,即使profile被關(guān)閉。當(dāng)profile開啟時,慢查詢記錄還會被寫入”system.profile“這個系統(tǒng)的collection中,默認(rèn)值只對mongd進(jìn)程有效。
mode :off
####描述:數(shù)據(jù)庫profiler級別,操作的性能信息將會被寫入日志文件中,可選值:
1)off:關(guān)閉profiling
2)slowOp:on,只包含操作日志
3)all:on,記錄所有操作
數(shù)據(jù)庫profiling會影響性能,建議只在性能調(diào)試階段開啟。此參數(shù)僅對mongd有效。
###5.replication:(復(fù)制集架構(gòu)模式配置,如果只是單點,則無需配置)
oplogSizeMB:10240
#####描述:replication操作日志的最大尺寸,單位:MB。mongod進(jìn)程根據(jù)磁盤最大可用空間來創(chuàng)建oplog,比如64位操作系統(tǒng),oplog為磁盤可用空間的5%,一旦mongd創(chuàng)建了oplog文件,此后再次修改oplogSizeMB將不會生效。此值不要設(shè)置的大小,應(yīng)該足以保存24小時的操作日志,以保證secondary有充足的維護(hù)時間;如果太小,secondary將不能通過oplog來同步數(shù)據(jù),只能全量同步,此值僅對mongd有效。
enableMajorityReadConcern:false
####描述:是否開啟readConcern的級別為“majority”,默認(rèn)值為false;只有開啟此選項,才能在read操作中使用“majority”。(3.2+版本)
replSetName: <無默認(rèn)值>
####描述:“復(fù)制集”的名稱,復(fù)制集中的所有mongd實例都必須有相同的名字,sharding分布式下,不同的sharding應(yīng)該使用不同的replSetName。僅對mongod有效
secondaryIndexPrefetch: all
#### 描述:只對mmapv1存儲引擎有效。復(fù)制集中的secondary,從oplog中運用變更操作之前,將會先把索引加載到內(nèi)存中,默認(rèn)情況下,secondaries首先將操作相關(guān)的索引加載到內(nèi)存,然后再根據(jù)oplog應(yīng)用操作。可選值:
1)none:secondaries不將索引數(shù)據(jù)加載到內(nèi)容
2)all:sencondaries將此操作有關(guān)的索引數(shù)據(jù)加載到內(nèi)存
3)_id_only:只加載_id索引
默認(rèn)值為:all,此配置僅對mongod有效。
localPingThresholdMs: 15
####描述:ping時間,單位:毫秒,mongos用來判定將客戶端read請求發(fā)給哪個secondary。僅對mongos有效。默認(rèn)值為15,和客戶端driver中的默認(rèn)值一樣。當(dāng)mongos接收到客戶端read請求,它將:
1、找出復(fù)制集中ping值最小的member。
2、將延遲值被此值允許的members,構(gòu)建一個列表
3、從列表中隨機(jī)選擇一個member。
####ping值是動態(tài)值,每10秒計算一次。mongos將客戶端請求轉(zhuǎn)發(fā)給延遲較?。ㄅc此值相比)的某個secondary節(jié)點。僅對mongos有效。
###6sharding:(僅對sharding架構(gòu)模式下有效)
clusterRole: <無默認(rèn)值>
####描述:在sharding集群中,此mongod實例的角色,可選值:
1、configsvr:此實例為config server,此實例默認(rèn)偵聽27019端口
2、shardsvr:此實例為shard(分片),偵聽27018端口
此配置僅對mongod有效。通常config server和sharding server需要使用各自的配置文件。
archiveMovedChunks: true
####描述:當(dāng)chunks因為“負(fù)載平衡”而遷移到其他節(jié)點時,mongod是否將這些chunks歸檔,并保存在dbPath下“moveChunk”目錄下,mongod不會刪除moveChunk下的文件。默認(rèn)為true。
autoSplit: true
####描述:是否開啟sharded collections的自動分裂,僅對mongos有效。如果所有的mongos都設(shè)定為false,那么collections數(shù)據(jù)增長但不能分裂成新的chunks。因為集群中任何一個mongos進(jìn)程都可以觸發(fā)split,所以此值需要在所有mongos行保持一致。僅對mongos有效。
configDB: <無默認(rèn)值>
####描述:設(shè)定config server的地址列表,每個server地址之間以“,”分割,通常sharded集群中指定1或者3個config server。(生產(chǎn)環(huán)境,通常是3個config server,但1個也是可以的)。所有的mongos實例必須配置一樣,否則可能帶來不必要的問題。僅對mongos有效。
chunkSize: 64
####描述:sharded集群中每個chunk的大小,單位:MB,默認(rèn)為64,此值對于絕大多數(shù)應(yīng)用而言都是比較理想的。chunkSize太大會導(dǎo)致分布不均,太小會導(dǎo)致分裂成大量的chunk而經(jīng)常移動
##整個sharding集群中,此值需要保持一致,集群啟動后修改此值將不再生效。僅對mongos有效。
###7、sytemsLog:(系統(tǒng)日志,必須配置)
verbosity: 0
###描述:日志級別,0:默認(rèn)值,包含“info”信息,1~5,即大于0的值均會包含debug信息
quiet: true
####描述:"安靜",此時mongod/mongos將會嘗試減少日志的輸出量。不建議在production環(huán)境下開啟,否則將會導(dǎo)致跟蹤錯誤比較困難。
traceAllExceptions: true
####描述:打印異常詳細(xì)信息。
path: logs/mongod.log
logAppend: false
####描述:如果為true,當(dāng)mongod/mongos重啟后,將在現(xiàn)有日志的尾部繼續(xù)添加日志。否則,將會備份當(dāng)前日志文件,然后創(chuàng)建一個新的日志文件;默認(rèn)為false。
logRotate: rename
####描述:日志“回轉(zhuǎn)”,防止一個日志文件特別大,則使用logRotate指令將文件“回轉(zhuǎn)”,可選值:
1)rename:重命名日志文件,默認(rèn)值。
2)reopen:使用linux日志rotate特性,關(guān)閉并重新打開此日志文件,可以避免日志丟失,但是logAppend必須為true。
destination: file
####描述:日志輸出目的地,可以指定為“ file”或者“syslog”,表述輸出到日志文件,如果不指定,則會輸出到標(biāo)準(zhǔn)輸出中(standard output)。
###8、與安全有關(guān)的配置(摘要介紹)
####Java代碼 收藏代碼
###security:
authorization: enabled
clusterAuthMode: keyFile
keyFile: /srv/mongodb/keyfile
javascriptEnabled: true
###setParameter:
enableLocalhostAuthBypass: true
authenticationMechanisms: SCRAM-SHA-1
1)authorization:disabled或者enabled,僅對mongod有效;表示是否開啟用戶訪問控制(Access Control),即客戶端可以通過用戶名和密碼認(rèn)證的方式訪問系統(tǒng)的數(shù)據(jù),默認(rèn)為“disabled”,即客戶端不需要密碼即可訪問數(shù)據(jù)庫數(shù)據(jù)。(限定客戶端與mongod、mongos的認(rèn)證)
2)clusterAuthMode:集群中members之間的認(rèn)證模式,可選值為“keyFile”、“sendKeyFile”、“sendX509”、“x509”,對mongod/mongos有效;默認(rèn)值為“keyFile”,mongodb官方推薦使用x509,不過我個人覺得還是keyFile比較易于學(xué)習(xí)和使用。不過3.0版本中,mongodb增加了對TLS/SSL的支持,如果可以的話,建議使用SSL相關(guān)的配置來認(rèn)證集群的member,此文將不再介紹。(限定集群中members之間的認(rèn)證)
3)keyFile:當(dāng)clusterAuthMode為“keyFile”時,此參數(shù)指定keyfile的位置,mongodb需要有訪問此文件的權(quán)限。
4)javascriptEnabled:true或者false,默認(rèn)為true,僅對mongod有效;表示是否關(guān)閉server端的javascript功能,就是是否允許mongod上執(zhí)行javascript腳本,如果為false,那么mapreduce、group命令等將無法使用,因為它們需要在mongod上執(zhí)行javascript腳本方法。如果你的應(yīng)用中沒有mapreduce等操作的需求,為了安全起見,可以關(guān)閉javascript。
“setParameter”允許指定一些的Server端參數(shù),這些參數(shù)不依賴于存儲引擎和交互機(jī)制,只是微調(diào)系統(tǒng)的運行狀態(tài),比如“認(rèn)證機(jī)制”、“線程池參數(shù)”等。參見【parameter】
1)enableLocalhostAuthBypass:true或者false,默認(rèn)為true,對mongod/mongos有效;表示是否開啟“l(fā)ocalhost exception”,對于sharding cluster而言,我們傾向于在mongos上開啟,在shard節(jié)點的mongod上關(guān)閉。
2)authenticationMechanisms:認(rèn)證機(jī)制,可選值為“SCRAM-SHA-1”、“MONGODB-CR”、“PLAN”等,建議為“SCRAM-SHA-1”,對mongod/mongos有效;一旦選定了認(rèn)證機(jī)制,客戶端訪問databases時需要與其匹配才能有效。
###9、與性能有關(guān)的參數(shù)
##Java代碼 收藏代碼
###setParameter:
connPoolMaxShardedConnsPerHost: 200
connPoolMaxConnsPerHost: 200
notablescan: 0
1)connPoolMaxShardedConnsPerHost:默認(rèn)值為200,對mongod/mongos有效;表示當(dāng)前mongos或者shard與集群中其他shards鏈接的鏈接池的最大容量,此值我們通常不會調(diào)整。連接池的容量不會阻止創(chuàng)建新的鏈接,但是從連接池中獲取鏈接的個數(shù)不會超過此值。維護(hù)連接池需要一定的開支,保持一個鏈接也需要占用一定的系統(tǒng)資源。
2)connPoolMaxConnsPerHost:默認(rèn)值為200,對mongod/mongos有效;同上,表示mongos或者mongod與其他mongod實例之間的連接池的容量,根據(jù)host限定。
##配置樣例
####mongodb 3.0之后配置文件采用YAML格式,這種格式非常簡單,使用
###Java代碼 收藏代碼
Error parsing YAML config file: yaml-cpp: error at line 3, column 1: illegal tab when looking for indentation
Error parsing YAML config file: yaml-cpp: error at line 15, column 12: illegal map value
###1、mongod.conf
###Java代碼 收藏代碼
###systemLog:
quiet: false
path: /data/mongodb/logs/mongod.log
logAppend: false
destination: file
###processManagement:
fork: true
pidFilePath: /data/mongodb/mongod.pid
###net:
bindIp: 127.0.0.1
port: 27017
maxIncomingConnections: 65536
wireObjectCheck: true
ipv6: false
###storage:
dbPath: /data/mongodb/db
indexBuildRetry: true
journal:
enabled: true
directoryPerDB: false
engine: mmapv1
syncPeriodSecs: 60
mmapv1:
quota:
enforced: false
maxFilesPerDB: 8
smallFiles: true
journal:
commitIntervalMs: 100
wiredTiger:
engineConfig:
cacheSizeGB: 8
journalCompressor: snappy
directoryForIndexes: false
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
###operationProfiling:
slowOpThresholdMs: 100
mode: off
####如果你的架構(gòu)模式為replication Set,那么還需要在所有的“復(fù)制集”members上增加如下配置:
###Java代碼 收藏代碼
###replication:
oplogSizeMB: 10240
replSetName: rs0
secondaryIndexPrefetch: all
####如果為sharding Cluster架構(gòu),則需要在shard節(jié)點增加如下配置:
###Java代碼 收藏代碼
####sharding:
clusterRole: shardsvr
archiveMovedChunks: true
####當(dāng)然,一個mongod實例即可以為“復(fù)制集”的member之一,也可以作為sharding集群中的一個分片,這取決你的架構(gòu)模式。
####mongod進(jìn)程可以做為“config server”實例,只需要將“clusterRole: configsvr”即可;由此可見,一個mongod實例可以為“單點實例”、“config server”、“sharding server” + “replication set member”其中一個角色,建議使用不同的配置文件啟動它。
###2、mongos.conf
###Java代碼 收藏代碼
###systemLog:
quiet: false
path: /data/mongodb/logs/mongod.log
logAppend: false
destination: file
###processManagement:
fork: true
pidFilePath: /data/mongodb/mongod.pid
###net:
bindIp: 127.0.0.1
port: 37017
maxIncomingConnections: 65536
wireObjectCheck: true
ipv6: false
###replication:
localPingThresholdMs: 15
###sharding:
autoSplit: true
configDB: m1.com:27018,m2.com:27018,m3.com:27018
chunkSize: 64
####mongos實例不需要存儲實際的數(shù)據(jù),對內(nèi)存有一定的消耗,在sharding架構(gòu)模式下使用;mongos需接收向客戶端請求(后端的sharded和replication set則不需要讓客戶端知道),它可以將客戶端請求轉(zhuǎn)發(fā)到一個分片集群上(分片集群基于復(fù)制集)延遲相對較小的secondary上,同時還負(fù)責(zé)chunk的分裂和遷移工作。
##其他
###1、啟動與關(guān)閉
####配置文件中絕大部分參數(shù),都可以通過進(jìn)程啟動命令指定,通常啟動命令行中的參數(shù)將覆蓋配置文件中的參數(shù)。
####Java代碼 收藏代碼
./mongod -f mongod.conf
####當(dāng)然,也可以通過使用多個命令行參數(shù)來啟動,如下僅為示例:
###Java代碼 收藏代碼
./mongod --bind_ip 127.0.0.1 --port 27017 --dbpath /data/mongodb/db --logpath /data/mongodb/logs --storageEngine mmapv1 --fork
####mongod配置中所指定的目錄地址必須首先創(chuàng)建,否則將無法啟動,這有別與其他系統(tǒng)。
#####mongos啟動方式同上。如果希望基于service方式啟動mongod、mongos,請參考其他文檔??梢酝ㄟ^kill指令來關(guān)閉mongod進(jìn)程,不過這種方式有些粗暴,在production環(huán)境中可能會導(dǎo)致數(shù)據(jù)損壞,建議使用mongo shell來“cleanly”關(guān)閉mongod進(jìn)程,這種方式安全而且不會導(dǎo)致數(shù)據(jù)損壞。
###Java代碼 收藏代碼
./mongo
> use admin;
> db.shutdownServer();
####可以使用“kill
###2、repair
####“修復(fù)”數(shù)據(jù)庫,當(dāng)mongodb運行一段時間之后,特別是經(jīng)過大量刪除、update操作之后,我們可以使用repair指令對數(shù)據(jù)存儲進(jìn)行“repair”,它將整理、壓縮底層數(shù)據(jù)存儲文件,重用磁盤空間,相當(dāng)于數(shù)據(jù)重新整理了一遍,對數(shù)據(jù)優(yōu)化有一定的作用。
####如果mongod沒有開啟journaling日志功能,repair指令可以在系統(tǒng)異常crash之后,用于整理數(shù)據(jù)、消除損壞數(shù)據(jù);如果開啟了journaling日志功能,我們則需不要使用repair來修復(fù)數(shù)據(jù),因為journal就可以幫助mongod恢復(fù)數(shù)據(jù)。在replication set模式下,可以使用repair,但是通??梢灾苯觿h除舊數(shù)據(jù),使用“數(shù)據(jù)同步”操作,即可達(dá)到“恢復(fù)”、“整理”數(shù)據(jù)的目的,效果和repair一樣,而且效率更高。
####repair需要磁盤有一定的剩余空間,為當(dāng)前database數(shù)據(jù)量 + 2GB,可以通過使用“--repairpath”來指定repair期間存儲臨時數(shù)據(jù)的目錄。repair指令還會重建indexes,可以降低索引的數(shù)據(jù)大小。
####如果mongod意外crash,需要首先正常啟動mongod,讓根據(jù)journal日志恢復(fù)完數(shù)據(jù)之后,才能執(zhí)行repair;如果journal日志有數(shù)據(jù)尚未恢復(fù),那么使用repair指令啟動mongod將會失敗。
####repair時需要關(guān)閉mongod進(jìn)程,執(zhí)行完畢后再啟動。
###Java代碼 收藏代碼
./mongod --dbpath=/data/mongodb/db --repair
####mongodb比較傾向于使用shell來repair特定的database,這個操作相對比較可控,其內(nèi)部工作機(jī)制一樣。
###Java代碼 收藏代碼
>./mongo
>user mydatabase;
>db.repairDatabase();
###3、mongodump與mongorestore
####我們通常會使用到mongodb數(shù)據(jù)的備份功能,或者將一個備份導(dǎo)入到一個新的mongod實例中(數(shù)據(jù)冷處理),那么就需要借助這兩個指令。
#### mongodump將整個databases全部內(nèi)容導(dǎo)出到一個二進(jìn)制文件中,可以在其他mongod使用mongorestore來加載整個文件。需要注意mongodump不會導(dǎo)出“l(fā)ocal”數(shù)據(jù)庫中的數(shù)據(jù),當(dāng)然這個local庫對恢復(fù)數(shù)據(jù)也沒有太大意義。
#### “-u”參數(shù)指定訪問database的用戶名,“-p”指定密碼,“--host”和“--port”指定mongod實例的位置,“--db”指定需要dump的數(shù)據(jù)庫,如果不指定則dump所有數(shù)據(jù)庫,“--collection”指定需要dump的集合表,如果不指定則dumpl整個db下的所有collections;“--query
###Java代碼 收藏代碼
>./mongodump --host m1.com --port 27017 -u root -p pass --out /data/mongodb/backup/dump_2015_10_10
####mongorestore則將dump的數(shù)據(jù)文件導(dǎo)入到database,mongorestore可以創(chuàng)建新的database或者將數(shù)據(jù)添加到現(xiàn)有的database中。如果將數(shù)據(jù)restore到已經(jīng)存在的database中,mongorestore僅執(zhí)行insert,不會執(zhí)行update,如果數(shù)據(jù)庫中已經(jīng)存在相同的“_id”數(shù)據(jù),mongorestore不會覆蓋原有的document。mongorestore會重新創(chuàng)建indexes,所有的操作都是insert而不會update。
####基本指令類似于mongodump,“--db”指定需要將數(shù)據(jù)restore到哪個db中,如果此db不存在,則創(chuàng)建;如果沒有指定“--db”,mongorestore則根據(jù)原始數(shù)據(jù)所屬的db重新創(chuàng)建,這可能會導(dǎo)致數(shù)據(jù)覆蓋。“--drop”表示在restore數(shù)據(jù)之前,首先刪除目標(biāo)db中原有的collections,--drop不會刪除那些在dump文件中沒有的collection?!?-stopOnError”表示出錯時強(qiáng)制退出。
###Java代碼 收藏代碼
./mongorestore --db mydatabase /data/mongodb/backup/dump_2015_10_10
###4、mongoimport和mongoexport
####mongoexport將數(shù)據(jù)導(dǎo)出為JSON或者CSV格式,以便其他應(yīng)用程序解析。
####因為mongodb數(shù)據(jù)是BSON格式,有些數(shù)據(jù)類型是JSON不具有的,所以導(dǎo)出JSON格式會仍然會丟失數(shù)據(jù)類型;所以如果導(dǎo)出的數(shù)據(jù)是準(zhǔn)備給其他mongodb恢復(fù)數(shù)據(jù),那么建議使用mongodump和mongorestore。
####命令參數(shù)同3)
###5、mongostat指令可以間歇性的打印出當(dāng)前mongod實例中“數(shù)據(jù)存儲”、“flush”、讀寫次數(shù)、網(wǎng)絡(luò)輸出等參數(shù),是查看mongod性能的有效手段。mongotop可以根據(jù)查看各個database下讀寫情況。
###6、mongo shell操作簡述:
1)help:列出所有的function
2)show dbs:展示當(dāng)前實例中所有的databases。
3)use
4)show collections:展示出當(dāng)前db中所有的collections。
5)show users:展示當(dāng)前db中已經(jīng)添加的所有用戶。
6)show roles:展示當(dāng)前db中所有內(nèi)置的或者自定義的用戶角色。
7)show profile:這涉及到profile相關(guān)的配置,默認(rèn)情況下展示出最近5個操作耗時超過1秒的操作,通常用于跟蹤慢查詢。
8)db.help():展示出可以在db上進(jìn)行的操作function。
9)db.