分类目录归档:数据库

Mongodb 数据修复

介绍

很多时候我们看见数据目录下有一个mongodb.lock文件,这个文件在开启了日志系统后不会出现,在没有开启日志系统的情况下非常重要,并且有时发现重新启动数据库的时候无法启动了,然后删除mongodb.lock又可以启动了,但是尽量不要这样做。

当Mongodb启动的时候会建立一个mongodb.lock文件,而正常退出的时候就会删除这个文件,但是遇见非正常退出,这个文件就滞留了,Mongodb就会得知上一次是非正常退出,所以第一时间不是删除这个文件启动,而是尝试着修复数据,再进行启动。

mongod –repair

mongod内置了一个修复数据的选项,这个工具相比与下面介绍的另一种工具来说这种在修复的速度上要稍微快一下,我们只需指定修复的数据库路径,然后加上选项就可以进行修复了。

$ mongod --dbpath /data/blog --repair

继续阅读

Mongodb 监测

介绍

为什么要进行监控状态,因为在实际的情况中可能会发生一下无法预计的情况,比如阻塞的问题,阻塞的原因会有很多种情况造成,如果当我们查询文档的时候发生了阻塞,那么就会影响到后面的操作,甚至无法对后面的操作进行响应。

我们可以通过监控很快速的找到到底是哪里出了问题,这样有助于我们快速定位所在的问题,从而得到解决。

Mongodb官方提供了三种用语分析Mongodb的方式:

  1. Mongodb自带的监控工具:用于提供数据库活动的实时报告
  2. 数据库命令:以更真实的情况返回数据库状态的统计信息
  3. 第三方平台托管监控

Mongodb自带监控工具

mongostat

mongostat是官方随同mongodb下载包中一同下载的,你可以找到安装目录或者解压目录进行使用。

我们可以通过mongostat --help()进行查询可用选项,也可以通过官方文档进行查询。

Mongostat默认所返回的信息都是基于秒为单位,比如返回的insert指的是每秒插入数据库的对象数,而如果我们限制了返回时间,那么这个返回的结果是基于限制时间的平均值。

继续阅读

Mongodb 分片

介绍

分片是指将数据拆分,并分散放在多个服务器中组成一个集群,这可以将N台服务器的性能集中到一起来处理数据,这将很大程度的提高数据处理的速度。

在Mongodb的分片中必须具备三个角色:

  1. 路由服务器:用于处理和响应请求,并把各个分片服务器查询到的结果处理合并然后返回。
  2. 配置服务器(configServer):存储集群、数据的描述信息。
  3. 分片服务器:用于储存拆分的数据服务器。

而这三个角色都是普通的数据库,只是扮演的角色不一样。

它们的请求、响应流程就如下图中表示一样:

构造

因为所有的应用程序都是通过路由进行请求,所以对于应用程序来说,它没有什么不同就如请求一个普通数据服务器一样:

客户端请求

搭建配置服务器

首先我们需要搭建配置服务器,配置服务器如同分片的大脑,保存着集群和数据的描述信息。

因为Mongodb3.4版本后需要配置服务器必须配置为副本集,所以需要给配置服务器配置副本集,如果你还清楚如何搭建副本集,你可以试着看看我的上一篇文章《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个文档快?当然是后者。

继续阅读