Mongodb Manual閱讀筆記:CH4 管理

4 管理

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 Sharding
javascript

 

4 管理... 1html

4.1 管理概念... 2java

4.1.1 操做策略... 2mysql

4.1.1.1 備份策略... 2linux

4.1.1.2 Mongodb監控... 3ios

4.1.1.3 在線數據庫配置... 5web

4.1.1.4導入導出... 7sql

4.1.1.5 產品注意點... 7mongodb

4.1.2 數據管理... 9shell

4.1.2.1數據中心意識... 9

4.1.2.2 Capped Collection. 10

4.1.2.3 TTL Collection. 10

4.1.3 Mongodb優化策略... 11

4.1.3.1評估當前操做的性能... 11

4.1.3.2 使用Capped Collection作先入先出... 12

4.1.3.3 優化查詢性能... 12

4.1.3.4 設計注意點... 13

4.2 管理教程... 13

4.2.1 配置,維護和分析... 14

4.2.1.1 使用數據庫命令... 14

4.2.1.2 管理Mongod進程... 15

4.2.1.3 數據庫操做的性能分析... 15

4.2.1.4 使用SNMP監控Mongodb. 16

4.2.1.5 切換日誌文件... 17

4.2.1.6 管理日誌(同mysql bin-logsql server的事務日誌)... 17

4.2.1.7在服務端保存JavaScript函數... 18

4.2.1.8 更新mongodb版本... 18

4.2.2 備份和恢復... 20

4.2.2.1 備份和恢復工具... 20

4.2.2.2使用文件系統快照備份和恢復... 20

4.2.2.3從備份中還原複製集... 22

4.2.2.4備份還原Shard集羣... 22

4.2.2.5從異常關閉中恢復數據... 24

4.2.3 MongoDB腳本... 26

4.2.3.1服務端javascript. 26

4.2.3.2    Mongo Shell中的數據類型... 26

4.2.3.3 mongo shell 編寫腳本... 27

4.2.2.4 訪問shell幫助信息... 29

4.2.2.5 Mongo shell快速參考手冊... 30

4.3管理參... 30

4.3.1 Unix ulimit設置... 30

4.3.1.1 資源利用... 30

4.3.1.2查看和設置資源限制... 31

4.3.1.3推薦設置... 32

4.3.2 系統collection. 32

4.3.2.1簡介... 32

4.3.2.2 Collections. 32

4.3.3 MongoDB擴展JSON.. 32

4.3.4 數據庫profile輸出... 32

4.3.4.1輸出例子... 33

4.3.5 journaling 機制... 33

4.3.5.1 journal 文件... 34

4.3.5.2 journal使用的存儲視圖... 34

4.3.5.3 journal如何寫入... 34

4.3.6 退出代碼和狀態... 34

 

4.1 管理概念

本節介紹操做mongodb的策略和實踐

4.1.1 操做策略

主要介紹1Mongodb系統的備份策略,2.Mongodb的監控,3.在線配置,4.導入導出

5.注意點

4.1.1.1 備份策略

備份可讓數據保持一致性和可用性,並測試備份保證備份的可用。

備份的考慮

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性能。

4.1.1.2 Mongodb監控

主要介紹一些監控方法和一些監控工具

監控策略

3種方法收集當前mongodb的狀態:

1.使用和mongodb一塊兒發佈的試試報表

2.使用數據庫命令,獲取當先數據庫的狀態

3.使用MMS mongodb 監控服務,收集Mongodb信息,提供可視化的,和一些告警,目前是免費的。

報表工具

工具:Mongodb發佈時帶了一些報告工具,Mongostatmongotop

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服務。

進程日誌

mongodmongos會記錄全部的服務狀態到標準輸出或者日誌文件中有一些配置參數:

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包含2current當前客戶端的總數,available全部未使用的鏈接的總數

對於包併發的請求,能夠根據需求使用讀寫分離或者shard

大量固定的鏈接也多是驅動的問題,每一個驅動都是實現鏈接池的,大量的鏈接可是沒有被使用就說明驅動或者其餘配置有問題。

