某某茶叶有限公司欢迎您!
金沙棋牌在线 > 必赢棋牌官网 > Mongodb的oplog详解_MongoDB_脚本之家

Mongodb的oplog详解_MongoDB_脚本之家

时间:2019-12-23 03:21

1. 介绍

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB索引几乎和关系型数据库的索引一样.MongoDB的查询优化器能够使用这种数据结构来快速的对集合中的文档进行寻找和排序.准确来说,这些索引是通过B-Tree索引来实现的。在命令行中,可以通过调用ensureIndex()函数来建立索引,该函数指定一个到多个需要索引的字段,下面介绍mongodb索引如何优化

Oplog 是 MongoDB 实现复制集的关键数据结构,在复制集中 Primary 对数据库操作之后就会产生一个 Oplog 文档保存在 local.oplog.rs 集合中,Secondary 成员会拉取 Primary 的 Oplog 并重放相同的操作,从而达到 Secondary 成员与 Primary 有一致的数据。实际上复制集中每一个成员都会保存 Oplog,其他成员会根据连接延迟等因数选择最近的成员拉取 Oplog 数据。

Mongodb读数据操作

不管数据库是在多安全的环境或者本地环境,给数据库建立一个安全的环境是很有必要的。

一、索引简介

Oplog 存在集合 local.oplog.rs,这是系统内置集合,一个 capped collection,即是这个 collection 有固定大小,一旦写满数据会从头开始写入,就像一个圆形的队列结构。这个 collection 大小在初始化集群时设置,默认的大小是 5% 的空闲磁盘空间,也可以在配置文件设置 oplogSizeMB 选项,或者在启动 MongoDB 后使用 replSetResizeOplog 命令动态设置 collection 大小。

Mongodb读数据操作有两个方法

Mongodb提供了一系列的 安全功能 ,这里介绍一种很常用的身份验证方式。

db.refactor.insert({"username":"refactor","age":24,"isactive":true})db.refactor.insert({"username":"refactor","age":30,"isactive":false})db.refactor.insert({"username":"aaaaa","age":24,"isactive":false})db.refactor.insert({"username":"aaaaa","age":34,"isactive":true})db.refactor.insert({"username":"sssssss","age":24,"isactive":true})db.refactor.insert({"username":"tttttt","age":24,"isactive":true})db.refactor.insert({"username":"tttttt","age":54,"isactive":true})db.refactor.insert({"username":"bbbbb","age":24,"isactive":false})db.refactor.insert({"username":"rrrrr","age":24,"isactive":true})db.refactor.insert({"username":"rrrrr","age":54,"isactive":false})

Oplog 与 MongoDB 的其他的文档没有什么不同,它固定有一些属性:

>find;

2. 开启验证

要按照username键进行查找,就可以在此键上建立索引,来提高查询速度.

ts: MongoDB 的内置的特殊时间戳数据结构,如 Timestamp, 由秒级的 Unix 时间戳和一个顺序增长的整数 increment 表示。长度为 64 位,其中 Unix 时间戳占 32 位,后 32 位可以保存同一秒内的第几次操作。 h: hash 值代表每个 Oplog 的唯一标识。 v: Oplog 版本 ns: namespace 命名空间,数据库+集合,用 database.collection 表示。但如果是表操作命令等,变成 database.$cmd。 op:operation type,操作类型,包含以下几种: i: insert, 插入文档 u: update, 更新文档 d: delete, 删除文档 c: command, 操作命令,如 createIndex 等 n: 空操作,用于空闲时主从同步 Oplog 时间信息 o: operation, Oplog 操作的具体内容,例如 i operation type,o 即是插入的文档。对于 u operation type, 只更新部分内容, o 键的内容为 {$set: {...}} o2: 用于 update 操作,包含 _id 属性值。

find()方法是最主要的方法,find方法返回一个指向包含查询结果集数据的游标

默认情况下,只要在启动数据库的时候没有加上 --auth 选项,就是没有身份验证功能的,所有客户端都可以进行所有权限的操作。

db.refactor.ensureIndex

Oplog 的重放是幂等的,即是说同一个 Oplog 重放多次最终结果还是一致的。这是 MongoDB 将许多命令操作进行了转化,保持生成的 Oplog 是可以幂等的,如执行以下 $inc 操作:

标准命令是:db.collection.find(, )

如果加上过后,我们就可以通过安全的身份验证连接数据库。如果要在数据库中进行身份验证,可以通过 db.auth ,如果验证成功则返回1,反之。

要按照username,age键进行查找,就可以在此键上建立索引,来提高查询速度.

db.test.update({_id: ObjectId("533022d70d7e2c31d4490d22")}, {$inc: {count: 1}})

其中相当于sql语句中的where 条件语句;

3. 建立用户

db.refactor.ensureIndex({"age":1,"username":1})

产生的 Oplog 为:

相当于要取出的字段。

建立用户我们可以通过 db.createUser() 方法来建立用户,比如下面这样:

传递给ensureIndex的文档是一组值为1或-1的键,1为升序,-1为降序,表示索引的创建方向.若索引只有一个键,则方向无关紧要.

{ "ts" : Timestamp, "t" : NumberLong, "h" : NumberLong, "v" : NumberInt, "op" : "u", "ns" : "mongo.test", "o2" : { "_id" : ObjectId("533022d70d7e2c31d4490d22") }, "o" : { "$set" : { "count" : 2.0 } }}

这里要注意的是,如果不指明query那么指的是查出全部的数据;

db.createUser({user: 'username', pwd: 'password', roles: [ {role: 'read', db: 'test'}]});

若是有多个键,就得考虑索引的方向问题了.

以上 MongoDB 可以保证 Oplog 的数据操作是幂等的,但数据表操作命令无法保证,例如重复执行相同的 createIndex 命令。

还可以查询一个条件多个值的情况

db.createUser 方法的接受一个对象,里面的user代表用户名,pwd代表密码,而roles是一个数组可以接受多个对象,每个对象可以对应作用于的数据库,其中的role字段代表对作用的数据库的权限,官方规定了一些列的内置角色,可以通过 文档查询 。

二、mongodb自带的就有监控,根据这些监控信息,可以做为优化的依据

Oplog 的查询

Eg:db.test.find({_id :{$in:[1565,ObjectId(“564b408cf3e596a45ed9d243”)] }})

删除用户需要具有权限的用户进行操作,通过 db.dropUser() 方法进行,接受一个字符串,这个字符串就是用户名:

1、explain执行计划

Capped collection 内文档是以插入顺序排序的,没有其他索引,但是 local.oplog.rs 是一个特殊的 capped collection,在 Wiredtiger 引擎的话,Oplog 的时间戳会作为一个特殊的元信息存储,使得 Oplog 可以以 ts 字段排序,查询 Oplog 时可以利用 ts 字段筛选。

db.test.find({ awards: {$elemMatch: {award: 'test',year: { $gt: 2000 } } }})