MongoDB管理:副本集创建集合时慎用{autoIndexId: false}选项

MongoDB默认对_id字段建立索引

MongoDB创建集合时,默认会给集合创建id索引。用户如果不需要id索引,可以在创建结合时指定{autoIndexId: false}选项,这样创建出来的集合,就不会有任何索引了。

mongo-9552:PRIMARY> db.createCollection("testcoll", {autoIndexId: false});
{ "ok" : 1 }
mongo-9552:PRIMARY> db.testcoll.getIndexes()
[ ]

什么场景不需要id索引?

当你只需要顺序访问集合数据的时候,可以不对id字段建立索引以提高写入效率,比如MongoDB的local.oplog.rs集合,Secondary使用tailable cursor顺序的从Primary上读取oplog,故MongoDB没有对locol.oplog.rs建立id索引。

mongo-9552:PRIMARY> use local
switched to db local
mongo-9552:PRIMARY> db.oplog.rs.getIndexes()
[ ]

使用副本集时必须对id建立索引

MongoDB createCollection的介绍文档中,关于autoIndexId选项,有个小tips

IMPORTANT
For replica sets, all collections must have autoIndexId set to true.

官方建议使用副本集时,所有的集合必须要有id索引,但MongoDB目前没有强制这么做,3.2版本里如果创建集合时指定了{autoIndexID: false},会提示如下信息,说明官方也准备废弃该选项。

 the autoIndexId option is deprecated and will be removed in a future release

同时,MongoDB启动时也会有警告信息

WARNING: the collection 'test.testcoll' lacks a unique index on _id. This index is needed for replication to function properly

副本集中id索引为什么是必须的?

参考官方issuse

https://jira.mongodb.org/browse/SERVER-22902
https://jira.mongodb.org/browse/SERVER-8237

副本集中,如果集合没有id索引,会导致Secondary在同步数据时负载很高

接下来分析Secondary节点负载高产生的原因

先看一个线上的实际例子,某集合没有id索引,用户以在该集合上每秒insert 100个文档,

Primary CPU利用率: 0.3%左右
Secondary CPU利用率: 200+%  (随集合中文档数量增加不断上涨)

insert操作在Primary上执行后,Primary会记录一条oplog

mongo-9552:PRIMARY> db.colltest.insert({x: 1})
WriteResult({ "nInserted" : 1 })
mongo-9552:PRIMARY> use local
switched to db local
mongo-9552:PRIMARY> db.oplog.rs.find().sort({$natural: -1}).limit(1)
{ "ts" : Timestamp(1456886695, 2), "h" : NumberLong("-6988779545498609573"), "v" : 2, "op" : "i", "ns" : "test.colltest", "o" : { "_id" : ObjectId("56d653a7204536989bc13c6a"), "x" : 1 } }

接下来Secondary从Primary读取该oplog,并重放oplog,对于insert操作,Secondary的行为是执行一条upsert操作(根据id查询文档,如果已经存在则update,如果不存在则insert),来保证幂等性。

由于集合没有id索引,导致Secondary在做upsert时,必对整个集合做一次扫描,来确定id是否存在,当集合规模越来越大时,全集合扫描的开销也越来越大,导致Secondary的负载越来越高,最终会影响到Secondary上的读请求。

AliCloudDB for MongoDB的改进

为了避免用户误用{autoIndexId: false}选项,AliCloudDB for MongoDB在用户在创建集合时,如果指定了该选项,创建的动作会失败。已向MongoDB官方提pull request,see https://github.com/mongodb/mongo/pull/1071

时间: 2024-10-26 11:01:18

MongoDB管理:副本集创建集合时慎用{autoIndexId: false}选项的相关文章

MongoDB:副本集出现大量authenticate db日志

