【问题标题】:MongoDB ObjectID uniqueness in a Sharded Cluster分片集群中的 MongoDB ObjectID 唯一性
【发布时间】:2015-06-25 10:27:36
【问题描述】:

如果我有一个包含多个 MongoS 实例的 MongoDB 分片集群,我在 _id 中的 ObjectID 是否会与我写入的哪个 MongoS 保持一致?

例如,如果我从 MongoS#1 写入一些数据并且 _id 正常上升,如果我使用 MongoS#2 写入,这些 _id 是否也会与其他写入一致?

看到作为 ObjectID 的一部分是基于机器哈希和进程 id,我看不出这会因此对 ObjectID 进行排序是没有用的。对吗?

这里有什么推荐?

【问题讨论】:

  • 简单的答案是肯定的。 Mongo 在分片集群中保持 _id 字段的唯一性。

标签: mongodb objectid


【解决方案1】:

ObjectId 的生成方式将使您对查询有一个大致的了解。

如果你在你的 mongo 控制台中输入这个,

新的 ObjectId()

您会看到 ObjectId 示例值

ObjectId("558bf61f9f49f303f72dd59b")

现在,让我们来看看 mongo 是如何生成这个的。 558bf61f 9f49f3 03f7 2dd59b

  1. 这里前 8 个字符(4 个字节)表示作为时间戳的秒数(不是毫秒)。
  2. 接下来的 3 个字节是机器标识。
  3. 接下来的 2 个字节是进程 ID。
  4. 最后 3 个字节是随机值。

http://api.mongodb.org/libbson/current/bson_oid_t.html

因此,无论您与 mongos 有什么联系,当然,随着时间的推移,它只会按升序排列(因为第一点),其他点确保它始终是唯一的数字。希望它能澄清你的疑问。

-$

【讨论】:

  • 问题是我认为它没有充分解释机器 ID 和进程 ID 是如何获得的。它是来自客户端应用程序、mongos 进程机器、它写入的分片的主节点吗?只是想知道这是否在分片集群设置中以不同的方式解决以保持一定的一致性。
  • 是的,但是,我的解释确实回答了您关于提升主键 (_id) 的问题。虽然你可以观察,例如你运行一个java程序并进行批量插入,那么记录中的机器ID和进程ID总是相同的,只有时间戳和随机数不同。观察到该字段中的 processId 与 Java 代码的进程 id 不同。
  • 好的。我想我会用多个 mongos 进程和多个客户端连接做一些实验,看看我是否可以确定 machineID 和 processID 来自哪里。我在这里尝试实现的主要目标是一种准确的方法来确定最后一次更新发生在多个连接的位置并从该点开始读取。如果我可以依赖 _id 那会有所帮助,但看起来我必须找到另一个解决方案。
  • 当然,请更新我...但是,我认为如果插入在一秒钟后完成,您总是可以找出最新的...但是,如果插入完成在几秒钟内,我们就无法准确地确定哪个插入是最新的,因为机器 ID 和进程 ID 将是相同的,并且最后一个字符集是随机数。但是,如果您想知道,您可以随时添加 created_date 字段并将值设置为时间戳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多