问题标签 [mongodb-cluster]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3815 浏览

node.js - 当新的主要初级选举时,Express无法连接到MongoDB副本集

我有mongodb replica set以下配置:

  • M1 初级
  • M2二级
  • M3二级
  • M4仲裁员

这是我连接到数据库的 Express 代码(我mongoose用作 ODM):

该应用程序按预期工作。当 M1 关闭时,M2 或 M3 都被选为primary,但我的express应用程序仍然无法连接到replica set.

我的配置有什么问题吗?

0 投票
0 回答
983 浏览

mongodb - 通过 SSH 桥连接到副本集中的主 Mongo 服务器

我们正在管理两个不同的 Mongo 副本集,一个用于暂存,一个用于生产,在 Kubernetes 上运行。网络是通过 Kubernetes 的内部基础设施提供的,因此每个集群上的 Mongo 服务器都可以在以下位置使用:

  • mongo-0.mongodb-service.default.svc.cluster.local:27017
  • mongo-1.mongodb-service.default.svc.cluster.local:27017
  • mongo-2.mongodb-service.default.svc.cluster.local:27017 ,...等

我们需要使用 mongoexport / mongoimport 将数据从 staging 集群复制到 prod。暂存集群上的客户端可以使用 SSH 桥接器访问生产集群上的专用网络,因此我们设置了一个桥接器:

ssh -L 27020:mongo-0.mongodb-service.default.svc.cluster.local:27017 [..]

然后在本地执行 mongoexport,并针对 localhost:27020 运行 mongoimport。

问题:Mongo 负载平衡主要(可写)master。因此,当 mongoexport 连接到 mongo-0 时,它被告知连接到 mongo-1。

所以,嘿,我们只是设置了3个端口转发,对吧?

ssh -L 27020:mongo-0.mongodb-service.default.svc.cluster.local:27017 -L 27021:mongo-1.mongodb-service.default.svc.cluster.local:27017 -L 27022:mongo-2 .mongodb-service.default.svc.cluster.local:27017 [...]

mongoimport --host rs0/localhost:27020,localhost:27021,localhost:27022 [..]

嗯,不。此时,远程集群上的 Mongo-0 告诉 mongoimport 连接到 Mongo-1,它在本地集群上这样做(并且身份验证失败,因为不同的用户名/密码)。

问题:当远程连接必须通过 SSH 桥接时,我们可以通过什么方式将数据从一个副本集传输到另一个副本集?

谢谢!

0 投票
1 回答
513 浏览

mongodb - Mongodb集群——导入数十亿条记录

我正在尝试导入 100 亿条记录。开始测试导入 10 亿条记录。随着记录的插入,导入时间变得最糟糕。这是配置和统计信息。

每个文档有大约 7 个字段。分片键位于 3 个字段上。遵循https://docs.mongodb.com/v3.4/reference/ulimit/#recommended-ulimit-settings上的所有建议。

导入选项

甚至尝试禁用日志(--nojournal),但没有太大区别。

不确定这是否是预期的导入时间。或者我可以做些什么来提高摄取率?

0 投票
0 回答
33 浏览

mongodb - MongoDB:确保数据只交付和交付一次

我对 MongoDB 有一个理论上的问题:我有一个从 MongoDB 数据库读取数据的 API。我们必须确保最终交付集合中的每个项目,但仅在插入或更改后交付一次。所以客户端需要最新版本的项目,但只有一次,如果没有更改,我们绝不能再次发送项目。

我们首先想到通过使用日期来实现这一点:客户端发送最后一次查询的日期,我们将只交付在该日期之后创建或更改的项目。我看到的问题是,如果集群的一部分在一段时间内不可用并且没有与其余部分同步,我们可能会错过项目。这些项目将永远不会被交付(因为它们是在上次同步之后创建的,没有与其他项目同步,并且客户端现在有一个更新的“上次获取”时间)。

由于这行不通,我想用某种 ACK-Flag 来解决这个问题,它在创建时为假,在发送到客户端后为真。更改后,它将再次设置为 false。在这里我看到了一个问题,如果有人在当前发送给客户端时更改了该项目,则此更改之后可能会丢失(更改显示 ACK=false,但交付后显示 ACK=true)。

这似乎又没有按预期工作,所以现在我正在考虑某种乐观锁定,我将版本存储在数据库中,并且只有在版本没有从读取变为写入时才更新 ACK=true。

这应该可行,但似乎根本不是最优的(如果调用在编写 ACK 时崩溃怎么办?)。因为这似乎是一个常见问题:最好的解决方案是什么?或者 MongoDB 不是适合这项工作的工具?如果您希望在某个时候必须垂直扩展,是否有可能解决这个问题?

0 投票
0 回答
1143 浏览

mongodb - 查询失败,错误代码 59 和 MongoDB 集群上的错误消息“找不到命令”