Database Profiling:Profile能夠幫忙記錄全部的非有效查詢,有3個級別:

         1.0表示關閉

         2.1表示值抓取slow

         3.2表示所有抓取

當配置1時可使用db.setProfilingLevel()來設置級別也能夠用來指定slow閥值。

複製和監控

監控複製集必定要監控複製延遲,有2個問題可能會是複製延遲形成的:

1.若出現延遲,並無複製到secondary,一旦崩潰就會形成一致性問題

2.若是secondary落後超過了oplogmongodb會啓動從新初始化同步。oplog能夠在配置文件中配置,若是不配置使用默認大小,默認全部可用空間的5%

 

複製延遲要不就是網絡問題,要就是primary資源不足以支持應用。能夠經過rs.status(),其中有個值optimeDate反應最後一個項被應用到複製集的時間。

Shard和監控

配置服務:配置服務維護了哪些數據是放在哪一個shard下面的。shard之間會更新這樣的記錄,當配置服務不可訪問的時候,整個shard操做就不能進行了,已經在訪問的不受影響。

因此配置服務不可用是一個很嚴重的問題。要監控配置服務是否運行正常。

均衡和記錄複製:高效的shard集羣,會把配置服務器也放在均衡器下,提升配置服務的可用性。

鎖過時:在均衡器上使用的鎖,當過時以後就會被自動釋放,任何長時間的鎖都會影響均衡器的性能。能夠切換到config數據庫,而後使用db.locks.find()查看鎖狀況。

4.1.1.3 在線數據庫配置

介紹通用的配置,最佳實踐配置的場景,主要經過配置文件爲接口,使用--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認證系統,要建立用戶認證信息

複製和shard配置

複製配置:複製很簡單,只要設置replSet=set0,經過設置keyFile啓動複製集認證。設置keyFile啓動認證而且指定一個key file對應複製集成員的使用。

Shard配置configsvr=true表示建立一個config 服務,運行在bind_ipport上,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

4.1.1.4導入導出

數據類型精度

JSON不支持BSON不少數據類型,當decode BSON文檔到JSON會形成一些精度丟失

數據導入導出和備份操做

無論你決定如何導入導出數據,考慮一下幾條:

1.標記文件制定何時啓動的備份

2.標記標記能夠描述備份的上下文那些數據備份了

3.若是對備份有不利影響時,不要啓動導出

4.保證可以反映數據一致性

5.經過恢復和導入,測試備份和導出

簡單明瞭的導入導出的格式

可使用copydbclonecloneCollection命令,mongo提供db.copyDatabase()方法。

使用mongoexport導出Collection : mongpexport --collection collection --out collection.json

默承認以使用--jsonArray導出json數組,--csv導出csv。若是沒有開mongod能夠指定數據庫文件。被指定數據庫文件後,文件會被鎖定,mongod不能附加這些文件。

使用mongoimport導入Collection:格式和導出相似,能夠指定--upsert表示會試圖更新已有的文檔。還可使用--journal指定生產日誌。

4.1.1.5 產品注意點

MongoDB:通常都使用64bit,對於32bitmongodb能夠用於測試開發環境,並不適合產品部署,可是不能保存大於2GB數據。

操做系統mongodb目前支持,MAC OS XLinuxWindows 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

RAIDIO密集型,建議選擇RAID10

遠程文件系統:並不建議使用遠程文件系統,當數據和日誌放在同一個NFS的時候會出現性能問題,若是非要用,能夠考慮把日誌放在iscsi數據房子啊NFS

分別存儲:能夠考慮把數據,日誌,和進程日誌分開存放到不一樣存儲上以提升io性能。

體系結構

Write ConcernWrite Concern保證了Mongodb寫入安全性。能夠根據不一樣的數據劃分write Concern

複製集:看p390

shard集羣:看p502

平臺

內核和文件系統:mongodb能夠在使用大文件以前,預先分配數據庫文件,因此你要使用ext4xfs文件系統。ext4至少內核要2.6.23xfs內核至少要2.6.25.

