用 mongodb 有哪些坑需要避免?

pidfilepath:进程文件,方便停止mongodb

MongoDB 是一个非关系型数据库,它的优点是可以存储大量的数据,而且可以很容易地扩展。但是,使用 MongoDB 也有一些坑点需要注意。以下是一些常见的坑点:

mongodb分片集群搭建 mongodb分布式集群搭建mongodb分片集群搭建 mongodb分布式集群搭建


mongodb分片集群搭建 mongodb分布式集群搭建


1. 分片:MongoDB 支持分片,但是分片会增加系统的复杂性和维护成本。如果不正确配置分片,可能会导致性能问题journal:和数据一致性问题。

2. 索引:MongoDB 支持多种类型的索引,但是如果不正确使用索引,可能会导致性能问题。例如,如果使用过多的索引,可能会导致写入作变慢。

3. 事务:MongoDB 支持多文档ACID事务,但是如果不正确使用事务,可能会导致数据不一致问题。

4. 安全:MongoDB 支持多种安全机制,但是如果不正确配置安全机制,可能会导致数据泄露问题。

5. 数据类型:MongoDB 支持多种数据类型,但是如果不正确使用数据类型,可能会导致性能问题。

如何使用MongoDB+Springboot实现分布式ID

Connected to 10.0.0.102.

主备,解决如 主崩了,备用的还能顶上。mongodb里面有主备和分片,我不需要分片。主备我已经配置在了,现在在spring配置文件中配置连接,我只配了一台机器的ip和端口,其它的机器没配,不知道怎"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),么写。

mongodb适用于什么场景

这个错误在另一篇文章已3)arbiter.conf经描述过,这里略过不赘述。

MongoDB适用于需要处理大量数据,特别是无结构或半结构化数据的场景,同时需要高性能和水平扩展能力的应用场景。

1. 处理大量数据:MongoDB是一个面向文档的数据库,采用BSON(二进制JSON)格式存储数据。这种格式使得MongoDB能够灵活、高效地存储大量数据。此外,MongoDB支持分片,可以将数据分散到多个,以实现数据的水平扩展。因此,对于需要处理大量数据的应用,如大数据、日志处理等,MongoDB是一个很好的选择。

2. 无结构或半结构化数据:MongoDB的面向文档的特性使得它非常适合存储无结构或半结构化数据。例如,社交媒体数据、物联网数据等,这些数据的结构经常变化,而且很难用传统的关系型数据库来存储。MongoDB的灵活的数据模型可以轻松地应对这种变化。

3. 高性能:MongoDB支持索引,可以提供高性能的数据查询。此外,MongoDB还支持聚合作,可以在数据库端执行复杂的数据处理任务,从而减少了网络传输的开销,提高了性能。因此,对于需要高性能的应用,如实时分析、在线游戏等,MongoDB也是一个不错的选择。

4. 水平扩展能力:MongoDB的分片功能不仅可以用来存储大量数据,还可以提高数据库的读写性能。因为分片可以将数据分散到多个,从而充分利用了的并行处理能力。此外,MongoDB还提供了自动分片的功能,可以自动将数据迁移到新的,从而简化了水平扩展的作。因此,对于需要水平扩展能力的应用,如云计算、移动应用后端等,MongoDB也是一个很好的选择。

例子:例如,一个社交媒体平台可能需要存储每个用户的帖子、评论、点赞等信息。这些信息是无结构的,因为每个用户的信息可能都不同,而且可能会随时变化。此外,社交媒体平台也需要处理大量数据,并需要提供高性能的查询和实时分析功能。因此,MongoDB可能是一个非常适合这种应用的数据库。

如何在短时间内完成MongoDB异数据对比?

同时有好几个第三方提供的客户端图形工具,如MongoVUE、RockMongo、MongoHub等,方便管理和维护。

在短时间内完成 MongoDB 异数据对比,可以采用以下方法:

2. 制定合理的对比策略:根据实际需求,选择合适的对比方式,如一次性对比、周期性对比、全量数据对比和快速对比等。不同的对比方式适用于不同的场景,合理的选择可以有效提高对比效率。

