MongoDB配置文件
Mongod在启动时可以通过-f指定一个配置文件(此配置文件中配置了必要的运行参数),或也可以通过mongos命令行选项启动。但是一般情况使用配置文件管理的mongod或mongos更容易,尤其是对于大型部署来说,因为可以向配置文件添加注释来解释服务器的设置。
如果使用安装包安装MongoDB默认就会使用一个配置文件(/etc/mongod.conf),如果是编译或二进制安装Mongodb那么就需要自定义一个配置文件。
文件格式
目前为止Mongodb已经更新到了3.2版本,但从2.6版本开始Mongodb的配置文件格式使用了YAML(YAML是一种教新的“文本标记语言”参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822,更容易阅读)格式,且2.4的配置文件格式仍向后兼容。
文件选项
在Mongod安装包中,包含2个进程启动文件:mongod和mongos(后面讲Sharding cluster时介绍mongos进程);其中mongd是核心基础进程,用来接收读写请求、负责存储实际数据,mongod实例是构成集群的基本单位,比如Replication set、Sharding Cluster、Config Servers等;mongos是Sharding Cluster架构模式中的“路由”进程,即客户端请求访问mongos,然后有mongos将请求转发给合适的sharding server执行操作,并将result返回给客户端,所以mongod基本不存储数据,只是在内存中保存部分shard key与sharding server的对应关系,便于路由。
在配置文件方面,mongod和mongos有很多相同之处,下文中如有区别之处将会特别指出。
在一个节点上,通常同时启动mongod和mongos进程是正常的,他们之间不存在资源竞争,但是为了避免冲突,我们希望它们使用各自的配置文件,比如mongod.conf、mongos.conf;mongodb的某些平台下的安装包中没有自带配置文件,需自行创建。
下面提供一份MongoDB副本集在生产环境中的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# mongod.conf # # systemLog: systemLog: destination: file logAppend: true path: /data/mongodb/mongodb-vr-27017/log/mongodb.log logRotate: rename timeStampFormat: ctime # storage: storage: dbPath: /data/mongodb/mongodb-vr-27017/db journal: enabled: true commitIntervalMs: 100 directoryPerDB: true syncPeriodSecs: 60 engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 10 journalCompressor: snappy indexConfig: prefixCompression: true # processManagement: processManagement: fork: true pidFilePath: /data/mongodb/mongodb-vr-27017/pid/mongodb.pid # net: net: port: 27017 bindIp: 0.0.0.0 maxIncomingConnections: 65536 wireObjectCheck: true ipv6: false # security: security: keyFile: /data/mongodb/mongodb-vr-27017/key/mongokey authorization: enabled # operationProfiling: operationProfiling: slowOpThresholdMs: 100 mode: slowOp # replication: replication: oplogSizeMB: 5120 replSetName: vr1 enableMajorityReadConcern: false # setParameter: setParameter: enableLocalhostAuthBypass: true # sharding: # auditLog: # snmp: |
下面我们来说说MongoDB配置文件常用选项含义(YAML格式)
一、日志相关参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
systemLog: verbosity: 0 quiet: false traceAllExceptions: false syslogFacility: <string> path: /var/log/mongodb/mongod.log logAppend: true logRotate: rename destination: file timeStampFormat: ctime component: accessControl: verbosity: 1 command: verbosity: 1 |
systemLog.verbosity
#日志级别,默认值0包含“info”信息,“1~5”即大于0的值均会包含debug信息。还可以使用不同的详细程度为命名的组件,使用组件的详细级别设置。例如,使用systemlog.component.accesscontrol.verbosity设置专门为访问组件的详细程度。
systemLog.quite
#如果值为“true”,此时mongod将会尝试减少日志的输出量,不建议在production环境下开启,否则将会导致跟踪错误比较困难。
systemLog.traceAllExceptions
#如果值为“true”,则打印调试详细信息,用于支持相关的故障排除的附加日志。
systemLog.syslogFacility
#指定用于登录时信息到syslog Facility水平,你指定的值必须由你的操作系统实现支持syslog。要使用此选项,您必须启用– syslog。
systemLog.path
#将所有诊断日志信息写入日志文件而不是标准输出或主机的日志系统。MongoDB在你指定的路径创建日志文件。默认情况下,MongoDB将覆盖现有的日志文件,如果想要追加到日志文件,需要设置–logAppend选项。
systemLog.logAppend
#为true时,当mongod/mongos重启后,将在现有日志的尾部继续添加日志。否则,将会备份当前日志文件,然后创建一个新的日志文件。
systemLog.logRotate
#日志回转,防止一个日志文件特别大,则使用logRotate指令将文件“回转”,可选值:
1)rename:重命名日志文件,默认值。
2)reopen:使用Linux日志rotate特性,关闭并重新打开此日志文件,可以避免日志丢失,但是logAppend必须为true。
systemLog.destination
#日志输出目的地,可以指定为“ file”或者“syslog”,如果指定file那么你还必须指定systemLog.path,如果你不指定systemlog.destination,MongoDB将日志输出到标准输出。
systemLog.timeStampFormat
#指定日志格式的时间戳格式,有如下值:
ctime:显示时间戳如:Wed Dec 31 18:17:54.811
Iso8601-utc:显示时间戳以协调通用时间(UTC)在ISO-8601中的格式,例如,纽约时代的开始时间:1970-01-01t00:00: 00.000z
iso8601-local:显示当地时间ISO-8601格式显示时间戳
systemLog.component
为不同的组件指定各自的日志信息级别,Mongodb支持使用日志功能的组件可以使用db.getLogComponents()方法可以查看日志消息支持的组件。大致有ACCESS、COMMAND、CONTROL、GEO、INDEX、NETWORK、QUERY、REPL 、SHARDING、STORAGE、JOURNAL、WRITE等,具体的含义看MongoDB日志信息介绍章节。
二、存储引擎相关参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
storage: dbPath: /data/db indexBuildRetry: true repairPath: _tmp journal: enabled: true commitIntervalMs: 100 directoryPerDB: false syncPeriodSecs: 60 engine: wiredTiger mmapv1: preallocDataFiles: <boolean> nsSize: <int> quota: enforced: <boolean> maxFilesPerDB: <int> smallFiles: <boolean> journal: debugFlags: <int> commitIntervalMs: <num> wiredTiger: engineConfig: cacheSizeGB: <number> statisticsLogDelaySecs: <number> journalCompressor: <string> directoryForIndexes: <boolean> collectionConfig: blockCompressor: <string> indexConfig: prefixCompression: <boolean> |
storage.dbPath
#mongod进程存储数据目录,此配置仅对mongod进程有效。默认值为:/data/db。
storage.indexBuildRetry
#当构建索引时mongod意外关闭,那么再次启动是否重新构建索引;索引构建失败,mongod重启后将会删除尚未完成的索引,但是否重建由此参数决定。默认值为true。
storage.repairPath
#配合–repair启动命令参数,在repair期间使用此目录存储临时数据,repair结束后此目录下数据将被删除,此配置仅对mongod进程有效。不建议在配置文件中配置,而是使用mongod启动命令指定。
storage.journal.enabled
是否开启journal日志持久存储,journal日志用来数据恢复,是mongod最基础的特性,通常用于故障恢复。64位系统默认为true,32位默认为false,建议开启,仅对mongod进程有效。
storage.journal.commitIntervalMs
mongod日志刷新值范围从1到500毫秒。较低的值增加了杂志的耐久性,以牺牲性能为代价,在wiredtiger引擎上,默认的日志提交间隔为100毫秒。建议不要修改。
storage.directoryPerDB
是否将不同DB的数据存储在不同的目录中,dbPath的子目录,目录名为db的名称。对已经存储数据的mongod修改此值,需要首先使用mongodump指令将数据导出,然后关闭mongod,再修改此值和指定新的dbPath,然后使用mongorestore指令重新导入数据。(即导出数据,并使用mongorestore将数据重新写入mongod的新目录中)
对于replica set架构模式,只需要在每个secondary依次操作:关闭secondary,然后配置新的dbPath,然后启动即可(会执行初始化sync,从primary中将数据去完全同步到本地)。最后操作primary。此参数仅对mongod进程有效,默认值为false。
storage.syncPeriodSecs
mongod使用fsync操作将数据flush到磁盘的时间间隔,默认值为60(单位:秒),强烈建议不要修改此值;mongod将变更的数据写入journal后再写入内存,并间歇性的将内存数据flush到磁盘中,即延迟写入磁盘,有效提升磁盘效率。此指令不影响journal存储,仅对mongod有效。
storage.engine
从mongodb3.2开始,官方已经开始默认使用wiredTiger存储引擎,在3.2之前默认使用mmapv1存储引擎。mongodb数据库的存储引擎,可用的值包括:
mmapv1:指定mmapv1存储引擎(3.2之前默认使用)
wiredTiger:指定wiredTiger存储引擎(3.2开始默认使用)
inMemory:指定内存存储引擎(在3.2还是bate版本)
storage.mmapv1 Options
由于mmapv1存储引擎后续不会在使用所以这里就不介绍,如果想了解就去看参考地址中查询相关参数的意义,下面主要介绍WiredTiger引擎。
storage.wiredTiger Options
wiredTiger引擎在3.2版本开始就成为mongodb的默认存储引擎,下面介绍其参数:
storage.wiredTiger. engineConfig.cacheSizeGB
wiredtiger将使用所有数据的最大缓存大小,wiredTiger缓存工作集(working set)数据的内存大小,单位:GB,此值决定了wiredTiger与mmapv1的内存模型不同,它可以限制mongod对内存的使用量,而mmapv1则不能(依赖于系统级的mmap)。默认情况下,cacheSizeGB的值为假定当前节点只部署一个mongod实例,在MongoDB 3,默认情况下,wiredtiger缓存,使用1 GB或安装的物理内存的一半,以较大者为准。如果当前节点部署了多个mongod进程,那么需要合理配置此值。如果mongod部署在虚拟容器中(比如,lxc,cgroups,Docker)等,它将不能使用整个系统的物理内存,则需要适当调整此值。默认值为物理内存的一半。
storage.wiredTiger. engineConfig.statisticsLogDelaySecs
默认值设置为0,wiredtiger不做日志统计。
storage.wiredTiger. engineConfig.journalCompressor
journal日志的压缩算法,默认为“snappy”,可选值为“none”、“snappy”、“zlib”。
storage.wiredTiger.engineConfig.directoryForIndexes
是否将索引和collections数据分别存储在dbPath单独的目录中。即index数据保存“index”子目录,collections数据保存在“collection”子目录。默认值为false,仅对mongod有效。
storage.wiredTiger.collectionConfig.blockCompressor
collection数据压缩算法,可选值“none”、“snappy”、“zlib”。开发者在创建collection时可以指定值,以覆盖此配置项。如果mongod中已经存在数据,修改此值不会带来问题,旧数据仍然使用原来的算法解压,新数据文件将会采用新的解压缩算法。
storage.wiredTiger.indexConfig.prefixCompression
是否对索引数据使用“前缀压缩”(prefix compression,一种算法)。前缀压缩,对那些经过排序的值存储,有很大帮助,可以有效的减少索引数据的内存使用量。默认值为true。
三、进程相关参数
1 2 3 |
processManagement: fork: true pidFilePath: /var/run/mongodb/mongod.pid |
processManagement.fork
是否以fork模式运行mongod/mongos进程,默认情况下,mongod/mongos不作为守护进程运行,默认为true。
processManagement.pidFilePath
配合”fork:true”参数,将mongod/mongos进程ID写入指定的文件,如果不指定,将不会创建PID文件。
四、网络相关参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
net: port:27017 bindIp:0.0.0.0 maxIncomingConnections: 65536 wireObjectCheck: true ipv6: false unixDomainSocket: enabled: <boolean> pathPrefix: <string> filePermissions: <int> http: enabled: <boolean> JSONPEnabled: <boolean> RESTInterfaceEnabled: <boolean> ssl: sslOnNormalPorts: <boolean> # deprecated since 2.6 mode: <string> PEMKeyFile: <string> PEMKeyPassword: <string> clusterFile: <string> clusterPassword: <string> CAFile: <string> CRLFile: <string> allowConnectionsWithoutCertificates: <boolean> allowInvalidCertificates: <boolean> allowInvalidHostnames: <boolean> disabledProtocols: <string> FIPSMode: <boolean> |
net.port
mongod/mongos侦听端口,默认为27017;不过因为mongodb有2种典型的架构模式:replica set和sharding,如果开发者在一个节点上部署多个mongod实例,需要注意修改此端口以避免冲突。
net.bindIp
mongod/monogs进程绑定的IP,application通过此IP、port建立链接。可以绑定在任意网卡接口上,如果你的mongos/mongod只需要内网访问,可以绑定在内网IP(例如:192.168.1.100),如果需要外网访问,那么则绑定外网IP,如果此值为“0.0.0.0”,则绑定到所有接口即内网、外网IP均可以访问。(不建议)可以绑定都多个ip上,ip地址之间用“,”分割。
net.maxIncomingConnections
mongod/mongos进程允许的最大连接数,如果此值超过操作系统配置的连接数阀值,将不会生效(ulimit);默认值为65536。通常客户端将会使用连接池机制,可以有效的控制每个客户端的链接个数。
net.wireObjectCheck
当客户端写入数据时,mongos/mongod是否检测数据的有效性(BSON),如果数据格式不良,此insert、update操作将会被拒绝;默认值为true。对于高程度的子文档嵌套的对象,net.wireobjectcheck对性能有较小的影响。
net.ipv6
是否支持mongos/mongod多个实例之间使用IPV6网络,默认值为false。此值需要在整个cluster中保持一致。
net.unixDomainSocket.enabled
net.unixDomainSocket.pathPrefix
net.unixDomainSocket.filePermissions
这三个参数都是适用于Unix系统,启用或禁用监听Unix域套接字,net.unixdomainsocket.enabled仅适用于基于UNIX的系统。当值为true,mongos或mongod监听在UNIX套接字。以及设置套接字后缀和套接字文件的权限。
五、安全相关参数
1 2 3 |
security: keyFile: /data/mongokey authorization: enabled |
security.keyFile
对于副本集模式,指定副本集节点间身份验证密钥文件的路径,注意这个只是副本集节点间的认证,跟Mongodb认证和授权不是一回事。
security.authorization
开启或关闭副本集模式下的MongoDB认证功能,如果开启后,进入MongoDB时就需要认证了,具体MongoDB认证和用户权限配置可以看MongoDB认证和授权。
六、慢查询相关参数
1 2 3 |
operationProfiling: slowOpThresholdMs: 100 mode: off |
operationProfiling.slowOpThresholdMs
数据库profiler判定一个操作是“慢查询”的时间阀值,单位毫秒;mongod将会把慢查询记录到日志中,即使profiler被关闭。当profiler开启时,慢查询记录还会被写入“system.profile”这个系统级的collection中。请参看mongod profiler相关文档。默认值为100,此值只对mongod进程有效。
operationProfiling.mode
数据库profiler级别,操作的性能信息将会被写入日志文件中,可选值:
1)off:关闭profiling。
2)slowOp:on,只包含慢操作日志。
3)all:on,记录所有操作。
数据库profiling会影响性能,建议只在性能调试阶段开启。此参数仅对mongod有效。
七、复制集相关参数
1 2 3 4 5 |
replication: oplogSizeMB: 10240 replSetName: <string> secondaryIndexPrefetch: all enableMajorityReadConcern: false |
replication.oplogSizeMB
replication操作日志的最大尺寸,单位:MB。mongod进程根据磁盘最大可用空间来创建oplog,比如64位系统,oplog为磁盘可用空间的5%,一旦mongod创建了oplog文件,此后再次修改oplogSizeMB将不会生效。此值不要设置的太小, 应该足以保存24小时的操作日志,以保证secondary有充足的维护时间;如果太小,secondary将不能通过oplog来同步数据,只能全量同步。此值仅对mongod有效。
replication.replSetName
“复制集”的名称,复制集中的所有mongd实例都必须有相同的名字,sharding分布式下,不同的sharding应该使用不同的replSetName。仅对mongod有效。
replication.secondaryIndexPrefetch
默认值all,复制集中的secondary,从oplog中运用变更操作之前,将会先把索引加载到内存中,默认情况下,secondaries首先将操作相关的索引加载到内存,然后再根据oplog应用操作。可选值:
1)none:secondaries不将索引数据加载到内存。
2)all:sencondaries将此操作有关的索引数据加载到内存。
3)_id_only:只加载_id索引。
replication.enableMajorityReadConcern
是否开启readConcern的级别为“majority”,默认为false;只有开启此选项,才能在read操作中使用“majority”。(3.2+版本)
八、分片相关参数
1 2 3 |
sharding: clusterRole: <string> archiveMovedChunks: <boolean> |
sharding.clusterRole
在sharding集群中,此mongod实例的角色,可选值:
1)configsvr:此实例为config server,此实例默认侦听27019端口
2)shardsvr:此实例为sharding(分片),侦听27018端口
此配置仅对mongod有效。通常config server和sharding server需要使用各自的配置文件。
sharding.archiveMovedChunks
当chunks因为“负载平衡”而迁移到其他节点时,mongod是否将这些chunks归档,并保存在dbPath下“moveChunk”目录下,mongod不会删除moveChunk下的文件。默认为true。
九、自定义变量
1 2 3 |
setParameter: <parameter1>: <value1> <parameter2>: <value2> |
设置Mongodb服务器的参数,以上是在YAML格式中格式设置。MongoDB服务器参数参考地址https://docs.mongodb.org/manual/reference/parameters/。例如,在配置文件中指定enablelocalhostauthbypass。
1 2 |
setParameter: enableLocalhostAuthBypass: false |
十、审计相关参数
1 2 3 4 5 |
auditLog: destination: <string> format: <string> path: <string> filter: <string> |
auditLog.destination
开启审计,需指定审计记录的输出方式,有以下值可选syslog、console、file。
auditLog.format
目标文件的输出文件格式,有如下值:
JSON: 输出的审计事件的JSON格式文件,–auditpath指定。
BSON: 输出的审计事件的JSON格式文件,–auditpath指定。
auditLog.path
如果审计时间输入为文件,那么这里就需要指定文件的完整路径及文件名。
auditLog.filter
过滤器,可以限制审计系统记录的操作类型,该选项需要一个表单的查询文档的字符串表示形式:{ <field1>: <expression1>, … }
参考
https://docs.mongodb.org/manual/reference/configuration-options/
http://shift-alt-ctrl.iteye.com/blog/2242907