推薦配置:

1.關閉數據庫文件所在的存儲卷的atime

2.設置描述符限制(-n)和用戶進程限制(-u)

3.不要使用hugepages虛擬內存地址

4.關閉NUMA

5.確保預讀設置比較適合

6.使用NTP(Nwtwork Time Protocol)來同步時間

虛擬環境:mongodb能夠在EC2,VMWareOpenVZ上運行

性能監控

iostat linux上用於檢查次磁盤io的工具

bwm-ng:命令行命令用戶監控網絡的使用

備份

查看p136頁,關於備份的策略

4.1.2 數據管理

數據管理包括,多數據中心部署,管理大文件存儲,數據生命週期工具

4.1.2.1數據中心意識

mongodb能夠經過函數參數來隔離,肯定mongod實例是用戶report的工做負荷,仍是用於高頻率shard的一部分

Mongodb部署上的操做性策略

概述:mongodb能夠經過方法或者地理位置隔離應用程序操做。

這個能力容許應用程序經過地理位置的不一樣來考慮mongodb的部署,mongodb能夠更具操做的不一樣來區分,可能被區分到不停的地理位置的不一樣的數據中心。你能夠:

         1.保證寫入操做只傳播到特定的複製集的成員

         2.指定特定的複製集成員來響應數據讀取

         3.確保特定的shard key對於到指定的shard

         4.能夠整個以上特性到一個複製部署上

具體請看:

         讀偏好,從那個複製成員上面讀數據

         寫注意(write Concern),控制寫操做廣播到幾個成員

         複製集tags,用於建立用戶化的讀取偏好和write concern

         Tag Aware Sharding,用於指定均衡策略

4.1.2.2 Capped Collection

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

4.1.2.3 TTL Collection

TTL Collection過時後數據會自動刪除,TTL依賴於後臺的線程,讀取時間類型的值,而且刪除過時數據。

啓動TTL Collection

使用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()改變過時時間

4.1.3 Mongodb優化策略

不少因素都會影響mongodb性能,如查詢,索引,數據模型,應用設計,結構和系統配置

4.1.3.1評估當前操做的性能

使用Profile評估操做性能

直接開啓profile而後抓取慢查詢,適當調節索引

使用db.currentOp()評估性能

直接使用db.currentOp()shell命令

使用$explain來評估查詢性能

使用explain()返回查詢的執行計劃,看是否有有效的索引等

4.1.3.2 使用Capped Collection作先入先出

First Write

Capped Collection是以環形的方式,新數據覆蓋老數據的方式,而且空間時固定的,能夠又很好的寫入性能和順序讀性能。

first Read

由於寫入都是天然順序的,按天然順序讀取就會很快。

4.1.3.3 優化查詢性能

使用索引來優化

用索引覆蓋查詢,以提升查詢性能。可是索引也是有寫入操做的性能消耗的。查詢是順序仍是逆序,均可以利用索引。

限制查詢結果減小網絡需求

減小查詢結果,儘可能少輸出,減小網絡需求可使用limit()

使用Porjection返回有必要的列

一樣是爲了減小輸出

使用$hint指定索引

hint()強制使用某個索引

使用服務端的自增操做

使用$inc這樣自增操做能夠在服務端上運行,能夠不用先查詢,後修改。

4.1.3.4 設計注意點

Schema考慮

動態Schema:mongodbschema是動態的,並不強制要求文檔結構,雖然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

shard考慮

1.配置shard當心,不能爲已經shardcollection從新指定shard key

2.shard key不能修改

3.當在已存在的collection上使用shardmongodb會使用collection中最大的大小來保證建立chunk

4.shard key要求惟一

5.在大批量導入以前考慮使用預分配

4.2 管理教程

管理教程一步一步的演示如何執行Mongodb的安裝,維護和配置。

主要從如下幾個方面:

         1.配置,維護和分析

                   a. 管理mongod進程

                   b. 日誌切換

         2.備份和還原

                   a.使用文件系統快照作備份還原

                   b.備份還原shard集羣

         3.Mongodb腳本化

         4.Mongodb教程