3. 了解数据特点和访问热点:在对比数据时,了解数据的访问热点和特点,可以避免对整个数据库进行全量对比,从而减少对比的时间和资源消耗。例如,可以根据数据的热点对数据进行分片,然后针对分片进行异对比。

4. 优化 MongoDB 集群负载均衡:在实际生产环境中,数据访问热度和性能异可能导致某些超载。通过对 MongoDB 负载均衡策略进行优化,如基于数据热点和分片性能异进行自适应负载均衡,可以提高系统性能,保证用户体验的流畅性。

5. 采用索引优化查询性能:在对比数据时,可以针对查询条件创建索引,以提高查询速度。合理地创建索引可以显著减少数据对比的时间。

6. 并行处理:针对大规模的数据对比任务,可以考虑使用多线程或分布式技术进行并行处理。通过将任务划分为多个子任务,并行执行这些子任务,可以提高对比速度。

综上所述,利用专业的数据对比工具、制定合理的对比策略、了解数据特点和访问热点、优化负载均衡、创建索引以及采用并行处理等技术,可以在短时间内完成 Mon78goDB 异数据对比。

总结遇到的几次MongoDB副本集初始化失败问题

replication:

前言:

在之前搭建MongoDB集群中,遇到过几次小问题引起的初始化副本集失败,都是之前初学时踩的坑,做个小结。

1、IP错误引起MongoDB副本集初始化失败

详情见博客:IP错误引起MongoDB副本集初始化失败

2、PRIMARY与SECONDARY主机mongodb-keyfile文件内容不一致,导致在PRIMARY上添加副本集失败

问题描述:

搭建另外一个MongoDB副本集,主机和角色分配如下:

主机IP

角色

131.10.11.106

PRIMARY

131.10.11.111

SECONDARY

131.10.11.114

SECONDARY

MongoDB server version: 3.4.10.1

在PRIMARY上添加SECONDARY主机131.10.11.111,出现下面的报错:

mongotest:PRIMARY> rs.add("131.10.11.111:27017")

{"ok" : 0,

"errmsg" : "Quorum check failed because not enough voting nodes responded; required 2 but only the following 1 voting nodes responded: 131.10.11.106:27017; the following nodes did not respond affirmatively: 131.10.11.111:27017 failed with Authentication failed.",

"code" : 74,

"codeName" : "NodeNotFound"

}原因分析:

经过排查,发现131.10.11.111主机的mongodb-keyfile和主不一致,并且在131.10.11.111主机的配置文件mongo.conf文件没有配置安全认证,所以导致了初始化失败

1、将PRIMARY上的mongodb-keyfile文件到备131.10.11.111上,并且修改权限为400

2、并且修改配置文件/etc/mongodb/mongo.conf如下:

[root@mongodb111 mongodb]# cat mongo.conf

Log:

path: "/opt/mongodbdata/mongod.log"

logAppend: true

storage:

enabled: true

dbPath: /opt/mongodbdata

setParameter:

enableLocalhostAuthBypass: true

processMament:

fork: true

pidFilePath: "/opt/mongodbdata/mongod.pid"

replSetName: mongotest

#添加下面几行:

security:

[root@mongodb111 mongodb]#

重启131.10.11.111机器mongodb,然后重新在PRIMARY上执行 rs.add("131.10.11.111:27017"),成功。

3、备配置文件没有配置replSet,导致添加副本集失败

问题描述:

这个问题和问题2是在同一个环境中遇到的,在106主机上添加114主机的时候,报下面的错误:

mongotest:PRIMARY> rs.add("131.10.11.114:27017")

{"ok" : 0,

"errmsg" : "Quorum check failed because not enough voting nodes responded; required 2 but only the following 1 voting nodes responded: 131.10.11.106:27017; the following nodes did not respond affirmatively: 131.10.11.114:27017 failed with not running with --replSet",

"code" : 74,

"codeName" : "NodeNotFound"

}原因分析:

根据提示“the following nodes did not respond affirmatively: 131.10.11.114:27017 failed with not running with --replSe”,查看了114主机的配置文件mongo.conf,发现这是因为备上的配置文件里面没有配置副本集,所以无法添加

修改备的/etc/mongodb/mongo.conf配置文件如下,加上副本集配置:

[root@mongodb114 mongodb]# cat mongo.conf

Log:

