某某茶叶有限公司欢迎您!
金沙棋牌在线 > 必赢棋牌官网 > MongoDB的安装及配置文件选项全解_MongoDB_脚本之家

MongoDB的安装及配置文件选项全解_MongoDB_脚本之家

时间:2019-12-23 03:21

前言

MongoDB 是目前炙手可热的 NoSQL 文档型数据库,它提供的一些特性很棒:如自动 failover 机制,自动 sharding,无模式 schemaless,大部分情况下性能也很棒。但是薄荷在深入使用 MongoDB 过程中,遇到了不少问题,下面总结几个我们遇到的坑。特别申明:我们目前用的 MongoDB 版本是 2.4.10,曾经升级到 MongoDB 2.6.0 版本,问题依然存在,又回退到 2.4.10 版本。

安装部分1. 安装包1.1 mongodb-org可以自动安装以下的四个包1.2 mongodb-org-servermongod进程和配置文件,启动脚本1.3 mongodb-org-mongosmongos进程1.4 mongodb-org-shellmongo shell1.5 mongodb-org-tools其他mongodb工具,mongoimport,mongoexport,mongodump,mongrestore,mongofiles,bsondump,mongooplog,mongoperf,mongostat,mongotop,

前言

最近因为工作的需要,要用到mongodb,结果给mongo配置文件坑了好久,今天终于解决了。分享出来供大家参考学习,话不多说了,来一起看看详细的介绍吧。

MongoDB 数据库级锁

2. 脚本文件2.1 /etc/rc.d/init.d/mongod启动脚本2.2 /etc/mongod.conf配置文件

这是一篇日常使用MongoDB时候遇到的问题的解决技巧的文章,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

mongo3.4 版本,我是用YAML格式的配置文件。

MongoDB的锁机制和一般关系数据库如 MySQL, Oracle 有很大的差异,InnoDB 和 Oracle 能提供行级粒度锁,而 MongoDB 只能提供 库级粒度锁,这意味着当 MongoDB 一个写锁处于占用状态时,其它的读写操作都得干等。

3. 安装mongodb3.1 配置yum源

一、查找数组字段不为空的记录

过程如下:

初看起来库级锁在大并发环境下有严重的问题,但是 MongoDB 依然能够保持大并发量和高性能,这是因为 MongoDB 的锁粒度虽然很粗放,但是在锁处理机制和关系数据库锁有很大差异,主要表现在:

 /etc/yum.repos.d/mongodb.repo ->[mongodb]name=MongoDB Repositorybaseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/gpgcheck=0enabled=1

[mongodb]name=MongoDB Repositorybaseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686/gpgcheck=0enabled=1

查找数据中数组字段不为空的记录。

一开始,配置之后,启动服务的时候,老是提示:“unrecognized option: systemLog ”

MongoDB 没有完整事务支持,操作原子性只到单个 document 级别,所以通常操作粒度比较小;MongoDB 锁实际占用时间是内存数据计算和变更时间,通常很快;MongoDB 锁有一种临时放弃机制,当出现需要等待慢速 IO 读写数据时,可以先临时放弃,等 IO 完成之后再重新获取锁。通常不出问题不等于没有问题,如果数据操作不当,依然会导致长时间占用写锁,比如下面提到的前台建索引操作,当出现这种情况的时候,整个数据库就处于完全阻塞状态,无法进行任何读写操作,情况十分严重。

3.2 安装mongodb版本

举个例子:有以下Mongo文档,

很奇怪的事,它总是提示配置文件的第五行出错,如下图,即使将里面的配置颠倒下,但是,总是在第五行的那个设置就有问题。

解决问题的方法,尽量避免长时间占用写锁操作,如果有一些集合操作实在难以避免,可以考虑把这个集合放到一个单独的 MongoDB 库里,因为 MongoDB 不同库锁是相互隔离的,分离集合可以避免某一个集合操作引发全局阻塞问题。

sudo yum install mongodb-org
{ "id" : "581c060f2b436c05aafb1632", "commit_history" : [ "581c20d52b436c05aafb1633", "581c21c12b436c05aafb1634" ]},{ "id" : "581c060f2b436c05aafb1633", "commit_history" : []}

尝试各种,删掉第5行和之后的配置,却提示第一行配置有问题,出错内容类似于上面的提示。

建索引导致数据库阻塞

安装指定版本mongodbyum install mongodb-org-2.6.1 mongodb-org-server-2.6.1 mongodb-org-shell-2.6.1 mongodb-org-mongos-2.6.1 mongodb-org-tools-2.6.13.3 为了避免无意识的升级

想要查找commit_history不为空的记录,有以下方法:

百般无奈,查阅各种资料,终于知道原因了。