4.2.1 配置,維護和分析

從如下幾個介紹:

         1.使用數據庫命令,2.管理mongod進程,3.分析數據庫操做的性能,4.使用SNMP管理Mongodb5.切換日誌文件,6.管理日誌,7.保存javascript方法,8.更新mongodb9.Mongodb教程

4.2.1.1 使用數據庫命令

mongodb命令接口包含了全部非CRUD的操做。

數據庫命令格式

數據庫命令的格式就是BSON格式

使用命令

使用db.runCommand(BSON格式)就可使用了

admin 數據庫命令

若是要在admin數據庫運行一些命令可使用一下:

use admin

db.runCommand()

對於admin的命令也可使用一下,會自動應用到admin上下文

db._adminCommand()

命令返回

全部的命令返回都有一個ok標記無論命令運行是否成功,若是運行失敗,ok標記就會返回0

4.2.1.2 管理Mongod進程

Mongod進程是主數據庫進程運行在獨立的服務器上,Mongos提供一些Mongod的服務對客戶端透明。

 

啓動mongod使用命令mongod啓動命令

指定特殊目錄:使用--dbpath 來指定數據庫文件所在的位置

指定TCP端口: 使用--port選項指定

以服務方式啓動: --fork指令代表能夠以服務方式啓動

額外的配置選項:看手冊page 145

中止服務:使用shutdownServer()方法,從shell中中止mongod服務,也可使用mongod --shutdown 來關閉服務。也可使用ctrl-ckill命令。

中止複製集:

         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})),也能夠指定一個時間,若是在這個時間內備機沒接上,就不會關閉。若是接上了就能夠關閉。

4.2.1.3 數據庫操做的性能分析

經過profile就能夠抓取每一個數據庫的操做。並存放在一個capped collection內。

profiling levels

         0,關閉profile1,只抓取slow查詢;2,抓取全部數據。

啓動profile而且設置Profile級別:

         能夠經過mongo shell啓動,也能夠經過驅動中的profile命令啓動,啓動後記錄會被保存在system.profile collection下,可使用db.setProfilingLevel來啓動。默認slow100   毫秒。db.setProfilingLevel能夠有2個參數,第一個參數指定Profiling 級別,第二個參     數指定slow閥值。

         檢查當前Profiling 級別:能夠經過db.getProfilingStatus()獲取當前profiling級別,slowms      標記慢查詢閥值。

         關閉Profiling仍是使用db.setProfilingLevel(0)來關閉profiling

         整個實例開啓Profilingmongod --prifile=1 --slowms=15

         shardProfiling:對shardprofiling要對每個實例進行profiling

查看Profiling數據

         能夠直接在system.profilecollection上查看如:db.systen.profile.find()。或者使用show        profile,會顯示最近至少1ms時間運行的前5條記錄。

Profiler概述

         要修改system.profile collection的大小必須:1.關閉profiling2.刪除system.profile3.而後從新建立system.profile4.重啓profile

         shell以下:db.setProfilingLevel(0)

         ,db.system.profile.drop()

         ,db.createCollect("system.profile",{cappedLtrue,size:4000000})

         ,db.setProfilingLevel(1)

4.2.1.4 使用SNMP監控Mongodb

這個功能只有在企業版中可用:www.mongodb.com/products/mongodb-enterprise

要求:

安裝版本:企業版

包含文件:1.MONGO-MIB.txt這個文件包含了mongodbSNMP輸出。2.mongod.confSNMP的配置文件,用來配置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 seriesAmazon 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

配置SNMP

安裝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

本地使用snmpwalksnmpwalk提供從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

Troubleshooting

出現異常是能夠檢查:/var/log/mongodb/1.log文件,當出現如下問題的時候表示沒法讀取配置文件:[SNMPAgent] warning: error starting SNMPAgent as master err:1

4.2.1.5 切換日誌文件