path: "/opt/mongodbdata/mongod.log"

logAppend: true

storage:

enabled: true

dbPath: /opt/mongodbdata

setParameter:

enableLocalhostAuthBypass: true

processMament:

fork: true

pidFilePath: "/opt/mongodbdata/mongod.pid"

security:

replication: #加上副本集配置,

replSetName: mongotest #name要注意和主上保持一致

重启131.10.11.114机器mongodb,然后重新在PRIMARY上执行 rs.add("131.10.11.114:27017"),成功

4、bindIp默认127.0.0.1,导致MongoDB副本集初始化失败

问题描述:

有一次搭建一个MongoDB副本集,主机和角色分配如下:

主机IP

角色

10.0.0.101

PRIMARY

10.0.0.102

SECONDARY

10.0.0.103

SECONDARY

MongoDB server version: 4.0.2

在PRIMARY主机10.0.0.101上加入SECONDARY主机10.0.0.102的时候出现这个错误:

添加从失败:

CrystalTest:PRIMARY> rs.add("10.0.0.102:27017")

{"operationTime" : Timestamp(1539054715, 1),

"ok" : 0,

"errmsg" : "Quorum check failed because not enough voting nodes responded; required 2 but only the following 1 voting nodes responded: 10.0.0.101:27017; the following nodes did not respond affirmatively: 10.0.0.102:27017 failed with Error connecting to 10.0.0.102:27017 :: caused by :: Connection refused",

"code" : 74,

"codeName" : "NodeNotFound",

"$clusterTime" : {

"clusterTime" : Timestamp(1539054715, 1),

"signature" : {

"keyId" : NumberLong(0)

}原因分析:

看到 “failed with Error connecting to 10.0.0.102:27017 :: caused by :: Connection refused”的时候很疑惑,因为10.0.0.102主机上的27017端口是OK的,服务也能正常使用,防火墙什么的都是关掉了的,尝试在PRIMARY主机10.0.0.101主机上net,发现不通:

[root@test101 ~]# net 10.0.0.102 27017

Trying 10.0.0.102...

net: connect to address 10.0.0.102: Connection refused

然后到102主机上查看端口,发现bindIp是127.0.0.1,问题应该就是这里了。bindIp是127.0.0.1,因此导致了10.0.0.101主机连不过去:

[root@test102 ~]# netstat -tauthorization: enabledlunp|grep mongo

tcp 0 0 127.0.0.1:27017 0.0.0.0: LISTEN 1065/mongod #显示的是127.0.0.1:27017

修改102主机的mongo.conf加入“bindIp: 0.0.0.0 ”,然后重启102主机的MongoDB

[root@test102 bin]# cat /etc/mongodb/mongo.conf

Log:

path: "/opt/mongodbdata/mongod.log"

logAppend: true

storage:

enabled: true

dbPath: /opt/mongodbdata

setParameter:

enableLocalhostAuthBypass: true

processMament:

fork: true

pidFilePath: "/opt/mongodbdata/mongod.pid"

replSetName: CrystalTest

security:

net:

port: 27017

bindIp: 0.0.0.0 #加入这一行

再查看端口:

[root@test102 mongodb]# netstat -tlunp|grep 27017

tcp 0 0 0.0.0.0:27017 0.0.0.0: LISTEN 3433/mongod #变成了0 0.0.0.0:27017

[root@test102 mongodb]#

然后在101主机上net,可以连过去了:

[root@test101 ~]# net 10.0.0.102 27017

Trying 10.0.0.102...

Escape character is ‘^]‘.

^C^C

[root@test101 ~]#

重新在PRIMARY主机10.0.0.101添加102主机,就成功了:

CrystalTest:PRIMARY> rs.add("10.0.0.102:27017")

{"ok" : 1,

"operationTime" : Timestamp(1539056959, 1),

"$clusterTime" : {

"signature" : {

"keyId" : NumberLong(0)

}总结遇到的几次MongoDB副本集初始化失败问题

标签:headcentosnecnetnodalt修改mongodtry

第二节 为什么用MongoDB及.NET开发入门

Connection closed by foreign host.

为什么要用MongoDB取代传统关系型数据库?其实不是取代,只是对传统数据库的文档型补充。不是所有的数据都需要二维关系及多表对应的存储和查询,比如:文件的海量存储,只需Key与Value形式的存储及查询,同时这种方式的存储及查询都是高效的,可查看GirdFS,GirdFS是MongoDB的大文件存储系统,比如、音频、视频;数据如果不需要实时分析统计(包含读写比高的),也可以使用KV形式存储及查询。MongoDB介于缓存与数据库之间,存取速度逊于缓存但远远高于传统数据库。数据库存储以键值形式,你可能会认为对数据关系的处理及分析挖掘不及传统数据库,理论上是如此,但是MongoDB加入了对LINQ的支持,相信可以弥补其不足之处。做项目要求稳,对于MongoDB只是对传统数据库的做了一个类似二级缓存的补充即构建了持久层。可以利用cache缓存及Memcached做为一级缓存,MongoDB做为持久层对海量数据的一个缓冲查询,最终才是数据库及物理文件的存储。如果你对数据的分析挖掘统计不是实时的,也可以尝试使用MongoDB直接存取数据,数据后期处理工作可通过MongoDB同步到传统数据库。MongoDB的高伸缩性也益于集群扩展,特[root@mongodb114 mongodb]#别是主从备份模式,一台主负责读写作,其它从服务则负责读和备份,可以有效的缓解读比高的负载。MongoDB支持主从转换,很不错的容灾及故障切换功能。

用MongoDB做海量存储,又出现另一个问题读写频率与扩展?MongoDB可以根据应用程序的需要以两种模式来运行。种是“单主”(single )模式,只有一台主来处理所有的写作。读作能从中分离出去,通过任意数量的从来进行读作,这有利于提高读的可扩展性(使用场景:Sourceforge)。对于那些写数据量很大或写频率过高,单台主无法处理的应用程序,可以使用MongoDB的自动分片模式,分片相于分布式存储,有点像关系SQL中的分表作,但这些分表都可同时写作,这种方式可有效缓解对单台的压力。该模式下写作会自动分配到任意数量的“片”中(一般是一台或一组MongoDB),它们负责这部分数据集的写和读。无论使用哪种模式,MongoDB都会采取“强一致性”方法

MongoDB能同时进行主从配置和分片配置吗?求高人解答!谢谢!!!

centos7

应该是可以的,mongodb现在不使用主从了,使用replica set,replica set是为了提高系统可靠性的,分片是水平扩展用的,两个如果不能同时使用就太鸡肋了。

但mongodb水平扩展水平本来就是短板,用replica set以后插入速度也会大幅降低。

很遗憾没有同时试过replica set和分片,测试完replica GridFS结合自动分片及自动技术,可以实现高性能的分布式数据库集群架构,从而进行海量数据存储,set以后公司决定不用mongodb了。只能告诉阁下这么多了,希望能有帮助

mongodb多个collection及shard的问题

}],

sharded cluster都有一个primary shard,没有sharded的collection都是只存在这个shard里的,所以你要建一解决方法:个新的collection,在你使用sh.shardCollection()之前,它是只存在这个primary shard里面的。primary shard是你在设定这个cluster的时候个添加的shard,或者是你设定好cluster之后用movePrimary重新指定的shard。

如果你不对这个collection执行sh.shardCollection(),那它就不是sharded collection,所以也就不会往其他shard上面写。

这些mongodb的文档上都写了的,你在它网站上检索就行。

Linux 搭建JBOSS EAP集群,启动Sler时报错,连接不到主机;

劣势:

Mongodb集群搭建过程及常见错误

Replica Sets

MongoDB 支持在多个机器中通过异步达到故障转移和实现冗余。多机器中同一时刻只 有一台是用于写作。正是由于这个情况,为 MongoDB 提供了数据一致性的保障。担当 Primary 角色的机器能把读作分发给 sle。

Replica Sets的结构非常类似一个集群。因 为它确实跟集群实现的作用是一样的, 其中一个如果出现故障, 其它马上会将业务接过来而无须停机作。

下面以本机为例介绍一下集群的部署过程,以及部署过程中常见的注意点及错误

本例环境是Linux作系统,mongodb版本:mongodb-linux-x86_64-2.6.1.tgz,Vmwre虚拟机,虚拟机IP:192.168.169.129,集群以本机不同端口模拟三台。

1.集群主要分为三个主,sler备用,arbiter仲裁

建立数据文件夹

12

3mkdir -p /mongodb/data/

mkdir -p /mongodb/data/sler

mkdir -p /mongodb/data/arbiter

ps:三个目录分别对应主,备,仲裁

2.建立配置文件夹

1).conf