我有一个在 MongoDB Atlas 中运行 MongoDB 3.4.14 的 MongoDB 集群。我的应用程序与这个集群成功连接,可以读写。我也可以通过 shell 连接到这个集群。

当我尝试连接 Studio3t(版本 2018.2.5)时,一切正常。但是当我尝试查看可用的集合时,我收到以下错误:

我不确定这是集群配置的问题还是 Studio3t 本身的问题。如果我可以为您提供更多有助于解决问题的信息,请告诉我。

0 投票
0 回答
32 浏览

java - 如何以编程方式查找分片 MongoDB 集群中的分片数量

我知道 sh.status() 命令可以给我分片信息。但是我不知道如何使用 mongo java 驱动程序以编程方式运行它。

0 投票
0 回答
96 浏览

mongodb - 可以在 mongoDB Shard 集群中进行增量备份吗?没有 opsmanager

分片 MongoDB 集群:

  • 3路由器
  • 3-配置
  • 2 个分片(每个分片 3 个副本)

我们正在尝试每隔一小时进行一次增量备份。我们浏览了几个谷歌链接,但没有运气。根据我们上面的设置,为了实现增量备份,我们需要从 config、shard1 和 shard2 辅助服务器中分别获取带有 oplog 的 mongodump,并将其存储在 s3 中。但问题在于恢复部分。要恢复,需要从 s3 下载所有这些转储(config、shard1 和 shard2)并将其恢复到其特定的副本集。这意味着配置转储到配置和分片转储到分片。

这是正确的过程还是我们有任何其他选项可以通过单个查询进行增量备份?

谢谢

0 投票
0 回答
2004 浏览

mongodb - Mongodb:连接到副本集

首先谢谢你看我的问题。

我已经安装了 MongoDB 集群:

  • mdb0.domain.com - 仲裁
  • mdb1.domain.com - 主要(优先级 3)
  • mdb2.domain.com - 次要(优先级 2)
  • mdb3.domain.com - 次要(优先级 1)

启用授权(配置的一部分):

它工作正常。rs.status()显示所有节点及其信息。我可以使用以下命令通过命令行(amd robo3t 也可以)连接到副本集:

它工作正常:

当我手动停止 mdb1.domain.com(重现可能的问题)时,replicaset 投票支持新的“Primary”,我可以看到新的主 mdb2.domain.com。那时 mdb1.domain.com 节点的状态"stateStr" : "(not reachable/healthy)"

那时我正在尝试连接副本集并收到以下错误:

但是当我启动 mdb1.domain.com 并且它开始成为 Primary 时,我可以再次连接!

为什么我不能在没有一台服务器和新的 Primary 的情况下连接 seplicaset?

0 投票
1 回答
351 浏览

mongodb - MongoDB Shard 块已经有一个相同的

我们有一个配置有 4 个分片(A、B、C、D)的 MongoDB 分片。分片 D 在 A、B、C 之后添加。一些集合与 D 正确平衡,但只有一个集合存在迁移问题。

在 D 日志上始终显示此消息。

W SHARDING [migrateThread] 无法接收集合产品的块 [{ _id: ObjectId('5ad5586b7ee7821b48139cfb') }, { _id: ObjectId('5ad6d2d77ee78222283cc9d5') }) 因为我们已经有一个同名的集合,其 UUID 为 c16daf18-9412-437b- a1ba-a9e000e694ac,与捐赠者的 UUID 25a21963-d9ba-4022-becc-648d4d39a68c 不同。如果该分片包含来自先前产品化身的数据,则手动删除该分片上的集合。

我理解错误,但我不知道该怎么做。如果我去 mongos 并使用 status(),收集产品不会显示在分片 D 上,但在日志上则相反。我不知道,如果我在 shard D 上连接并运行 db.products.drop(),这个动作只是在 D 上删除还是在所有 shard 上删除?

0 投票
1 回答
1273 浏览

node.js - Mongodb和节点在连接集群时出错?

我正在尝试使用我的节点应用程序连接 mongoldb 集群。我有 mongodb 版本 3.1.0。

我从 mongodb 复制了连接字符串,如下所示。

但是当我尝试使用上面的字符串进行连接时,我收到了以下错误。

所以上面的消息给了我两个错误

  1. 种子列表不包含 mongos 代理——不知道为什么会发生
  2. 要在 URI 或选项对象中提供的副本集——我的 URI 中有副本集。不知道为什么会这样。

如果我设置 ssl=false,第二条消息会消失,而第一条消息会保留。

知道我做错了什么吗?

如果您想知道我在应用程序中的连接方式,

编辑:已解决

我从下面的堆栈溢出问题中找到了答案。Mongoose 集群与 Mongo 连接。但它不与参数 &retryWrites=true 连接。于是我把参数去掉,连接成功。

MongoError:字段“retryWrites”对于索引规范无效。规范:{ name: "username_1", key: { username: 1 }, unique: true, background: true, retryWrites: true }

所以我的新数据库连接如下所示

希望它也对其他人有所帮助。