日誌切換是歸檔當前的日誌,而後重開一個新的,日誌文件的切換用UTC時間戳來命名,建立新文件,關閉老文件,把日誌寫入到新文件中。當mongodmongos收到SIGUSR1信號或者logRoate命令時,纔會被切換。

日誌文件切換:

use admin

db.runCommand({logRoate:1})或者kill -SIGUSR1 <mongodb 進程id>

syslog切換:

1.mongod啓動要有syslog選項

2.使用系統日誌自帶的切換方式切換

4.2.1.6 管理日誌(同mysql bin-logsql server的事務日誌)

mongodb使用順序寫的方式保證寫操做的持久性和崩潰恢復。在修改數據庫文件直線,mongodb會先寫入日誌,若遇到錯誤或者崩潰就能夠從日誌中redo。若沒有日誌,mongod出現不可預期錯誤,就要假設你的數據就是不一致的,不準運行數據庫修復,或者在複製集中使用數據庫同步。如有日誌就能夠經過日誌讓數據庫回到一致性狀態。

若是使用了日誌,你又要想把一個數據集放入內存,除了數據佔用的內存以外,還須要加入write working setwrite 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回放這些日誌

4.2.1.7在服務端保存JavaScript函數

保存javascript都保存在system.js中,可使用save命令保存。而且可使用db.eval(方法)來調用。固然也可使用db.loadServerScripts()一旦load完以後,就能夠直接調用。

4.2.1.8 更新mongodb版本

更新前

在更新前要保證如下幾點:

1.保證有最新的備份

2.經過Release Notes和驅動文檔,注意兼容性和特殊要求

3.如有複製,要有一個更新維護窗口

4.在生產庫上更新以前,如今備用庫上使用,確保兼容性等問題。

更新過程

1.部署認證,先更新mongodb驅動

2.更新shard集羣

3.更新standalone實例

4.更新非shard集羣的複製集

更新實例

更新方法有如下2種:

1.使用官方的工具更新 apt-get

2.直接覆蓋已有的二進制文件

替換已有的二進制

1.複製最新版的二進制文件包

2.關閉實例

3.替換

4.起送實例

更新shard集羣(CHECK?)

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.更新這個實例。

4.2.2 備份和恢復

4.2.2.1 備份和恢復工具

若是在快照備份不可用的狀況下,用工具被分是最合理的。

使用mongodump備份

基本mongodump選項mongodump備份有2中方式:

1.鏈接到一個mongodb實例

2.直接訪問mongodb數據庫文件

若是沒有參數默認鏈接到local27017端口下。

使用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還原數據庫

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

4.2.2.2使用文件系統快照備份和恢復

快照概述

建立完快照以後,你能夠mount快照卷,而後把快照裏面的數據複製到你的文件系統中,備份就是徹底拷貝。快照有一下幾個限制:

1.當快照發生時,數據庫必須可用,要求全部的寫入操做必須被寫入到磁盤,要不放到journal要不放到數據庫文件。若是再也不磁盤上,那麼這些修改不會被備份反映。

2.快照是對整個磁盤作image。能夠考慮把數據文件放到單獨的一個盤上面

3.把快照備份放到其餘服務器上保證不會出現單點故障

4.不一樣的快照有不一樣的能力,可是lvm方式,不支持增量備份。

journal的備份:若是有journal,你可使用任何方式的快照來建立備份

Amazon EBSRaid 10配置下的快照:在這個環境下,你不可能夥同快照工具保證一致性,有一下方法:

         1.先把寫入都寫到磁盤上確保一致性,加寫鎖,而後在備份確保一致性

         2.配置lvm運行,讓數據文件在raid上面。

linux系統中使用lvm備份還原

建立備份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或者journal在獨立的卷裏面,備份會相對的複雜,你必須刷新全部的寫入,而且鎖定數據庫在備份時禁止寫入。

1.刷新數據庫而且鎖定,使用db.fsyncLock()

2.建立備份

3.而後解鎖,使用db.fsyncUnlock()

當開着profile的時候不能db.fsyncLock(),須要先關閉db.setProfilingLevel()