打开编辑器:

1vi /etc/.conf

按i 输入下列配置

12

34

56

7dbpath=/home/mongodb/data/

logpath=/home/mongodb/log/.log

logappend=true

replSet=rep1

port=10000

fork=true

journal=true

完成之后按esc 》》 : >>wq>>回车

2)sler.conf

编辑器打开和保存按上边的步骤,下边只写详细内容

12

34

56

7dbpath=/home/mongodb/data/sler

logpath=/home/mongodb/log/sler.log

logappend=true

replSet=rep1

port=10001

fork=true

journal=true

12

34

56

dbpath=/home/mongodb/data/arbiter

logpath=/home/mongodb/log/arbiter.log

logappend=true

replSet=rep1

port=10002

fork=true

journal=true

allfiles=true

参数解释:

dbpath:数据存放目录

logpath:日志存放路径

logappend:以追加的方式记录日志

replSet:replica set的名字

port:mongodb进程所使用的端口号,默认为27017

fork:以后台方式运行进程

journal:写日志

allfiles:当提示空间不够时添加此参数

其他参数

directoryperdb:为每一个数据库按照数据库名建立文件夹存放

bind_ip:mongodb所绑定的ip地址

oplogSize:mongodb作日志文件的大小。单位为Mb,默认为硬盘剩余空间的5%