问题描述 MongoDB:副本集出现大量authenticate db日志 Sun Jan 11 00:15:06.082 [conn34] authenticate db: local { authenticate: 1, nonce: "b0d836d66e2ae743", user: "__system", key: "8c947498e52c2d06dedbef54493b2d59" } Sun Jan 11 00:15:08.987 [

MongoDB基于复制集创建索引

MongoDB在启用复制集(Replica Set)功能后,原先一个简单的索引添加,在之上会变得相对复杂,尤其是在数据量巨大的时候,需要考虑尽可能将性能影响降低到最小.基于此我们需要采取逐个节点创建索引的方式来达成.如下本文描述. 一.复制集索引创建的过程 MongoDB从节点上复制集上索引的创建,通常是在主节点索引创建完成之后. 在分片集群环境中,mongos将发送createindex()命令到每一个shard的主成员节点, 当主副本成员完成索引创建后,辅助副本开始创建索引. 二.如何最小化

配置MongoDB数据库 主从复制 副本集群 的详细步骤

一.部署主从复制 1.主服务器和从服务器必须开启安全认证:--auth2.主服务器和从服务器的admin数据库中必须有全局用户.3.主服务器的local数据库和从服务器的local数据均有名为repl且密码相同的用户名. 主服务器设置: dongguo@mongodb:~$ mongo MongoDB shell version: 2.2.0connecting to: test> use adminswitched to db admin> db.addUser('rootm','rootm

Mongodb 副本集搭建问题总结及解决办法_MongoDB

Mongodb 副本集搭建问题总结及解决办法 Mongodb数据库的副本集是由多台服务器组成,基中一台是主节点,其它为从节点,如果主节点宕机就自动切换到任意一个从节点.如果以前的主节点修复完成和正常运行就自动变成从节点,从节点不能查询数据.也可以在一台服务器装多个Mongodb端口不一样. 在我以往的认知中,一个系统一旦正式上线,多半不会轻易的迁移服务器,尤其是那种涉及到多个关联应用,涉及到多台硬件服务器的系统,因为这种迁移将是牵一发而动全身的. 但是,却仍然有这种情况存在,就如我这几天主要负责

Mongo shell:最强大的 MongoDB 管理工具

云数据库 MongoDB 版 基于飞天分布式系统和高性能存储,提供三节点副本集的高可用架构,容灾切换,故障迁移完全透明化.并提供专业的数据库在线扩容.备份回滚.性能优化等解决方案. 了解更多 Mongo shell 是 MongoDB 的命令行管理工具,功能非常强大,最近社区很多人咨询的一些问题,比如 命令行看 json 格式比较吃力? 如何确定Secondary节点同步是否跟上? 怎么查看DB.集合使用了多少空间? 能否在shell 脚本里调用Mongo shell 怎么执行 MongoDB

百度编辑器创建超链接时自动添加样式的方法

在使用"ueditor"编辑文本时,为了在创建超链接时,给所有需要创建的链接加上同样的class样式,图方便不能每次都去html模式编辑,所以最好的办法就是在创建超链接时,有个选项:选择就添加class样式,否则就不添加.那么步骤如下: 1.打开ueditor编辑器目录"ueditor\dialogs\link"里的link.html文件: 2.找到以下3处代码并编辑:  代码如下 复制代码 <tr>      <td colspan="

频道封面-请问dedecms的创建栏目时&amp;amp;quot;最终列表栏目&amp;amp;quot;是什么意思?

问题描述 请问dedecms的创建栏目时"最终列表栏目"是什么意思? dedecms创建栏目时,在常规选项中会有栏目属性,有三项即最终列表栏目, 频道封面,外部链接. 那么这里的最终列表栏目主是要什么啊,它与频道封面,外部链接的区别是什么? 解决方案 最终列表栏目就是作为显示栏目的列表,频道封面显示在首页上,外部链接包括指向外站的链接

CentOS 6.4创建Mongodb副本集_MongoDB

MongoDB是一个开源的non-SQL数据库引擎. MongoDB是可扩展的,是标准关系数据库管理系统(RDBMS)的替代品. 副本集可以使在节点发生故障时还能提供对您的数据的访问. 安装MongoDB 1.确保在副本集的每个成员设置好hostname nano /etc/hostname /etc/hostname: europa 2.创建一个文件以保存MongoDB存储库的配置信息: sudo touch /etc/yum.repos.d/mongodb.repo 3.如果运行的是64位系

MongoDB管理:慎用local、admin数据库

MongoDB副本集默认会创建local.admin数据库,local数据库主要存储副本集的元数据,admin数据库则主要存储MongoDB的用户.角色等信息. 慎用local数据库 local数据库,从名字可以看出,它只会在本地存储数据,即local数据库里的内容不会同步到副本集里其他节点上去:目前local数据库主要存储副本集的配置信息.oplog信息,这些信息是每个Mongod进程独有的,不需要同步到副本集种其他节点. 在使用MongoDB时,重要的数据千万不要存储在local数据库中,否