最近开发反馈sentry遇到mongodb写入报 objectid 重复的情况,类似下图:
我们生产用的是mongo3.4的版本
官方文档介绍3.4的 objectid生成规则如下:
https://docs.mongodb.com/v3.4/reference/method/ObjectId/
- a 4-byte timestamp value, representing the ObjectId’s creation, measured in seconds since the Unix epoch 4 个字节表示时间戳, unixtime
- a 5-byte random value 5 个字节随机数
- a 3-byte incrementing counter, initialized to a random value 3 个字节表示一个自增的数
举例子:
24位的objectid,我们按照上面的规则来拆分成3段:
5ec428fca413e054714e7fb2拆分:
5ec428fc --> 1589913852 --> 2020-05-20 02:44:12
a413e05471 -->704708105329
4e7fb2 --> 5144498
5ec428fca413e054714e7fb3拆分:
5ec428fc --> 1589913852 --> 2020-05-20 02:44:12
a413e05471 --> 704708105329
4e7fb3 --> 5144499
可以看到,上面的2个objectid只有最后的counter段有差异,生产上如果我们写入并发比较高,还是会出现objectid冲突的情况发生的。
附带,mongodb3.2的objectid生成规则(和3.4版本不同):
https://docs.mongodb.com/v3.2/reference/method/ObjectId/
- a 4-byte value representing the seconds since the Unix epoch,
- a 3-byte machine identifier,
- a 2-byte process id, and
- a 3-byte counter, starting with a random value.
参考: https://blog.wolfogre.com/posts/mongo-objectid-design/