4.2.2.3從備份中還原複製集

還原到複製集單個節點

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到其餘的複製成員

4.2.2.4備份還原Shard集羣

使用mongodump備份小shard集羣

概述

小集羣數據量比較小,若是備份執行時間能夠接受,而且數據集有獨立的存儲就能夠考慮,使用dump直接備份。

過程

抓取數據:若是mongodump沒有指定數據庫或者collectionmongodump會抓取collection數據和config server的集羣數據。不能使用—oplog,這個參數只做用於複製集。能夠用--host鏈接到mongos,進行備份。

恢復數據:和全部的dump備份同樣,備份爲每一個數據庫建立了獨立的文件夾,每一個collection包含一個獨立的BSON文件。

使用文件系統快照備份shard集羣

概述

這個過程使用系統快照來抓取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)

使用數據庫dump備份shard集羣

概述:

介紹一個使用mongodump建立一個實例的dump過程。

過程:

1.       中止均衡器, sh.stopBalancer()

2.       鎖定shard複製集中一個成員,這樣備份就可以反應某個時間點數據庫的狀態,鎖定步驟:

a)         關閉複製集的一個成員,確保oplog有足夠的空間,支撐到備份結束

b)         關閉一個config數據庫,阻止全部的元數據修改

3.       使用mongodump備份config數據庫。

4.       使用mongodump在關閉實例的服務器上備份並指定dbpath

5.       啓動全部中止的成員

6.       啓動均衡器

使用shard集羣的調度備份窗口

概述:

Shard集羣中,均衡器的用處是在集羣中分發數據,在備份時,中止均衡器這樣數據塊就不會在shard之間移動影響備份,能夠手動中止均衡器,也能夠用均衡器調度窗口。

過程:

如有例行的備份,囊而就能夠用如下方法,開一個調度窗口自動中止均衡器。

useconfig

db.settings.update({_id:"balancer"},{$set:{activeWindow:{start:"6:00",stop:"23:00"}}},true)

可是例行的備份必須在這個時間範圍內結束

恢復單個shard

概述

從備份中還原一個shard須要一些其餘的考慮和實踐

過程

當你還原備份的時候,要記住得,均衡器可能從這個shard移動chunk,因此你必需要手動移動這些chunk

1.       和還原其餘實例同樣,先還原這個shard

2.       對於要從這個shard移出的chunk就不用處理,mongos會自動過濾掉這些數據

3.       對於要遷移到這個shard的數據,你必需要手動經過備份其餘shard或者其餘資源恢復這些數據,能夠經過config數據庫查看chunk是否被移動。

還原一個shard集羣

概述:

首先要有備份,備份能夠從文件系統快照備份得到,也能夠經過數據庫dump得到

過程:

1.       停掉mongosmongod

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

4.2.2.5從異常關閉中恢復數據

mongodb沒有乾淨的關閉會致使數據文件不一致,致使數據異常,固然能夠乾淨關閉,或者使用持久性日誌,默認mongodb會在每100ms寫入數據庫journal,這樣mongodb在不乾淨關閉,斷電的狀況下很快的恢復一致性。

若是你沒有複製集和journal你可使用一下過程恢復數據,當你有複製集的時候,能夠從備份中恢復,也可使用初始化同步恢復。

處理

說明

當你運行在沒有複製集,沒有journallmongod的實例上,要意識到,當你數據庫非正常關閉的時候,老是要使用數據庫修復選項,若是有複製則能夠直接還原備份或者初始化同步。

若是數據文件夾下有個mongod.lockmongod會拒絕啓動,在啓動是,進程日誌會出現如下信息:

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.       啓動mongoddbpath指向 /data/db0

這個方法會保留原文件

方法2

1.       刪除lock文件
rm /data/db/mongod.lock

2.       --repair啓動mongod實例
mongod --dbpath /data/db --repair

3.       而後啓動mongod實例
mongod --dbpath /data/db

mongod.lock