noprealloc:不预先分配存储

3.启动Mongodb

1cd /home/mongodb/bin

启动服务

12

34

5./mongod -f /etc/.conf

./mongod -f /etc/sler.conf

./mongod -f /etc/arbiter.conf

有这样的提示说明启动成功

如果是下列的提示说明启动失败

启动失败的原因有很多,检查完配置文件,如果没有错误,可打开相应的配置文件查看详细的错误信息

cat /etc/.conf

最常见的一个错误就是磁盘空间不足,会提示这样的错误

因为Mongodb的日志文件是成2g的增长,所以所需空间比较大,这时你可以在配置文件里添加这样的一个配置

allfiles=true。

全部三个服务全部启动成功之后

4.配置主(),备(sler),仲裁(arbiter)

可以通过客户端连接mongodb,也可以直接在三个中选择一个连接mongodb。

./mongo 192.168.169.129:10000 #ip和port是某个的地址

>use admin

>cfg={ _id:"rep1", members:[ {_id:0,host:'192.168.169.129:10000',priority:2}, {_id:1,host:'192.168.169.129:10001',priority:1},

{_id:2,host:'192.168.169.129:10002',arbiterOnly:true}] };

>rs.initiate(cfg) #使配置生效

{"set" : "rep1",

"date" : ISODate("2014-09-05T02:44:43Z"),

"myState" : 1,

"members" : [

{"_id" : 0,

"name" : "192.168.169.129:10000",

"health" : 1,

"state" : 1,

"stateStr" : "PRIMARY",

"uptime" : 200,

"optime" : Timestamp(1357285565000, 1),

"optimeDate" : ISODate("2013-01-04T07:46:05Z"),

"self" : true

},

{"_id" : 1,

"name" : "192.168.169.129:10001",

"health" : 1,

"state" : 2,

"stateStr" : "SECONDARY",

"uptime" : 200,

"optime" : Timestamp(1357285565000, 1),

"optimeDate" : ISODate("2013-01-04T07:46:05Z"),

"lastHeartbeat" : ISODate("2013-01-05T02:44:42Z"),

"pingMs" "clusterTime" : Timestamp(1539056959, 1),: 0

},

{"_id" : 2,

"name" : "192.168.169.129:10002",

"health" : 1,

"state" : 7,

"stateStr" : "ARBITER",

"uptime" : 200,

"lastHeartbeat" : ISODate("2013-01-05T02:44:42Z"),

"pingMs" : 0

"ok" : 1

}配置过程中可能还会出现其他的一些错误,不过都可以去查看相应的日志文件,去解决。