【问题标题】:Check configuration of mongodb setup检查 mongodb setup 的配置
【发布时间】:2014-11-17 06:22:17
【问题描述】:

我已经为集群环境设置了 mongodb。我的配置服务器和路由器在一台机器上运行,而分片在三台不同的机器上运行。我想知道我是否可以在终端上运行任何可用的命令(在哪个 configsvr 和路由器上运行),它将显示所有路由器名称、配置服务器(与其关联)、其他分片数据库(与其关联)。

为了更简单。

假设我运行我的命令/一段代码,它会显示出来。

router1---> configserver1----> Shardeddb1
                         ----> Shardeddb2
                         -----> shardeddb3

修改以使其更清晰。

我的 router1 和 configserver1 在单机上运行(比如 ip 19.0.0.123),Shardeddb1(比如 ip 19.0.0.124),Shardeddb2(比如 ip 19.0.0.125),Shardeddb3(比如 ip 19.0.0.126)。

我想将 Shardeddb1 设为主要,将 (Shardeddb2,Shardeddb3) 设为次要。如果我运行 sh.status();它向我显示详细信息,但不显示哪个数据库属于哪台机器。那么有没有什么脚本可以告诉我更多的细节?

sharding version: {
    "_id" : 1,
    "version" : 4,
    "minCompatibleVersion" : 4,
    "currentVersion" : 5,
    "clusterId" : ObjectId("545b632e9be3f019d6ef788f")
}
shards:
    {  "_id" : "ps1",  "host" : "ps1/19.0.0.123:27017","draining" : true }
    {  "_id" : "ps2",  "host" : "ps2/19.0.0.124:27017" }
    {  "_id" : "shard0000",  "host" : "19.0.0.125:27017" }
    {  "_id" : "shard0001",  "host" : "19.0.0.126:27017" }
databases:
    {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
    {  "_id" : "test",  "partitioned" : true,  "primary" : "shard0000" }
    {  "_id" : "demo",  "partitioned" : true,  "primary" : "shard0000" }
    {  "_id" : "db",  "partitioned" : false,  "primary" : "ps1" }
    {  "_id" : "mongotestDB",  "partitioned" : true,  "primary" : "ps1" }
            mongotestDB.logcoll
                    shard key: { "id" : 1 }
                    chunks:
                            shard0000       4
                            shard0001       9
                            ps2     7
                            ps1     5
                    too many chunks to print, use verbose if you want to force print

【问题讨论】:

  • Markus 在下面提出了一些很好的观点。我认为您可能希望更好地了解分片架构,然后您可以重新评估您的问题。天真地,sh.status 在 mongo shell 函数方面与您正在寻找的最接近。
  • sh.status() 的输出应显示每个数据库的主分片(不要与副本集的主成员混淆)。可以发一下吗?
  • @MarkusWMahlberg 我添加了 sh.status()
  • 您的设置与您显示的有点不同。但是看看数据库部分:每个数据库的主分片都给出了。
  • 实际上我想删除碎片 ps1 但不能这样做。它显示我处于“排水”状态但没有删除它。为什么我看不到二级分片?

标签: mongodb sharding mongo-shell


【解决方案1】:

由于您的图表另有显示:

  1. 您可以拥有 1 个或 3 个配置服务器。
  2. 您应该始终让您的mongos 实例具有完全相同相同的 configdb 参数字符串。并且这个字符串必须以相同的顺序保存所有配置服务器。 否则,您将面临元数据损坏的风险。
  3. 所有 configservers 和 mongos 都需要能够连接到集群中的所有节点并被集群中的所有节点连接。
  4. 了解集群概况的最简单方法是免费的 MongoDB Management Service 监控。
  5. 在同一台机器上运行mongos' 和配置服务器是可能的——只要您留意负载。如果事情变得很糟糕,并且配置服务器在更新元数据方面有延迟,因为mongos 消耗了所有的 IO,你可能会恶化事情。如果块拆分被延迟(并且它们更有可能在高负载下),这可能会导致必须手动拆分的 JumboChunk 并且 - 在完成之前 - 无法迁移。因此,在配置服务器 imvho 上运行 mongos 实例是一个非常糟糕的主意™。一个更好的解决方案是让 mongos 实例在应用服务器上运行,每个实例一个。

【讨论】:

  • 对于#5,你说的是哪种IO?磁盘? mongos 没有数据目录,也没有在磁盘上存储太多(如果有的话),所以我认为它不应该通过磁盘 I/O 与配置服务器发生冲突。通常,mongos 属于应用程序服务器,因为 mongos 足够轻量级,可以共存,并且可以节省网络跳数。
  • 网络 IO。我见过有人在小型 VPS 上同时运行 mongos 和 configserver,这开始成为一个问题。实际上,我们只是在另一个 mongos 尝试更新它的元数据缓存后才注意到它。我完全同意你的看法:appserver 上的 mongos 是最好的选择。
  • @wdberkeley:重新考虑这一点,我不太确定 RAM 是否也不是问题。尽管元数据很小,但老实说,我不太了解极端负载下的 mongos RAM 消耗。这也会成为小型实例的问题吗?
  • 我不这么认为。我无法想象集群元数据会变得如此之大,以至于缓存在 mongos 上的部分将是一大块内存。我想,如果游标上有大批量大小,您可以强制 mongos 在内存中保存大量文档。
  • @wdberkeley:嗯,或者很多游标,可能。非常感谢您提供的信息。
猜你喜欢
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 2016-02-14
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多