lock文件就不能啓動mongod,若是在很特殊的狀況先能夠直接刪除而後啓動恢復數據,這樣的話數據庫的狀態就很難預測

4.2.3 MongoDB腳本

主要介紹:服務端javascript腳本,mongo shell的數據類型,爲mongo shell 編寫腳本,mongo shell入門,mongo shell幫助信息。mongo shell 快速參考手冊

4.2.3.1服務端javascript

概述

Mongodb支持在服務端運行javascript如下方式運行:

1.       mapReducedb.collection.mapReduce()

2.       使用eval命令或者使用db.eval()

3.       $where運算符

4.       直接運行.js文件

能夠經過選項--noscripting選項或者noscripting配置文件設置,不執行腳本

經過Mongo shell 直接運行js文件

能夠直接經過mongo shell 執行js文件。

併發

查看concurrency table p594

4.2.3.2  Mongo Shell中的數據類型

MongoDBBSON提供了比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,然會測試的值是不是某個類型的,返回truefalse

2.typeof,直接返回一個值的類型

4.2.3.3 mongo shell 編寫腳本

打開新鏈接

mongo shell 或者js文件中,可使用Mongo()鏈接到實例 如:

new Mongo()

new Mongo(<host>)

new Mongo(<host:port>)

另外也可使用connect()方法,如:

db = connect("localhost:27020/myDatabase");

互動mongo和腳本mongo區別

考慮一下幾點:

1.設置db全局變量,假設當前數據庫並非你要使用的數據庫

2.使用db.getLastError()顯示的等待寫入操做