上面提到了 MongoDB 库级锁的问题,建索引就是一个容易引起长时间写锁的问题,MongoDB 在前台建索引时需要占用一个写锁,如果集合的数据量很大,建索引通常要花比较长时间,特别容易引起问题。

 /etc/yum.conf -> exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools

方法一: db.collection.find({commit_history: {$not: {$size: 0}}})

其实注意点就2个

解决的方法很简单,MongoDB 提供了两种建索引的访问,一种是 background 方式,不需要长时间占用写锁,另一种是非 background 方式,需要长时间占用锁。使用 background 方式就可以解决问题。 例如,为超大表 posts 建立索引, 千万不用使用复制代码 代码如下:db.posts.ensureIndex

4. 运行mongodb注意mongodb的默认端口和SELinux服务的状态。数据文件目录:/var/lib/mongo ,日志文件目录: /var/log/mongo。改变/var/lib/mongo和/var/log/mongo权限为mongodb的运行者。4.1 启动mongodb

方法二: db.collection.find({'commit_history.0': {$exists: 1}})

1、YAML格式,只能使用空格,不支持tab键,也就是用Tab键,也会报同样的错误;

而应该使用复制代码 代码如下:db.posts.ensureIndex({user_id: 1}, {background: 1})

sudo service mongod start

二、MongoDB添加用户

2、在key: value 这个格式中之间必须有一个空格键。这是非常必须的。以上贴图错误的原因就是没有空格。。。。

不合理使用嵌入 embed document

4.2 证实mongodb启动成功检查mongodb日志文件/var/log/mongodb/mongod.log。把mongodb加入开机启动服务:

在MongoDB中为一个Collection添加用户,可以如下操作:

这两个细节,简直让我抓狂。太坑了!!!

embed document 是 MongoDB 相比关系数据库差异明显的一个地方,可以在某一个 document 中嵌入其它子 document,这样可以在父子 document 保持在单一 collection 中,检索修改比较方便。

sudo chkconfig mongod on 

use collection_name 切换到某个库

总结

比如薄荷的应用情景中有一个 Group document,用户申请加入 Group 建模为 GroupRequest document,我们最初的时候使用 embed 方式把 GroupRequest 放置到 Group 中。 Ruby 代码如下所示:

4.3 关闭mongodb服务

db.createUser( { user: "collection_name", pwd: "password", roles: [ "readWrite", "dbAdmin" ] })

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

复制代码 代码如下:class Group include Mongoid::Document ... embeds_many :group_requests ...end

sudo service mongod stop

三、有的时候需要删除指定字段那一列,使用update操作。

class GroupRequest include Mongoid::Document ... embedded_in :group ...end

4.4 重启mongodb服务

例如要删除name这一列:

这个使用方式让我们掉到坑里了,差点就爬不出来,它导致有接近两周的时间系统问题,高峰时段常有几分钟的系统卡顿,最严重一次甚至引起 MongoDB 宕机。

sudo service mongod restart

query json:

仔细分析后,发现某些活跃的 Group 的 group_requests 增加和更改异常频繁,而这些操作经常长时间占用写锁,导致整个数据库阻塞。原因是当有增加 group_request 操作时,Group 预分配的空间不够,需要重新分配空间,耗时较长,另外 Group 上建的索引很多,移动 Group 位置导致大量索引更新操作也很耗时,综合起来引起了长时间占用锁问题。

4.5 开始使用mongodb

{"name":{$exists:true}} 

解决问题的方法,说起来也简单,就是把 embed 关联更改成的普通外键关联,就是类似关系数据库的做法,这样 group_request 增加或修改都只发生在 GroupRequest 上,简单快速,避免长时间占用写锁问题。当关联对象的数据不固定或者经常发生变化时,一定要避免使用 embed 关联,不然会死的很惨。

配置文件部分MongoDB引入一个YAML-based格式的配置文件。2.4版本以前的仍然兼容。

update json:

必赢棋牌官网,不合理使用 Array 字段

我的mongodb配置文件:

{$unset:{"name":""}} 

MongoDB 的 Array 字段是比较独特的一个特性,它可以在单个 document 里存储一些简单的一对多关系。

systemLog: destination: file path: "/var/log/mongo/mongod.log" quiet: true logAppend: true timeStampFormat: iso8601-utcstorage: dbPath: "/var/lib/mongo" directoryPerDB: true indexBuildRetry: false preallocDataFiles: true nsSize: 16# quota:# enforced: false# maxFilesPerDB: 8 smallFiles: false syncPeriodSecs: 60# repairPath: "/var/lib/mongo/_tmp" journal: enabled: true# debugFlags: 1 commitIntervalMs: 100processManagement: fork: true pidFilePath: "/var/run/mongodb/mongod.pid"net: # bindIp: 192.168.11.52 port: 27017 http: enabled: true RESTInterfaceEnabled: false # ssl:# mode: "requireSSL"# PEMKeyFile: "/etc/ssl/mongodb.pem"operationProfiling: slowOpThresholdMs: 100 mode: "slowOp"security: keyFile: "/var/lib/mongo/mongodb-keyfile" clusterAuthMode: "keyFile" authorization: "disabled"replication: oplogSizeMB: 50 replSetName: "repl_test" secondaryIndexPrefetch: "all"

