Mongodb Manual閱讀筆記:CH2 Mongodb CRUD 操做
Mongodb Manual閱讀筆記:CH3 數據模型(Data Models)
Mongodb Manual閱讀筆記:CH4 管理
Mongodb Manual閱讀筆記:CH5 安全性
Mongodb Manual閱讀筆記:CH6 聚合
Mongodb Manual閱讀筆記:CH7 索引
Mongodb Manual閱讀筆記:CH8 複製集
Mongodb Manual閱讀筆記:CH9 Shardingjavascript
4 管理html
4.1 管理概念java
4.1.1 操做策略mysql
4.1.1.1 備份策略linux
4.1.1.4導入導出sql
4.1.1.5 產品注意點mongodb
4.1.2 數據管理shell
4.1.3.2 使用Capped Collection作先入先出
4.2.1.6 管理日誌(同mysql bin-log,sql server的事務日誌)
本節介紹操做mongodb的策略和實踐
主要介紹1,Mongodb系統的備份策略,2.Mongodb的監控,3.在線配置,4.導入導出
5.注意點
備份可讓數據保持一致性和可用性,並測試備份保證備份的可用。
1.在位子上,要和主庫分開
2.系統錯誤,當出現硬件錯誤或者磁盤錯誤是,能夠從備份中成功恢復
3.生產環境約束,備份操做有時會要求大量的系統資源,因此要和業務高峯分開,避免影響
4.系統兼容性,如一些block-level快照工具須要支持的系統或者一些基礎設備
5.數據庫配置,複製集和shard會影響備份的實現
6.實際的需求,對重要數據和不重要數據區別對待
備份方法分爲2種:
1.二進制方式的備份,使用mongodbdump工具對數據庫進行dump,可是不能抓取到某個時間點的備份。
2.建立文件系統鏡像,有時候會使用block level備份,會產生比較大的備份,可是快速,能夠體現某個時間點的備份。
備份的選擇依賴於部署和容災恢復的須要。
對於某些場景來講,備份是很困難的或者不太可能的,由於數據量很大,又是分佈式的,這樣的狀況下,能夠考慮增長複製集。
Shard集羣備份考慮:對於shard集羣來講抓取某個點的數據,必須中止全部的寫入,否則抓取的只多是近似某個時間點的快照。你能夠備份shard的複製集的secondary的近似某個點的備份,前提是應用能夠接受近視某個點的數據。
複製集備份考慮:複製集備份2個方案:
1.在secondary上建立一個快照,而後備份,固然也能夠建立一個隱藏的成員專門用於
2.也可使用mongodump程序使用 --oplog來備份,用mongorestore程序--oplogReplay 來恢復。
若是在shard下,每一個shard都是一個複製集,能夠備份某個成員來完成,可是仍是要關閉均衡器。在secondary上建立備份能夠不影響primary性能。
主要介紹一些監控方法和一些監控工具
有3種方法收集當前mongodb的狀態:
1.使用和mongodb一塊兒發佈的試試報表
2.使用數據庫命令,獲取當先數據庫的狀態
3.使用MMS mongodb 監控服務,收集Mongodb信息,提供可視化的,和一些告警,目前是免費的。
工具:Mongodb發佈時帶了一些報告工具,Mongostat,mongotop,
REST接口:mongodb提供了一個REST接口,能夠用來配置監控,和設置告警,要開啓要帶上啓動參數--rest或者在配置文件上面rest=true
HTTP 命令行:mongodb提供web版命令行,能夠數據localhost:<port>這個端口是mongod端口加1000。
mongodb還提供了一些命令開報告數據庫當前狀態。
serverStatus:serverStatus或者db.serverStatus()能夠看數據庫當前狀態,這個命令通常不直接運行,通常是經過統計
dbStatus:dbStats或者db.stats()範圍當前存儲的使用,監控指定數據庫的狀態,存儲能力
collstats:collStats提供Collection級別的一些信息
replSetGetStatus:replSetGetStatus命令也可使用rs.status(),查看大概的複製集的狀態,使用這個數據確保複製是否配置,並檢查host和複製集的狀態
有一些開源的工具,能夠看手冊p140,還有就是SaaS服務。
mongod和mongos會記錄全部的服務狀態到標準輸出或者日誌文件中有一些配置參數:
1.quite. 限制大量信息被寫入到日誌或者標準輸出
2.verbose.增長大量信息寫入到日誌或者輸出
3.logpath.寫入到日誌文件
4.logappend.增長信息到已有文件中,而不是覆蓋。
有2個命令會影響日誌:
1.getLog.輸出當前進程日誌
2.logRotate.切換日誌
性能下降每每和數據量,內存,鏈接數,鎖定時間有關。性能問題涉及,負荷,訪問方式,可用資源,索引設計,甚至程序設計。
鎖:mongodb使用鎖來保證數據的可用性,若是serverStatus輸出中globalLock.currentQueue.total一直很高,那麼說明又大量請求在等待這個鎖,說明是併發引發的問題。
globalLock.totaltime至關於服務啓動時間,gobalLoc.radio=locktime/totaltime,比例越高說明被鎖定的時間越長,多是慢查詢,系統結構問題,或者內存不夠。
內存使用:Mongodb使用文件映射的方式來保存數據,讓數據都在內存,這樣才能保證數據庫較高的性能,serverStatus會輸出內存使用的狀況,mem.resident若是超過內存系統內存那麼表示數據在硬盤而不是在內存。mem.mapped若是這個值大於系統內存,有可能會形成頁錯誤。
頁錯誤:若是mongodb請求數據再也不內存中,那麼就會發生也錯誤,要到虛擬文件中加載數據。能夠查看serverStatus中的extra_info.page_faults。一個錯誤頁並非問題,可是出現不少錯誤頁的時候,就表示內存不足,mongodb中發生頁錯誤時,線程會退讓,讓其餘線程先運行以提升併發。
鏈接數:鏈接數過大會給服務帶來巨大的性能問題,serverStatus提供一下幾個關於鏈接的信息:
1.globalLock.activeClients 包含了活動的客戶端總數
2.connections包含2個current當前客戶端的總數,available全部未使用的鏈接的總數
對於包併發的請求,能夠根據需求使用讀寫分離或者shard。
大量固定的鏈接也多是驅動的問題,每一個驅動都是實現鏈接池的,大量的鏈接可是沒有被使用就說明驅動或者其餘配置有問題。
Database Profiling:Profile能夠幫忙記錄全部的非有效查詢,有3個級別:
1.0表示關閉
2.1表示值抓取slow
3.2表示所有抓取
當配置1時可使用db.setProfilingLevel()來設置級別也能夠用來指定slow閥值。
監控複製集必定要監控複製延遲,有2個問題可能會是複製延遲形成的:
1.若出現延遲,並無複製到secondary,一旦崩潰就會形成一致性問題
2.若是secondary落後超過了oplog,mongodb會啓動從新初始化同步。oplog能夠在配置文件中配置,若是不配置使用默認大小,默認全部可用空間的5%。
複製延遲要不就是網絡問題,要就是primary資源不足以支持應用。能夠經過rs.status(),其中有個值optimeDate反應最後一個項被應用到複製集的時間。
配置服務:配置服務維護了哪些數據是放在哪一個shard下面的。shard之間會更新這樣的記錄,當配置服務不可訪問的時候,整個shard操做就不能進行了,已經在訪問的不受影響。
因此配置服務不可用是一個很嚴重的問題。要監控配置服務是否運行正常。
均衡和記錄複製:高效的shard集羣,會把配置服務器也放在均衡器下,提升配置服務的可用性。
鎖過時:在均衡器上使用的鎖,當過時以後就會被自動釋放,任何長時間的鎖都會影響均衡器的性能。能夠切換到config數據庫,而後使用db.locks.find()查看鎖狀況。
介紹通用的配置,最佳實踐配置的場景,主要經過配置文件爲接口,使用--config或者-f 加配置文件。
基本配置參數:
1.fork,若是爲true以服務方式運行
2.bind_ip,指定一個ip,表示服務器只偵聽這個這個ip
3.port,是指綁定的端口默認爲27017
4.quite,爲true表示大多數信息都不寫入日誌文件,能夠在在線的時候用setParameter修改
5.logpath,指定mongod進程日誌輸出位置
6.logappend,爲true追加到文件中,而不是覆蓋
7.journal,爲true表中寫入操做的可持久性
1.bind_ip,能夠配置多個用逗號隔開,只容許這些ip訪問
2.nounixsocket,爲true禁用unix socket,默認爲可用
3.auth,爲true,開啓mongodb認證系統,要建立用戶認證信息
複製配置:複製很簡單,只要設置replSet=set0,經過設置keyFile啓動複製集認證。設置keyFile啓動認證而且指定一個key file對應複製集成員的使用。
Shard配置:configsvr=true表示建立一個config 服務,運行在bind_ip的port上,shardsvr配置shard服務,shard還要配置configdb,經過chunkSize修改chunk大小,可是不建議修改。
dbpath,指定數據庫文件夾位置,padfilepath指定mongod的進程id文件。
1.slowms用於配置數據庫profile slow閥值
2.profile 設置profiler級別,
3.verbose 啓動verbose日誌模式,mongod輸出和增長日誌的事件。verbose通常只在看不出問題的時候使用,v=ture表示啓動verbose,每增長一個v表示額外的日誌。
4.diaglog,啓動爭端日誌,Level 3記錄全部的讀取和寫入
5.objcheck,強制mongod驗證全部從客戶端的執回
6.cpu,強制mongod報告,最後一個間隔花在write lock上面的比例,這個間隔一般是4s
JSON不支持BSON不少數據類型,當decode BSON文檔到JSON會形成一些精度丟失
無論你決定如何導入導出數據,考慮一下幾條:
1.標記文件制定何時啓動的備份
2.標記標記能夠描述備份的上下文那些數據備份了
3.若是對備份有不利影響時,不要啓動導出
4.保證可以反映數據一致性
5.經過恢復和導入,測試備份和導出
可使用copydb,clone,cloneCollection命令,mongo提供db.copyDatabase()方法。
使用mongoexport導出Collection : mongpexport --collection collection --out collection.json。
默承認以使用--jsonArray導出json數組,--csv導出csv。若是沒有開mongod能夠指定數據庫文件。被指定數據庫文件後,文件會被鎖定,mongod不能附加這些文件。
使用mongoimport導入Collection:格式和導出相似,能夠指定--upsert表示會試圖更新已有的文檔。還可使用--journal指定生產日誌。
MongoDB:通常都使用64bit,對於32bit,mongodb能夠用於測試開發環境,並不適合產品部署,可是不能保存大於2GB數據。
操做系統:mongodb目前支持,MAC OS X,Linux,Windows Server 2008 R2,Windows7
每一個數據庫都有一個讀寫鎖。
MongoDB使用順序寫入的方式寫入到磁盤來保證數據操做的持久性。爲了保證crash後可用,你能夠啓動journal。
使用信任的網絡環境:默認mongo不啓動認證,認爲環境是可信任的。若是是敏感的系統能夠指定只被某些服務器訪問。
鏈接池:爲了不鏈接佔用過大資源,應該注意鏈接池的大小。
配置足夠的CPU和內存:cpu對於數據庫來講沒有很大的需求,由於數據庫不是cpu密集型的,可是對於內存來講是比較重要的。
使用SSD硬盤:SSD硬盤在隨機讀寫上面的性能很出色,能夠很好的提升隨機io性能
避免使用遠程文件系統:這會給Mongo帶來性能問題
NUMA硬件:在linux 上,NUMA會給mongo帶來一些性能問題,應該禁用NUMA。禁用方法:
numactl --interleave=all /usr/bin/local/mongod
echo 0 > /proc/sys/vm/zone_reclaim_mode
SWAP:分配足夠的空間,避免出現內存爭用現象,對於mongod來講數據映射的,都是並不會被放到swap中
RAID:IO密集型,建議選擇RAID10
遠程文件系統:並不建議使用遠程文件系統,當數據和日誌放在同一個NFS的時候會出現性能問題,若是非要用,能夠考慮把日誌放在iscsi數據房子啊NFS中
分別存儲:能夠考慮把數據,日誌,和進程日誌分開存放到不一樣存儲上以提升io性能。
Write Concern:Write Concern保證了Mongodb寫入安全性。能夠根據不一樣的數據劃分write Concern。
複製集:看p390
shard集羣:看p502
內核和文件系統:mongodb能夠在使用大文件以前,預先分配數據庫文件,因此你要使用ext4和xfs文件系統。ext4至少內核要2.6.23,xfs內核至少要2.6.25.
推薦配置:
1.關閉數據庫文件所在的存儲卷的atime
2.設置描述符限制(-n)和用戶進程限制(-u)
3.不要使用hugepages虛擬內存地址
4.關閉NUMA
5.確保預讀設置比較適合
6.使用NTP(Nwtwork Time Protocol)來同步時間
虛擬環境:mongodb能夠在EC2,VMWare,OpenVZ上運行
iostat: linux上用於檢查次磁盤io的工具
bwm-ng:命令行命令用戶監控網絡的使用
查看p136頁,關於備份的策略
數據管理包括,多數據中心部署,管理大文件存儲,數據生命週期工具
mongodb能夠經過函數參數來隔離,肯定mongod實例是用戶report的工做負荷,仍是用於高頻率shard的一部分
概述:mongodb能夠經過方法或者地理位置隔離應用程序操做。
這個能力容許應用程序經過地理位置的不一樣來考慮mongodb的部署,mongodb能夠更具操做的不一樣來區分,可能被區分到不停的地理位置的不一樣的數據中心。你能夠:
1.保證寫入操做只傳播到特定的複製集的成員
2.指定特定的複製集成員來響應數據讀取
3.確保特定的shard key對於到指定的shard上
4.能夠整個以上特性到一個複製部署上
具體請看:
讀偏好,從那個複製成員上面讀數據
寫注意(write Concern),控制寫操做廣播到幾個成員
複製集tags,用於建立用戶化的讀取偏好和write concern
Tag Aware Sharding,用於指定均衡策略
Capped Collection是一個環形buffer,新的數據會覆蓋最老的數據。
Capped Collection有一下好處:
1.保證插入的順序
2.只能更新,更新先後文檔大小同樣的。
3.自動刪除最好的數據
使用場景:
1.保存高層生成的日誌
2.保存小量的數據
1.能夠插入後更新,可是更新不能讓文檔增加
2.不能刪除
3.不能shard
4.默認在_id上有個索引
5.使用天然順序,有效的從collection讀取數據
可使用createCollection()建立capped collection如:
db.createCollection( "log", { capped: true, size: 100000 } )
db.createCollection("log", { capped : true, size : 5242880, max : 5000 } )
查詢Capped Collection:使用find()查詢,用sort排序。
轉化成Collection:能夠經過convertToCapped命令把capped Collection轉化爲普通Collection。
到期以後自動刪除數據:Mongodb能夠建立TTL索引,容許你刪除過時數據。
Tailable Cursor:你可使用Tailable Cursor連續取回數據,用於capped collection
TTL Collection過時後數據會自動刪除,TTL依賴於後臺的線程,讀取時間類型的值,而且刪除過時數據。
使用ensureIndex()建立一個TTL索引來啓動TTL 功能,建立後便可啓動,過時數據的刪除可使用db.currentOp()或者profile查看。
過時數據的指定有2種方法:
1.超過了指定的秒數
2.超過了指定時間
指定秒數:
db.log.events.ensureIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )
指定時間:
db.app.events.ensureIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )
在建立TTL Collection時須要一個時間字段,在建立索引是指定這個時間字段便可。
1._id字段在TTL索引中不支持
2.不能再已經有索引的字段建立TTL索引
3.若是索引字段不存在,文檔不會過時
4.若是不是BSON日期類型或者不是日期數組類型,不會過時
5.TTL索引不能複合
6.若是TTL域若是是一個時間數組,最小一個過時就算過時
7.不能再capped collection上建立TTL索引
8.不能用ensureIndex()改變過時時間
不少因素都會影響mongodb性能,如查詢,索引,數據模型,應用設計,結構和系統配置
直接開啓profile而後抓取慢查詢,適當調節索引
直接使用db.currentOp()的shell命令
使用explain()返回查詢的執行計劃,看是否有有效的索引等
Capped Collection是以環形的方式,新數據覆蓋老數據的方式,而且空間時固定的,能夠又很好的寫入性能和順序讀性能。
由於寫入都是天然順序的,按天然順序讀取就會很快。
用索引覆蓋查詢,以提升查詢性能。可是索引也是有寫入操做的性能消耗的。查詢是順序仍是逆序,均可以利用索引。
減小查詢結果,儘可能少輸出,減小網絡需求可使用limit()
一樣是爲了減小輸出
用hint()強制使用某個索引
使用$inc這樣自增操做能夠在服務端上運行,能夠不用先查詢,後修改。
動態Schema:mongodb中schema是動態的,並不強制要求文檔結構,雖然collection是保存結構相似的數據。注意點:
1.準確的設置使用的collection
2.只有_id索引是不須要定義的,其餘都須要定義
3.選擇合適的shard key一旦定義就不能被修改
大小寫敏感:Mongodb中字符串是大小寫敏感的
類型敏感:若是在字符串的字段上,用數字去搜索是不會返回結果的
1.默認update隻影響一行
2.BSON文檔大小的限制默認爲16MB,若更大可使用GirdFS
3.沒有通常意義上的事務,若是要作事務,須要經過2階段提交方法,用戶本身實現。
1.使用奇數個複製成員,爲了保證當選成功要不使用奇數個成員(一般是3個),要不用仲裁
2.保持成員up-to-date,考慮如下方法:
a.使用監控告警複製延遲
b.指定write concern
c.若是你使用手動failover,你能夠吧secondary配置成優先級爲0
1.配置shard當心,不能爲已經shard的collection從新指定shard key
2.shard key不能修改
3.當在已存在的collection上使用shard,mongodb會使用collection中最大的大小來保證建立chunk。
4.shard key要求惟一
5.在大批量導入以前考慮使用預分配
管理教程一步一步的演示如何執行Mongodb的安裝,維護和配置。
主要從如下幾個方面:
1.配置,維護和分析
a. 管理mongod進程
b. 日誌切換
2.備份和還原
a.使用文件系統快照作備份還原
b.備份還原shard集羣
3.Mongodb腳本化
4.Mongodb教程
從如下幾個介紹:
1.使用數據庫命令,2.管理mongod進程,3.分析數據庫操做的性能,4.使用SNMP管理Mongodb,5.切換日誌文件,6.管理日誌,7.保存javascript方法,8.更新mongodb,9.Mongodb教程
mongodb命令接口包含了全部非CRUD的操做。
數據庫命令的格式就是BSON格式
使用db.runCommand(BSON格式)就可使用了
若是要在admin數據庫運行一些命令可使用一下:
use admin
db.runCommand()
對於admin的命令也可使用一下,會自動應用到admin上下文
db._adminCommand()
全部的命令返回都有一個ok標記無論命令運行是否成功,若是運行失敗,ok標記就會返回0。
Mongod進程是主數據庫進程運行在獨立的服務器上,Mongos提供一些Mongod的服務對客戶端透明。
啓動mongod:使用命令mongod啓動命令
指定特殊目錄:使用--dbpath 來指定數據庫文件所在的位置
指定TCP端口: 使用--port選項指定
以服務方式啓動: --fork指令代表能夠以服務方式啓動
額外的配置選項:看手冊page 145
中止服務:使用shutdownServer()方法,從shell中中止mongod服務,也可使用mongod --shutdown 來關閉服務。也可使用ctrl-c,kill命令。
中止複製集:
1.檢查備機替換。
2.若是10秒內沒有備機,mongod會返回一條消息不回被關閉。
3.若是在10秒有備機,primary會逐步關閉,並等待備機接上。
4.若是60秒後或一旦備機接上,主機就會關閉。
強制複製集關閉:使用db.adminCommand({shutdown:1,force:true})。db.adminCommand({shutdown:1,timeoutSecs:5})(db.shutdownServer({timeoutsecs:5})),也能夠指定一個時間,若是在這個時間內備機沒接上,就不會關閉。若是接上了就能夠關閉。
經過profile就能夠抓取每一個數據庫的操做。並存放在一個capped collection內。
0,關閉profile;1,只抓取slow查詢;2,抓取全部數據。
能夠經過mongo shell啓動,也能夠經過驅動中的profile命令啓動,啓動後記錄會被保存在system.profile collection下,可使用db.setProfilingLevel來啓動。默認slow爲100 毫秒。db.setProfilingLevel能夠有2個參數,第一個參數指定Profiling 級別,第二個參 數指定slow閥值。
檢查當前Profiling 級別:能夠經過db.getProfilingStatus()獲取當前profiling級別,slowms 標記慢查詢閥值。
關閉Profiling:仍是使用db.setProfilingLevel(0)來關閉profiling
整個實例開啓Profiling:mongod --prifile=1 --slowms=15
shard的Profiling:對shard的profiling要對每個實例進行profiling
能夠直接在system.profile的collection上查看如:db.systen.profile.find()。或者使用show profile,會顯示最近至少1ms時間運行的前5條記錄。
要修改system.profile collection的大小必須:1.關閉profiling,2.刪除system.profile,3.而後從新建立system.profile,4.重啓profile。
shell以下:db.setProfilingLevel(0)
,db.system.profile.drop()
,db.createCollect("system.profile",{cappedLtrue,size:4000000})
,db.setProfilingLevel(1)
這個功能只有在企業版中可用:www.mongodb.com/products/mongodb-enterprise
安裝版本:企業版
包含文件:1.MONGO-MIB.txt這個文件包含了mongodb的SNMP輸出。2.mongod.conf,SNMP的配置文件,用來配置SNMP的公有名稱,權限,訪問權限等。
要求的包:
1.Ubuntu 11.04 要求libssl0.9.8, snmp-mibs-downloader, snmp, 和 snmpd. 使用以下命令: sudo apt-get install libssl0.9.8 snmp snmpd snmp-mibs-downloader
2.Red Hat Enterprise Linux 6.x series和Amazon Linux AMI 要求 libssl, net-snmp,net-snmp-libs,和net-snmp-utils.使用以下命令:sudo yum install libssl net-snmp net-snmp-libs net-snmp-utils
3.SUSE Enterprise Linux 要求 libopenssl0_9_8, libsnmp15, slessp1-libsnmp15, andsnmp-mibs.使用以下命令:sudo zypper install libopenssl0_9_8 libsnmp15 slessp1-libsnmp15 snmp-mibs
安裝MIB配置文件:要確保路徑/usr/share/snmp/mibs 存在,若是不能保證使用mkdir 建立,而後在路徑上建立一個MONGO-MIB.txt鏈接,而後用把配置文件複製到該路徑下:
sudo mkdir -p /usr/share/snmp/mibs
sudo ln -s <path>MONGO-MIB.txt /usr/share/snmp/mibs/
cp mongod.conf /etc/snmp/mongod.conf
啓動:可使用mongod --help | grep snmp來抓取和snmp有關的選項。
保證路徑/data/db和/var/log/mongodb文件夾存在,而後啓動mongod實例,指定snmp選項:
mongod --help | grep snmp
mkdir -p /var/log/mongodb/ /data/db/
mongod --snmp-master --port 3001 --fork --dbpath /data/db/ --logpath /var/log/mongodb/1.log
測試SNMP:檢查是否有監聽關口1161,使用命令lsof -i <port>或者使用netstat -anp | grep 1161。
本地使用snmpwalk:snmpwalk提供從MIB文件中獲取和分析數據的工具。使用以下:
snmpwalk -m MONGO-MIB -v 2c -c mongodb 127.0.0.1:1161 1.3.6.1.4.1.37601
snmpwalk -m /usr/share/snmp/mibs/MONGO-MIB -v 2c -c mongodb 127.0.0.1:1161 1.3.6.1.4.1.37601
出現異常是能夠檢查:/var/log/mongodb/1.log文件,當出現如下問題的時候表示沒法讀取配置文件:[SNMPAgent] warning: error starting SNMPAgent as master err:1
日誌切換是歸檔當前的日誌,而後重開一個新的,日誌文件的切換用UTC時間戳來命名,建立新文件,關閉老文件,把日誌寫入到新文件中。當mongod或mongos收到SIGUSR1信號或者logRoate命令時,纔會被切換。
日誌文件切換:
use admin
db.runCommand({logRoate:1})或者kill -SIGUSR1 <mongodb 進程id>
syslog切換:
1.mongod啓動要有syslog選項
2.使用系統日誌自帶的切換方式切換
mongodb使用順序寫的方式保證寫操做的持久性和崩潰恢復。在修改數據庫文件直線,mongodb會先寫入日誌,若遇到錯誤或者崩潰就能夠從日誌中redo。若沒有日誌,mongod出現不可預期錯誤,就要假設你的數據就是不一致的,不準運行數據庫修復,或者在複製集中使用數據庫同步。如有日誌就能夠經過日誌讓數據庫回到一致性狀態。
若是使用了日誌,你又要想把一個數據集放入內存,除了數據佔用的內存以外,還須要加入write working set。write working set 是想要在從新映射之間看到的數據差距。
啓動日誌:在啓動mongod的時候加入選項--journall。若是沒有日誌,當mongod重啓的時候,會預先分配這些文件。在建立期間,mongod不會去偵放任何鏈接。
禁用日誌:使用--nojournal命令
獲取提交通知:能夠經過getLastError命令的j選項來獲取通知
避免預分配延遲:若是想要避免預分配延遲,能夠先分配,而後複製:
1.建立一個臨時文件夾mkdir ~/tmpDbpath
2. 經過mongod啓動建立日誌文件mongod --port 10000 --dbpath ~/tmpDbpath --journal
3. 當看到如下輸出的時候,用ctrl-c關閉服務進程web admin interface listening on port 11000
4. 而後複製這些文件到數據文件夾下mv ~/tmpDbpath/journal /data/db/
5. 重啓實例mongod --port 27017 --dbpath /data/db --journal
監控日誌狀態:可使用serverStatus命令返回數據庫狀態中查看,也能夠用journalLatencyTest命令查看
獲取組提交間隔:能夠設置組提交間隔,使用--journalCommitInterval選線,範圍在2-300MS之間。
崩潰後恢復數據:當崩潰後重啓,mongodb回放這些日誌
保存javascript都保存在system.js中,可使用save命令保存。而且可使用db.eval(方法)來調用。固然也可使用db.loadServerScripts()一旦load完以後,就能夠直接調用。
在更新前要保證如下幾點:
1.保證有最新的備份
2.經過Release Notes和驅動文檔,注意兼容性和特殊要求
3.如有複製,要有一個更新維護窗口
4.在生產庫上更新以前,如今備用庫上使用,確保兼容性等問題。
1.部署認證,先更新mongodb驅動
2.更新shard集羣
3.更新standalone實例
4.更新非shard集羣的複製集
更新方法有如下2種:
1.使用官方的工具更新 如apt-get
2.直接覆蓋已有的二進制文件
1.複製最新版的二進制文件包
2.關閉實例
3.替換
4.起送實例
1.關閉均衡器
2.更新mongos實例
3.獨立更新config server,根據config server列表獨立啓動,爲了保證集羣online,保證至少有一個config 服務是在運行。
4.更新shard節點,若shard是一個複製集,要用更新複製集同樣的 方式更新
5.開啓均衡器
更新備份庫:
1.更新這個實例
2.而後等待備份庫狀態,在shell 裏面可使用rs.status()
3.若狀態變爲了STARTUP2或者RECONVERING,爲了保證備份庫就緒,狀態等到SCEONDARY,而後再繼續下一個備份庫的更新。
更新主庫:
1.讓主庫進入failover,使用rs.stepDown()或者replSetStepDown命令
2.一旦主庫step down,調用rs.status()方法,知道發現被成功轉移,其餘節點變成primary
3.更新這個實例。
若是在快照備份不可用的狀況下,用工具被分是最合理的。
基本mongodump選項:mongodump備份有2中方式:
1.鏈接到一個mongodb實例
2.直接訪問mongodb數據庫文件
若是沒有參數默認鏈接到local的27017端口下。
使用oplog指定事件:在複製集中使用--oplog選項收集oplog項來建立一個事件點的快照。而後使用mongorestore --oplogReplay來恢復備份
不使用實例還建立備份:能夠直接能夠經過--dbpath參數指定數據庫文件,不須要鏈接到實例。
從非本地實例建立備份:直接接入--host和--port就能夠鏈接到遠程的實例進行備份,如:
mongodump --host mongodb1.example.net --port 3017 --username user --password pass --out /opt/backup/mongodump-2012-10-24
mongorestore的參數基本和mongodump相似。
還原Oplog備份:還原這個備份是要可是原想 --oplogReplay,也能夠考慮加入 --objcheck來檢查對象的一致性,加入--drop會在導入前刪除數據庫中的全部collection
還原數據子集:可使用--filter 來過濾數據而後處處子集
不用mongod還原:和備份同樣能夠直接經過--dbpath鏈接到數據文件,不須要鏈接到實例。
還原非本地數據:mongorestore --host mongodb1.example.net --port 3017 --username user --password pass /opt/backup/mongodump-2012-10-24
建立完快照以後,你能夠mount快照卷,而後把快照裏面的數據複製到你的文件系統中,備份就是徹底拷貝。快照有一下幾個限制:
1.當快照發生時,數據庫必須可用,要求全部的寫入操做必須被寫入到磁盤,要不放到journal要不放到數據庫文件。若是再也不磁盤上,那麼這些修改不會被備份反映。
2.快照是對整個磁盤作image。能夠考慮把數據文件放到單獨的一個盤上面
3.把快照備份放到其餘服務器上保證不會出現單點故障
4.不一樣的快照有不一樣的能力,可是lvm方式,不支持增量備份。
帶journal的備份:若是有journal,你可使用任何方式的快照來建立備份
在Amazon EBS的Raid 10配置下的快照:在這個環境下,你不可能夥同快照工具保證一致性,有一下方法:
1.先把寫入都寫到磁盤上確保一致性,加寫鎖,而後在備份確保一致性
2.配置lvm運行,讓數據文件在raid上面。
建立備份:lvcreate --size 100M --snapshot --name mdb-snap01 /dev/vg0/mongodb
建立了一個快照名字叫作mdb-snap01,這個快照有100MB,這個大小不是數據文件的大小,而是快照和當前狀態之間差距的大小。
當命令返回,快照就已經被建立好了,雖然快照備份速度很是快,可是對於備份存放來講快照不是一個很好的方式。所以還須要把這些快照複製出來,進行歸檔。
歸檔快照:建立好了快照以後,要mount快照而且把數據放到一個獨立的存儲上面,如:
umount /dev/vg0/mdb-snap01
dd if=/dev/vg0/mdb-snap01 | gzip > mdb-snap01.gz
先保證是unmount狀態,而後使用dd進行復制和壓縮
還原快照:
lvcreate --size 1G --name mdb-new vg0
gzip -d -c mdb-snap01.gz | dd of=/dev/vg0/mdb-new
mount /dev/vg0/mdb-new /srv/mongodb
先建立一個邏輯卷,而後制定設備路徑,這裏指定了1g大小,那麼原文件大小必須小於1g。而後解壓到這個邏輯捲上,而後把這個邏輯卷mount到/srv/mongodb上。
直接從快照上還原:
umount /dev/vg0/mdb-snap01
lvcreate --size 1G --name mdb-new vg0
dd if=/dev/vg0/mdb-snap01 of=/dev/vg0/mdb-new
mount /dev/vg0/mdb-new /srv/mongodb
遠程備份:
umount /dev/vg0/mdb-snap01
dd if=/dev/vg0/mdb-snap01 | ssh username@example.com gzip > /opt/backup/mdb-snap01.gz
lvcreate --size 1G --name mdb-new vg0
ssh username@example.com gzip -d -c /opt/backup/mdb-snap01.gz | dd of=/dev/vg0/mdb-new
mount /dev/vg0/mdb-new /srv/mongodb
若是實例沒有啓用journal或者journal在獨立的卷裏面,備份會相對的複雜,你必須刷新全部的寫入,而且鎖定數據庫在備份時禁止寫入。
1.刷新數據庫而且鎖定,使用db.fsyncLock()
2.建立備份
3.而後解鎖,使用db.fsyncUnlock()
當開着profile的時候不能db.fsyncLock(),須要先關閉db.setProfilingLevel()
1.獲取備份文件
2.啓動mongod,使用這些備份文件啓動
3.把單個實例轉爲複製集的一個節點,使用--replSet
4.鏈接到mongod
5.執行rs.initiate()進行初始化
1. 手動複製數據庫文件目錄到全部的實例
2. 使用初始化同步數據,同步到成員
複製數據庫文件並重啓實例:
1. 關閉實例使用shell 命令db.shutdownServer()
2. 複製primary的數據文件到其餘成員的dbpatch下
3. 重啓mongodb實例
4. 用mongo shell鏈接到primary,使用rs.add()添加secondary
使用初始化同步更新secondary:
1. 確保預期的成員遍歷數據文檔都是空的
2. 添加預期的成員到複製集,而後使用初始化同步,複製primary到其餘的複製成員
概述:
小集羣數據量比較小,若是備份執行時間能夠接受,而且數據集有獨立的存儲就能夠考慮,使用dump直接備份。
過程:
抓取數據:若是mongodump沒有指定數據庫或者collection,mongodump會抓取collection數據和config server的集羣數據。不能使用—oplog,這個參數只做用於複製集。能夠用--host鏈接到mongos,進行備份。
恢復數據:和全部的dump備份同樣,備份爲每一個數據庫建立了獨立的文件夾,每一個collection包含一個獨立的BSON文件。
概述:
這個過程使用系統快照來抓取Mongdb實例的副本,進行備份。
過程:
這個過程是先中止均衡器,而後備份config數據庫,而後再備份每一個shard,在備份shard的時候,在建立快照的時候先要中止寫入。
能夠經過備份secondary成員來達到近似的時間點快照,而且最小化影響集羣。
1. 關閉均衡器使用,sh.stopBalancer()來中止
2. 鎖定shard複製集中一個成員,這樣備份就可以反應某個時間點數據庫的狀態。爲了鎖定shard 集羣須要作一下2步
a) 使用db.fsyncLock()鎖定secondary成員
b) 關閉一個config服務,在備份期間阻止全部元數據的變化。
3. 使用mongodump備份config數據庫,使用 mongodump –db_config 備份
4. 使用快照備份,備份複製集成員。
5. 使用db.fsyncUnlock()解鎖全部的成員
6. 啓用均衡器,use config sh.setBalancerState(true)
概述:
介紹一個使用mongodump建立一個實例的dump過程。
過程:
1. 中止均衡器, sh.stopBalancer()
2. 鎖定shard複製集中一個成員,這樣備份就可以反應某個時間點數據庫的狀態,鎖定步驟:
a) 關閉複製集的一個成員,確保oplog有足夠的空間,支撐到備份結束
b) 關閉一個config數據庫,阻止全部的元數據修改
3. 使用mongodump備份config數據庫。
4. 使用mongodump在關閉實例的服務器上備份並指定dbpath
5. 啓動全部中止的成員
6. 啓動均衡器
概述:
Shard集羣中,均衡器的用處是在集羣中分發數據,在備份時,中止均衡器這樣數據塊就不會在shard之間移動影響備份,能夠手動中止均衡器,也能夠用均衡器調度窗口。
過程:
如有例行的備份,囊而就能夠用如下方法,開一個調度窗口自動中止均衡器。
useconfig
db.settings.update({_id:"balancer"},{$set:{activeWindow:{start:"6:00",stop:"23:00"}}},true)
可是例行的備份必須在這個時間範圍內結束
概述:
從備份中還原一個shard須要一些其餘的考慮和實踐
過程:
當你還原備份的時候,要記住得,均衡器可能從這個shard移動chunk,因此你必需要手動移動這些chunk。
1. 和還原其餘實例同樣,先還原這個shard
2. 對於要從這個shard移出的chunk就不用處理,mongos會自動過濾掉這些數據
3. 對於要遷移到這個shard的數據,你必需要手動經過備份其餘shard或者其餘資源恢復這些數據,能夠經過config數據庫查看chunk是否被移動。
概述:
首先要有備份,備份能夠從文件系統快照備份得到,也能夠經過數據庫dump得到
過程:
1. 停掉mongos和mongod
2. 若是主機名被修改,你必須手動更新config數據庫中的shards,使用新的主機名:
a) 使用一下命令啓動config 服務
mongod --configsvr --dbpath /data/configdb --port 27019
b) 恢復config數據庫
c) 啓動和一個mongos實例
d) 更新config數據庫中shards指向新的主機名
3. 還原一下信息:
a) 每一個shard的數據庫文件
b) 每一個config的數據庫文件
4. 重啓mongos
5. 重啓mongod
6. 鏈接到mongos實例,使用db.printShardingStatus()方法確保集羣式可用的。
db.printShardingStatus()
show collections
mongodb沒有乾淨的關閉會致使數據文件不一致,致使數據異常,固然能夠乾淨關閉,或者使用持久性日誌,默認mongodb會在每100ms寫入數據庫journal,這樣mongodb在不乾淨關閉,斷電的狀況下很快的恢復一致性。
若是你沒有複製集和journal你可使用一下過程恢復數據,當你有複製集的時候,能夠從備份中恢復,也可使用初始化同步恢復。
說明:
當你運行在沒有複製集,沒有journall的mongod的實例上,要意識到,當你數據庫非正常關閉的時候,老是要使用數據庫修復選項,若是有複製則能夠直接還原備份或者初始化同步。
若是數據文件夾下有個mongod.lock,mongod會拒絕啓動,在啓動是,進程日誌會出現如下信息:
Unclean shutdown detected
這就表示,你須要使用--repair選項來恢復,當你運行是帶了選項而且有mongodb.lock文件,進程日誌有一下信息:
old lock file: /data/db/mongod.lock. probably means unclean shutdown
出現這個信息,就應該刪除這個文件,而且在正常啓動前修複數據庫
注意:
若是是有複製集就不要使用這個方法,可使用備份或者使用初始化同步
這裏有2中方法修復數據庫文件:
1. 用--repair選項並使用--repairpath選線,這樣mongod會讀取已存在的數據文件,並寫入到新的文件中,不修改老文件。使用這個過程能夠不刪除lock文件
2. 只用--repair,讀取存在的文件,寫入到新的文件中,而且覆蓋老文件,在這個過程前要刪除lock文件。
過程:
方法1:
1. 啓動mongod帶選項--repair,當完成時新的文件會出如今/data/db
mongod --dbpath /data/db --repair --repairpath /data/db0
2. 啓動mongod,dbpath指向 /data/db0
這個方法會保留原文件
方法2:
1. 刪除lock文件
rm /data/db/mongod.lock
2. 帶--repair啓動mongod實例
mongod --dbpath /data/db --repair
3. 而後啓動mongod實例
mongod --dbpath /data/db
有lock文件就不能啓動mongod,若是在很特殊的狀況先能夠直接刪除而後啓動恢復數據,這樣的話數據庫的狀態就很難預測
主要介紹:服務端javascript腳本,mongo shell的數據類型,爲mongo shell 編寫腳本,mongo shell入門,mongo shell幫助信息。mongo shell 快速參考手冊
Mongodb支持在服務端運行javascript如下方式運行:
1. mapReduce和db.collection.mapReduce()
2. 使用eval命令或者使用db.eval()
3. $where運算符
4. 直接運行.js文件
能夠經過選項--noscripting選項或者noscripting配置文件設置,不執行腳本
能夠直接經過mongo shell 執行js文件。
查看concurrency table p594
MongoDB的BSON提供了比JSON多的數據類型
日期類型:BSON提供了多個返回時間類型的方法:
1.Date()直接返回一個表示時間的字符串 如:
var myDateString = Date();
2.Date()能夠是用new來構建一個時間類型
var myDateObject = new Date();
3.ISODate()構建一個ISO時間
var myDateObject2 = ISODate();
ObjectId:對於ObjectId Mongo shell提供了一個ObjectId()的封裝類來生成ObjectId,如:
new ObjectId
NumberLong:默認mongo shell中的全部數值全是浮點型,mongo使用了NumberLong()生成一個8字節整型。
NumberInt:提供了NumberInt()生成4字節整型
mongo shell中提供了檢查類型的方法:
1.instanceof,然會測試的值是不是某個類型的,返回true,false
2.typeof,直接返回一個值的類型
在mongo shell 或者js文件中,可使用Mongo()鏈接到實例 如:
new Mongo()
new Mongo(<host>)
new Mongo(<host:port>)
另外也可使用connect()方法,如:
db = connect("localhost:27020/myDatabase");
考慮一下幾點:
1.設置db全局變量,假設當前數據庫並非你要使用的數據庫
2.使用db.getLastError()顯示的等待寫入操做
3.不可以使用 shell help(如use db,show dbs等)具體能夠查看p 211中的表格
4.在交互模式下,遊標會自動輸出內容,在腳本下要使用print(),如:
cursor = db.collection.find();
while ( cursor.hasNext() ) {
printjson( cursor.next() );}
對於prompt也可使用,javascript腳本創建。
--eval選項:mongo --eval <script>便可
執行js文件:mongo localhost:27017/test myjsfile.js,直接在實例上運行js文件。替代方法,也能夠先鏈接到實例,而後使用load()方法執行。
啓動shell:
1.進入mongodb安裝目錄
2.鍵入 ./bin/mongo
3.使用db查看當前數據庫,使用use 切換數據庫
執行查詢:使用db.collection.find()查詢,db指示了當前的數據庫,collection是所查的
find的結果若是賦值給變量,就會直接輸出,能夠在後面加.pretty()
有一下輸出函數:
1.print()不帶格式直接輸出
2.print(tojson<obj>),和printJson效果同樣
3.printJson()帶json格式輸出
能夠直接使用load()執行一個js文件,如:
load("/data/db/scripts/myjstest.js")
能夠經過腳本修改Prompt,如:
host = db.serverStatus().host;
prompt = function() {
return db+"@"+host+"$ ";}
設定環境變量,EDITOR而後再啓動mongo,在shell中使用edit 就能夠在其餘編輯器上編輯。如:
export EDITOR=vim
mongo
MongoDB shell version: 2.2.0
> function f() {}
> edit f
> f
function f() {
print("this really works");
}
> f()
this really works
mongo --help
輸入help
1.經過show dbs查看數據庫
2.db.help查看db下可用的方法
3.查看方法的實現,好比 db.addUser(),輸入db.addUser不加括號就能夠看方法的實現
1.使用show collections 查看已經存在的collection
2.使用db.collection.help 查看collection的幫助
3.不用括號能夠查看方法實現
1.db.collection.find().help()查看遊標的幫助信息
2.不加括號能夠看方法的實現
使用help misc查看 mongo shell中瘋長的可用類。
能夠經過方向鍵獲取上一條,下一條命令,這些命令被存放在~/.dbshell文件中。
mongo也有不少命令行選項:
--help:查看全部命令行選項
--nodb:啓動mongo shell 可是不鏈接到數據庫
--shell:關聯一個文件,運行完文件以後,shell繼續運行
help顯示幫助
db.help 顯示數據庫方法
db.collection.help 顯示collection方法
show dbs 顯示已有數據庫
use db 切換數據庫上下文
show collections 顯示當前數據庫下已有collection
show users 顯示當前數據庫先全部的用戶
show profile 顯示花費了1ms以上的前5個操做
show database 顯示全部可用shujk
load() 執行js文件
包含如下內容,ulimit設置,system collection,Mongodb擴展JSON,數據庫profile輸出,journaling機制,退出代碼和狀態。
不少相似unix系統都提供了資源控制,固然有時候默認值過低會致使大量的mongodb經常使用操做。
一般,全部的mongod和mongos實例會跟蹤一下信息:
1.使用1個文件描述符和1個線程跟蹤每一個income 鏈接。
2.跟蹤每一個內部的線程或者pthread都做爲一個系統進程
1.mongod實例中每一個文件1個文件描述符
2.當journal爲true,每一個journal文件1個描述符
3.在複製集中,每一個mongod維護了到其餘全部成員的鏈接
mongod使用後臺線程,用於TTL collection,複製,複製集的健康檢查,這些都會消耗一些性能。
客戶端鏈接所使用的線程和文件描述符,全部config數據庫和shard的鏈接,複製集全部成員的鏈接。考慮一下幾點:
1.mongos維護一個鏈接池,能夠直接重用鏈接不須要從新建立
2.使用maxConns選項限制income鏈接數
硬ulimit:相似有多少cpu可讓一個用戶使用
軟ulimit:強制對一個session或者進程的可用資源的限制
因此軟ulimit可能會致使沒法建立鏈接的狀況,因此ulimit配置很重要。
ulimit是針對每一個用戶的不一樣的資源,而後能夠經過ulimit -n <value>這種方式修改
能夠經過如下shell腳本查看進程限制的情況:
return-limits(){
for process in $@; do
process_pids=`ps -C $process -o pid --no-headers | cut -d " " -f 2`
if [ -z $@ ]; then
echo "[no $process running]"
else
for pid in $process_pids; do
echo "[$process #$pid -- limits]"
cat /proc/$pid/limits
done
fi
done
}
如:return-limits mongod mongos
-f (file size): unlimited
-t (cpu time): unlimited
-v (virtual memory): unlimited 58
-n (open files): 64000
-m (memory size): unlimited 1
-u (processes/threads): 32000
mongodb把一些系統信息都存放在<database>.system.*namespace下面,不要建立以system開頭的collection
系統collection包含以下:
<database>.system.namespaces:包含了數據庫collection的全部信息
<database>.system.indexs:包含了數據庫中全部的索引
<database>.system.profile:包含了數據庫profiling信息
<database>.system.users:包含了用戶證書信息
<database>.system.js:包含了全部服務端javascript代碼
mongodb 手冊 2.4.8 page 227本身查看
profile開啓後,mongodb會把數據寫入到system.profile這個capped collection中,能夠直接查詢這個capped collection查看捕獲的數據。
{
"ts" : ISODate("2012-12-10T19:31:28.977Z"),
"op" : "update",
"ns" : "social.users",
"query" : {
"name" : "jane"
},
"updateobj" : {
"$set" : {
"likes" : [
"basketball",
"trekking"
]
}
},
"nscanned" : 8,
"moved" : true,
"nmoved" : 1,
"nupdated" : 1,
"keyUpdates" : 0,
"numYield" : 0,
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(0),
"w" : NumberLong(258)
},
"timeAcquiringMicros" : {
"r" : NumberLong(0),
"w" : NumberLong(7)
}
},
"millis" : 0,
"client" : "127.0.0.1",
"user" : ""
}
具體每一個域表示什麼意思查 Mongodb手冊 v2.4.8 page 261
當啓動journal,mongodb會在把寫入操做應用到數據文件以前先寫入journal文件,寫入的間隔爲commitIntervalMs,因此當出現故障可能會丟失commitIntervalMs時間的數據。
journal啓動後就會建立journal文件,在dbpath下,journal文件被保存在journal文件夾下,文件都是以順序寫的方式寫入,乾淨關閉實例,會把journal文件夾下的文件所有刪除。
journal文件是隻能追加的,而且都是以j._開頭,當journal文件超過1gb的數據,就會自動建立新的文件,一旦文件中的操做都被mongodb應用,那麼文件就會被刪除,因此通常只會保留2-3個文件。
能夠啓用smallfiles配置選項,把journal 文件最大設置爲128MB。
爲了保證寫入的速度,能夠把文件放到其餘系統上。注意若是journal和數據文件再也不同一個文件系統中,不要直接使用快照來抓取備份,請查看快照備份。
可能會在mongodb啓動的時候經歷,預分配延遲,致使這一段時間內,沒法鏈接到數據庫。由mongodb決定是經過預分配的方式仍是須要的是後再建立文件的方式處理。
journal使用了3部分存儲視圖:shared view,private view,private cache。
shared view:shared view 保存了更新到數據庫文件的數據,是惟一一個能夠訪問數據庫文件的view,當啓用journal,mongod要求操做系統映射磁盤上的文件到shared view上,可是不加載他們,而後mongodb把數據庫文件按需加載到shared view 上。
private view:保存用戶讀操做的數據,當新的寫入操做時,mongodb把private view 映射到shared view。
private cache:journal是磁盤上的視圖,在寫入到數據文件以前,把寫入操做先寫入到了private cache上,用於寫入到journal文件上。
journal批量複製寫入操做到journal成爲組提交。
當寫入操做發生,mongodb寫入數據到private view,而後批量複製寫入操做到journal上,每一個塊都說明了那些字節在數據庫文件中被修改。
而後mongodb把應用journal的寫入操做到shared view,這時shared view和數據庫文件變得不一致。而後默認60s後,mongodb要求系統刷新shared view 到磁盤上,數據庫文件更新。
當mongodb刷新寫入操做到磁盤時,mongodb從後面的指針刪除這些寫入操做。後面的指針和當前活動指針(要刷新到磁盤)差很遠。
而後mongodb要求操做系統吧shared view 從新映射到 private view 保持一致性。
擴展閱讀:
journal工做原理:http://f.dataguru.cn/thread-139560-1-1.html
當mongodb退出的時候會更一下代碼和狀態,能夠用於troubleshooting。
0:mongodb正常退出
2:和其餘選項不兼容致使的錯誤
3:當命令行指定的主機名和local.sources不符時返回,當oplog collection不可讀是也可能會返回。
4:數據庫版本和mongod的版本不一樣。重啓mongod加上--upgrade選項更新數據庫到mongod支持的版本便可。
5:moveChunk錯誤是發生
12:在windows下,當mongod接收到ctrl-c,關閉,break或者關閉命令時返回
14:當mongodb發生不可恢復的錯誤,沒法處理的異常或者沒法捕捉的signal。會乾淨的關閉。
20:在windows下,的WSAStartup函數中出錯時返回,也多是,windows下,不能成功安裝,啓動,刪除服務是出現。
45:當mongodb不能打開文件或者不能獲取文件上的鎖時,出現
47:當mongodb退出,須要大量的時間
48:若是socket關閉,mongod乾淨退出
49:mongod,mongos收到SCM的關閉信息
100:mongod拋出一個沒法捕獲的異常