3.不可以使用 shell help(如use dbshow 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()方法執行。

mongo shell簡單入門

啓動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格式輸出

執行js文件

能夠直接使用load()執行一個js文件,如:

load("/data/db/scripts/myjstest.js")

用戶化Prompt

能夠經過腳本修改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

4.2.2.4 訪問shell幫助信息

命令行查看幫助

mongo --help

mongo shell查看幫助

輸入help

數據庫幫助

1.經過show dbs查看數據庫

2.db.help查看db下可用的方法

3.查看方法的實現,好比 db.addUser(),輸入db.addUser不加括號就能夠看方法的實現

collection 幫助信息

1.使用show collections 查看已經存在的collection

2.使用db.collection.help 查看collection的幫助

3.不用括號能夠查看方法實現

遊標幫助信息

1.db.collection.find().help()查看遊標的幫助信息

2.不加括號能夠看方法的實現

類型幫助

使用help misc查看 mongo shell中瘋長的可用類。

4.2.2.5 Mongo shell快速參考手冊

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文件

4.3管理參考

包含如下內容,ulimit設置,system collectionMongodb擴展JSON,數據庫profile輸出,journaling機制,退出代碼和狀態。

4.3.1 Unix ulimit設置

不少相似unix系統都提供了資源控制,固然有時候默認值過低會致使大量的mongodb經常使用操做。

4.3.1.1 資源利用

一般,全部的mongodmongos實例會跟蹤一下信息:

         1.使用1個文件描述符和1個線程跟蹤每一個income 鏈接。

         2.跟蹤每一個內部的線程或者pthread都做爲一個系統進程

mongod

1.mongod實例中每一個文件1個文件描述符

2.journaltrue,每一個journal文件1個描述符

3.在複製集中,每一個mongod維護了到其餘全部成員的鏈接

mongod使用後臺線程,用於TTL collection,複製,複製集的健康檢查,這些都會消耗一些性能。

mongos

客戶端鏈接所使用的線程和文件描述符,全部config數據庫和shard的鏈接,複製集全部成員的鏈接。考慮一下幾點:

         1.mongos維護一個鏈接池,能夠直接重用鏈接不須要從新建立

         2.使用maxConns選項限制income鏈接數

4.3.1.2查看和設置資源限制

ulimit

ulimit:相似有多少cpu可讓一個用戶使用

ulimit:強制對一個session或者進程的可用資源的限制

因此軟ulimit可能會致使沒法建立鏈接的狀況,因此ulimit配置很重要。

ulimit是針對每一個用戶的不一樣的資源,而後能夠經過ulimit -n <value>這種方式修改

/proc 文件系統

能夠經過如下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

4.3.1.3推薦設置

-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

4.3.2 系統collection

4.3.2.1簡介

mongodb把一些系統信息都存放在<database>.system.*namespace下面,不要建立以system開頭的collection

4.3.2.2 Collections

系統collection包含以下:

<database>.system.namespaces:包含了數據庫collection的全部信息

<database>.system.indexs:包含了數據庫中全部的索引

<database>.system.profile:包含了數據庫profiling信息

<database>.system.users:包含了用戶證書信息

<database>.system.js:包含了全部服務端javascript代碼

4.3.3 MongoDB擴展JSON

mongodb 手冊 2.4.8 page 227本身查看

4.3.4 數據庫profile輸出

profile開啓後,mongodb會把數據寫入到system.profile這個capped collection中,能夠直接查詢這個capped collection查看捕獲的數據。

4.3.4.1輸出例子

{

         "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

4.3.5 journaling 機制

當啓動journalmongodb會在把寫入操做應用到數據文件以前先寫入journal文件,寫入的間隔爲commitIntervalMs,因此當出現故障可能會丟失commitIntervalMs時間的數據

4.3.5.1 journal 文件

journal啓動後就會建立journal文件,在dbpath下,journal文件被保存在journal文件夾下,文件都是以順序寫的方式寫入,乾淨關閉實例,會把journal文件夾下的文件所有刪除。

journal文件是隻能追加的,而且都是以j._開頭,當journal文件超過1gb的數據,就會自動建立新的文件,一旦文件中的操做都被mongodb應用,那麼文件就會被刪除,因此通常只會保留2-3個文件。

能夠啓用smallfiles配置選項,把journal 文件最大設置爲128MB

爲了保證寫入的速度,能夠把文件放到其餘系統上。注意若是journal和數據文件再也不同一個文件系統中,不要直接使用快照來抓取備份,請查看快照備份

可能會在mongodb啓動的時候經歷,預分配延遲,致使這一段時間內,沒法鏈接到數據庫。由mongodb決定是經過預分配的方式仍是須要的是後再建立文件的方式處理。

4.3.5.2 journal使用的存儲視圖

journal使用了3部分存儲視圖:shared viewprivate viewprivate cache

shared viewshared view 保存了更新到數據庫文件的數據,是惟一一個能夠訪問數據庫文件的view,當啓用journalmongod要求操做系統映射磁盤上的文件到shared view上,可是不加載他們,而後mongodb把數據庫文件按需加載到shared view 上。

private view:保存用戶讀操做的數據,當新的寫入操做時,mongodbprivate view 映射到shared view

private cachejournal是磁盤上的視圖,在寫入到數據文件以前,把寫入操做先寫入到了private cache上,用於寫入到journal文件上。

4.3.5.3 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

4.3.6 退出代碼和狀態

mongodb退出的時候會更一下代碼和狀態,能夠用於troubleshooting

0mongodb正常退出

2:和其餘選項不兼容致使的錯誤

3:當命令行指定的主機名和local.sources不符時返回,當oplog collection不可讀是也可能會返回。

4:數據庫版本和mongod的版本不一樣。重啓mongod加上--upgrade選項更新數據庫到mongod支持的版本便可。

5moveChunk錯誤是發生

12:在windows下,當mongod接收到ctrl-c,關閉,break或者關閉命令時返回

14:當mongodb發生不可恢復的錯誤,沒法處理的異常或者沒法捕捉的signal。會乾淨的關閉。

20:在windows下,的WSAStartup函數中出錯時返回,也多是,windows下,不能成功安裝,啓動,刪除服務是出現。

45:當mongodb不能打開文件或者不能獲取文件上的鎖時,出現

47:當mongodb退出,須要大量的時間

48:若是socket關閉,mongod乾淨退出

49mongodmongos收到SCM的關閉信息

100mongod拋出一個沒法捕獲的異常

相關文章
相關標籤/搜索