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抛出一个没法捕获的异常

相关文章
相关标签/搜索