标签归档:Mongodb

Mongodb 副本集

介绍

Mongodb官方提供了一个复制功能,它提供冗余的功能,它可以将数据保存在不同服务器上,并保持多个服务器的数据一致性。

当主要提供数据的服务器出现了问题不能访问等问题,副本集中的其他服务器会自动替代主要提供数据的服务器进行提供数据功能。

副本集中有三个角色:

  1. 主节点:所有副节点的数据均来自于主节点,并且只能对主节点进行读写操作。
  2. 副节点:数据来自于主节点,可以进行读取操作,但是不能进行写操作。
  3. 仲裁者:不含数据也不与客户端交流,只在选举主节点的时候进行投票。

选举机制

Mongodb最多支持50个副本集成员以及最多7个选举成员,启动副本集后将开始第一次选举,在选举过程中,所有副本集成员都只能读取,直到选举出主节点后主节点才能进行读写,但是在这个期间副本成员可以提供查询服务。

而主节点要保持主节点的位置需要每两秒发送一个ping请求,如果10秒内没有得到响应则标记为不可访问,当一半以上的副本集成员不可访问,那么主节点将降级为副节点。

其中设置成员的priority值可以优先成员主节点,这个值介于0-1000之间,默认为1,如果这个值为0,那么它的votes值也为0,只要votes为0的成员不能投选举票,但是可以投否决票。但是我们也可以手动设置成员priority值为大于1的成员是否有投票权利

在进行选举的时候,其他成员会作以下几点判断来进行投票参与选举的成员是否能作为主节点,选举步骤:

  1. 自己是否能与主节点通讯。
  2. 参与选举的成员是否比其他参与选举的成员数据最新。
  3. 如果参与选举的成员数据相等则尝试使用具有最高priority的值的成员。

继续阅读

Mongodb MapReduce

前言

在上一节中说到了appregate聚合功能,聚合功能已经非常强大了,但是如果你还是无法通过聚合解决问题的话,那么你可能需要使用MapReduce了。

MapReduce提供了Javascript的解释器,所以非常的强大,并且MapReduce可以在多台服务器之间并行的执行,将一个大问题拆分为多个小问题然后分发执行并返回,但是这样的代价就是牺牲了速度,所以才产品发布环境中尽量不要使用MapReduce,因为会很慢很慢。

MapReduce分为两个部分,一个为map一个为reduce,它们两个都是一个纯Js函数,map分别对作用的集合里的每一个文档传入自身函数进行调用返回了一个不同键值对组成的一个列表,就像下面这样:

[
    a: [1,3,4],
    b: [5,3,4]
]

reduce就是对map执行完后的一个列表进行统计,最后返回。Reduce非常像appregate中的group分组。

如果上面的文字你还是听着有点模糊不清,那么下面这张图可以很好的帮助你理解MapReduce,然后看完文章你一定要在执行环境下实验,才能更好的理解强大的MapReduce,因为MapReduce不止存在于Mongodb中,它是由Google解决分布式计算提出的一种概念,Mongodb只是对这个概念的实现,所以MapReduce会出现在任何的一种数据库中。

理解mapreduce

图片原地址:壮壮熊

官方语法

官方文档中MapReduce的语法如下:

db.collection.mapReduce(
     <map>,
     <reduce>,
     {
       out: <collection>,
       query: <document>,
       sort: <document>,
       limit: <number>,
       finalize: <function>,
       scope: <document>,
       jsMode: <boolean>,
       verbose: <boolean>,
       bypassDocumentValidation: <boolean>
     }
);

除了上面所说的mapreduce函数之外,Mongodb还增加了一个选项,在这里选项里面我们可以快速的筛选一部分文档,给MapReduce,这么做的愿意是尽可能的让MapReduce执行更快,比如上面的query可以过滤一些不符合的文档、sort排序、limit限制返回的文档数量等,如果你需要筛选文档、排序、限制等操作,尽量在选项中进行操作,因为如果你让1000文档每个文档遍历给Js函数快还是让Mongodb内部查询1000个文档快?当然是后者。

继续阅读

Mongodb 聚合

参考

MongoDB权威指南(第2版)

Mongodb Docs

前言

Mongodb提供了一个强大的处理框架,可以对集合中的文档进行各种组合、过滤、输出,如果你通过Mongodb其他的查询方法无法处理你的查询或者查询难度很高,那么你可以试试聚合。

这里我们只讲解一下常用的聚合管道操作符,其他的可以自行到官方文档进行查询。

语法

官方文档的聚合语法是这样的:

db.collection.aggregate(pipeline,options);

聚合:计算集合或视图中数据的聚合值,并且聚合接受一个数组,数组的每一个成员都是对象,对象里面子键都代表一个管道操作,按照顺序的从第一个管道操作到最后一个,每次操作完的文档返回给下一个管道操作。

  • pipeline: 一系列数据聚合操作或阶段。有关详细信息,请参阅 聚合管道运算,在版本2.6中更改:该方法仍然可以将流水线阶段接受为单独的参数,而不是数组中的元素; 但是,如果不指定pipeline为数组,则不能指定 options参数。
  • options:可选的。aggregate()传递给aggregate命令的附加选项。版本2.6中的新功能,仅当您指定pipeline为数组时可用。

大概我们可以把聚合理解为对文档进行一系列的操作从而达到我们需要的查询文档,聚合提供了很多管道操作符,这些管道操作符就像一根一根的管道一些,而我们通过聚合操作的文档就像管道里面的水,这根管道流下来的水继续流到下一根管道,直到没有了管道,水就流出来了。

继续阅读

Mongodb GridFS

参考

MongoDB权威指南(第2版)

Mongodb Docs

前言

Mongodb提供了一个轻量级的文件系统来专门处理超过16MB的文件,这个文件系统叫GridFS,它的使用非常简单,几乎所有的Mongodb驱动程序都提供了GridFS APIGridFS将集合放在一个共享的储存区域,GridFS使用两个集合来存储我们存放的数据:

  • fs.files:这个集合当中的每一个文档都表示一个文件的信息
  • fs.chunks:这个集合中存放实际的数据内容

GridFS存储的文件无法进行修改,如果要进行修改只能删除修改的文档,然后再将修改完的文档重新保存。

下面讲一下如何使用Mongodb提供的mongodfiles客户端来操作GridFS数据:

继续阅读

Mongodb特殊索引和集合

参考

MongoDB权威指南(第2版)

Mongodb Docs

特殊集合

封顶集合

封顶集合和普通集合不一样,普通集合的大小是可以随着数据的增加而增加的,封顶集合是在创建的时候就已经设置了集合的大小。

封顶集合的大小已经满了后,当再次插入数据的时候,它会把最老的数据丢掉,然后写入新数据,封顶集合不难看出很适合当log型数据库。

创建封顶集合

创建封顶集合我们需要显式的创建集合,因为需要在显式创建的方法中设置一些选项,同时我们需要在选项中设置两个选项cappedsize

db.createCollection('test', {
    capped: true,
    size: 10485760
})

上面的代码中capped设置为true代表创建的文档是一个封顶文档,而设置了cappedtrue后,必须指定size选项,size选项是指定的固定集合的大小,单位为字节(Byte)。

继续阅读