我尝试安装两个 mongo 节点,每个节点位于不同的位置,延迟较低。架构应该是:
一个节点位于 DC,另一个节点位于 DR。假设一次只有一个节点是主节点(DC 中的节点),如果 DC 宕机,DR 中的节点可以成为主节点(可以手动将其提议为主节点)。
当 DR 中的节点被手动更改为主节点时,我可以有时间再次启动 DC 中的节点,等待数据同步到 DC,然后降级 DR 中的节点,再次将 DC 中的节点更改为主节点。
我不确定副本集是否可以应用于此。请帮我解决这个问题。
谢谢。
我尝试安装两个 mongo 节点,每个节点位于不同的位置,延迟较低。架构应该是:
一个节点位于 DC,另一个节点位于 DR。假设一次只有一个节点是主节点(DC 中的节点),如果 DC 宕机,DR 中的节点可以成为主节点(可以手动将其提议为主节点)。
当 DR 中的节点被手动更改为主节点时,我可以有时间再次启动 DC 中的节点,等待数据同步到 DC,然后降级 DR 中的节点,再次将 DC 中的节点更改为主节点。
我不确定副本集是否可以应用于此。请帮我解决这个问题。
谢谢。
我正在调查 MongoDB 是否适合我们的用例。我们有生成日志数据的客户端,并且该数据库的大多数用例都涉及按客户端 ID 和生成日志的时间范围进行查询。
我知道使用日期时间作为分片键将导致所有写入都发送到单个写入器。如果我们使用客户端 ID + 日期的复合分片键,我的理解是否正确,这将跨 N 个实例分发写入,其中 N 是唯一客户端的数量?
最近,我们的 MongoDB 的 CPU/内存和 I/O 使用率很高。在检查日志时,我发现的只是insert
这一时期的一些内容。在检查日志时,我注意到大多数插入日志都bytesRead
位于存储部分。所以我怀疑这会导致 I/O 然后缓存数据导致高内存。
插入峰值后,I/O 和 CPU 下降,但内存保持不变,重新启动后问题得到解决。
插入操作该磁盘读取是否正常?我们在 CentOS7 VM 中使用带有存储引擎的Mongo v4.0WiredTiger
。
2024-02-14T23:39:44.533+0800 I COMMAND [conn939845] insert db.user_log ninserted:1 keysInserted:11 numYields:0 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { w: 1 } }, Collection: { acquireCount: { w: 1 } } } storage:{ data: { bytesRead: 34390, timeReadingMicros: 140837 } } 141ms
2024-02-14T23:40:16.785+0800 I COMMAND [conn939845] insert db.user_log ninserted:1 keysInserted:11 numYields:0 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { w: 1 } }, Collection: { acquireCount: { w: 1 } } } storage:{ data: { bytesRead: 24150, timeReadingMicros: 506594 } } 507ms
我已经使用以下配置设置了 mongod 实例:
net:
port: 27017
bindIp: 0.0.0.0
ssl:
mode: requireSSL
PEMKeyFile: /config/mongo.pem
CAFile: /config/ca.pem
allowConnectionsWithoutCertificates: true
security:
authorization: enabled
我可以通过以下方式很好地连接到它mongosh
:
mongosh --host="<mydomain.com>:27017" --username="root" --db="mydbname" --ssl --authenticationDatabase="admin"
mongodump
但是当我尝试使用完全相同的选项进行连接时......:
mongodump --host="<mydomain.com>:27017" --username="root" --db="mydbname" --ssl --authenticationDatabase="admin"
...它失败并显示消息Failed: error connecting to db server: no reachable servers
。检查 mongod 日志我看到以下内容:
{"t":{"$date":"2023-12-08T13:55:30.966+00:00"},"s":"I", "c":"NETWORK", "id":22943, "ctx":"listener","msg":"Connection accepted","attr":{"remote":"<my ip address>","uuid":"41542a35-0815-4fb7-a618-d3ecf6b21a33","connectionId":244,"connectionCount":4}}
{"t":{"$date":"2023-12-08T13:55:30.980+00:00"},"s":"W", "c":"NETWORK", "id":23234, "ctx":"conn244","msg":"No SSL certificate provided by peer"}
{"t":{"$date":"2023-12-08T13:55:30.985+00:00"},"s":"I", "c":"NETWORK", "id":22944, "ctx":"conn244","msg":"Connection ended","attr":{"remote":"<my ip address>","uuid":"41542a35-0815-4fb7-a618-d3ecf6b21a33","connectionId":244,"connectionCount":3}}
这三行重复多次,直到连接超时。
我想知道为什么它说No SSL certificate provided by peer
当我allowConnectionsWithoutCertificates
设置为true
. 使用 mongosh 时显然这似乎不是问题,因为它连接没有问题。
假设我收集的文档中分布着 100 种狗。如果我需要按狗的类型进行分组,然后计算有关每种类型的狗的一些汇总统计信息,为什么要执行涉及 的查询($group
原则上按顺序处理每个文档),而不是向数据库发送 100 个单独的同步查询,其中每个查询基于关于狗的类型?
100 个同时、单独的查询不是更快吗?
如果它速度更快、规模更大,那么不这样做会有什么缺点(如果有的话)?
我对 MySQL 比较熟悉,但在我的新工作场所,我必须照顾 MongoDB 数据库(在 Ubuntu 18.04.6 上运行的 MongoDB 4.2.18 和 Mongosh 1.1.9 —— 是的,它很旧;升级是一个问题另一天)。我对 MongoDB 一无所知。不幸的是,创建它的人没有留下任何文档。现在,我需要照顾它。
我拥有的是用户名和密码。这样,我就可以像这样登录:
mongosh --port 27017 --authenticationDatabase "admin" -u "XXX" -p
我可以通过执行 来列出所有数据库show databases
。但是,我无法执行命令show users
:
admin> show users
MongoServerError: not authorized on admin to execute command { usersInfo: 1, lsid: { id: UUID("b2c4e061-1b54-4b27-bdf2-bef330b38b4d") }, $db: "admin" }
然后我尝试获取用户列表。我认为这是执行此操作的命令:
admin> show collections
system.users
system.version
admin> db.system.users.find().pretty ()
MongoServerError: not authorized on admin to execute command { find: "system.users", filter: {}, lsid: { id: UUID("1801ce09-5c09-44eb-9b04-86eb35817eaa") }, $db: "admin" }
总而言之,这感觉就像我的帐户不是管理员帐户。这是正确的吗?
如果是这样,是否可以创建一个具有完全管理员权限的新帐户?我可以sudo
访问主机。如果是这样,我该怎么做?
谢谢你!
据我所知,集合可以跨集群分片。这是否意味着每个分片都保证位于自己的硬件服务器上?或者多个分片可以共享相同的硬件吗?
如果多个分片位于同一硬件上,是否会破坏查询性能中并发的目的?
我试图理解为什么$dateadd
可以使用$expr
但不能不使用:
此代码返回结果集:
db.getCollection("CollectionName").aggregate(
[
{
"$sort" : {
"_id" : NumberInt(-1)
}
},
{"$match":
{"$expr":
{
$gte:
[ "$CreateDate",
{
$dateAdd:
{
startDate: ISODate(),
unit: "hour",
amount: -1
}
}
]
}
}
}
]);
虽然这不是(空结果集):
db.getCollection("CollectionName").aggregate(
[
{
"$sort" : {
"_id" : NumberInt(-1)
}
},
{"$match":
{"CreateDate": {
//"$gte" : ISODate("2023-07-04T12:25:00.000+0000") --works also
"$gte" : {$dateAdd:
{
startDate: ISODate(),
unit: "hour",
amount: -1
}
}
}
}
}
]);
$dateadd
用硬编码值替换也可以。对我们的一个分片的查询经常因以下错误而超时:
“集合 db.collection 的分片状态目前无法描述,需要从配置服务器中恢复”
我花了相当多的时间在互联网上搜索,但我找到的唯一参考是在 Jira 中测试错误报告。
有没有人遇到过类似的问题?