我的设置:我有 2 个主机,每个主机有 2 个分片。
- Host1 有 2 个分片,并且是副本的主服务器
- host2 具有 2 个分片的辅助节点。
。
- 主机1:分片1(repset1),分片2(repset2)
- 主机2:分片1(repset1),分片2(repset2)
还有第三台主机充当仲裁者。
我有 50 个线程通过 mongos 随机写入两个分片(使用哈希),并且每次插入时都设置 REPLICA_SAFE WriteConcern。
问题:
- mongostat 显示 host1 中两个分片的锁定率约为 90%,host2 中约为 1%。由于我使用了 REPLICA_SAFE,据称它会写入两个服务器,所以锁定不应该相同吗?
- mongostat 报告 host1 的两个分片的 qr=30,并且始终为 qw=0。由于我只执行写入,这怎么可能呢?此外,在 host2 上,所有队列都报告为 0。所有分片/主机(大约 80)中的故障都差不多。
- 辅助服务器 (host2) 上的 netIn/netOut 始终约为 200 字节/秒。太低了。
- mongos 有 53 个连接,host1 的分片有 71 和 71,host2 的分片有 9 和 8。这是怎么回事?
答案1
在一台主机上运行多个 mongod 实例时要小心。它们在系统单元化方面存在竞争:
或者运行具有专用 RAM 和 CPU 的虚拟机(这就是您可以使用 MongoDB 更有效地使用那些 24Core 系统的方式;)
答案2
西万,
看起来您使用的是 mongo < 2.0,如果不是,情况可能会发生变化。您说您正在使用 REPLICA_SAFE,您使用的是哪个 W 级别?如果是 w:1,那么您只是确认对主服务器的写入已成功,您应该使用 w:2 来确认写入已到达辅助服务器。
复制将解决此问题。插入时会获取写入锁定,这会阻止复制读取要复制的数据。
强调第 1 点。您的复制读取排队在插入写入之后。故障可能是这里的问题,因为您的系统需要将要读取的内容分页到 RAM 中,以便复制,从而产生其锁定。由于 Marc 提到的原因,您还可能看到两个主节点之间对 RAM 的争用。
似乎很低,但不能确定。很可能您的系统正在等待将数据分页到 RAM 中或等待写入锁定以进行复制。
您可以从日志文件中看到哪些连接去了哪里。如果不知道什么在哪里,我就无法告诉你原因。话虽如此,这里的连接数似乎并不不合理。