四、数据导出,在mongodb的bin目录执行mongoexport命令并设定相关的参数

薄荷有一个应用情景使用遇到严重的性能问题,直接上代码如下所示:复制代码 代码如下:class User include Mongoid::Document ... field :follower_user_ids, type: Array, default: [] ...end

设置选项:

例如:

User 中通过一个 Array 类型字段 follower_user_ids 保存用户关注的人的 id,用户关注的人从 10个到 3000 个不等,变化是比较频繁的,和上面 embed 引发的问题类似,频繁的 follower_user_ids 增加修改操作导致大量长时间数据库写锁,从而引发 MongoDB 数据库性能急剧下降。

1. systemLog

./mongoexport -h 192.168.0.201 --port 27017 –d admin –u admin –p admin -c department -o /home/admin/department.dat 

解决问题的方法:我们把 follower_user_ids 转移到了内存数据库 redis 中,避免了频繁更改 MongoDB 中的 User, 从而彻底解决问题。如果不使用 redis,也可以建立一个 UserFollower 集合,使用外键形式关联。

systemLog.verbosity 

-h:指定要连接的数据库的ip; --port:指定要连接的数据库的端口; -u:指定要连接的数据库的用户名; -p:指定要连接的数据库的用户密码; -d:指定要连接的库名; -c:指定要导出的数据集合; -o:指定要导出的数据目标存放地址;

先列举上面几个坑吧,都是害人不浅的陷阱,使用 MongoDB 过程一定要多加注意,避免掉到坑里。

日志文件输出的级别,越大级别越低。

注: 、需要保证连接的数据库处于正常运行状态中;

systemLog.quite

、我曾遇到过一中情况,数据库中加入了用户信息,启动时是没有以用户验证的方式启动,但是执行这个命令的时候,还是在我指定了用户名和密码的情况下才导出成功,如果有人遇到相似情况,不妨一试。

在quite模式下会限制输出信息:数据库命令输出,副本集活动,连接接受事件,连接关闭事件。

五、数据导入,在mongodb的bin目录执行mongoimport命令并设置相关的参数,参数解释和上边一样

systemLog.traceAllExceptions 
./mongoimport --port 27017 -d admin -u admin –p admin –c department /home/common/mongodb305/bin/department.dat 

打印verbose信息来调试,用来记录证额外的异常日志。

六、非amdin数据库的用户验证问题:

systemLog.syslogFacility

我们给mongodb数据库中的库添加用户,可以在目标数据库中使用如下命令,例如在mongoTest库中添加一个拥有读写权限的用户:

string,默认为user指定syslog日志信息的设备级别。需要指定--syslog来使用这个选项。

db.createUser({"user":"test","pwd":"123456","roles":["readWrite"]}) 
systemLog.path string

也可以在admin数据库中添加:

发送所有的诊断信息日志,默认重启后会覆盖。

db.createUser({"user":"test","pwd":"123456","roles":[{"role":"readWrite","db":"test"},"readWrite"]}) 
systemLog.logAppend

要注意的是:这两种方式是有区别的,也正是这个区别曾坑了我一把:

boolean是否启用追加日志。

使用第一种方式添加的时候,我们可以在mongodb的bin目录下直接执行如下命令进入test数据库中操作,增删改查都可以;也可以使用这个用户 名和密码在mongoVUE中连接:

systemLog.destination
./mongo -h 192.168.0.201 --port 27017 -u test -p 123456 -d test 

string指定一个文件或syslog。如果指定为文件,必须同时指定systemLog.path

但是如果是第二种方式创建的,那么再直接使用上边的命令,会提示验证失败,只有当先进入mongo shell连接到admin数据库,再切换到test数据库的时候才能验证通过。这算是一个小坑,不明情况的或许会非常纠结,明明用户名和密码没问题,却不知为什么就是连不上。

systemLog.timeStampFormat

七、mongodb3.0默认的数据存储方式还是原来2.6一样的,我尝试过更改为新的存储方式,在启动时使用如下参数,但需要注意的是,需要在数据库中没有数据的前提下才可以,否则会报错:

string,默认为iso8601-local日志信息中的时间戳格式:

./mongod -f /mongodb304/conf/mongodb.conf --storageEngine wiredTiger