如何验证MongoDb Sharded副本集是否运行良好?

时间:2015-10-19 16:13:27

标签: mongodb mongo-shell

我设置了一个包含2个群集的MongoDb Sharded副本集,但我不知道如何测试一切是否正常。

我在任何主机上都没有错误消息,这表明我的设置正常。所有主机都可以相互ping通,并使用默认端口27017。

以下是主机名。

Shard 1:

  • 蒙戈-rs1-1
  • 蒙戈-rs1-2
  • 蒙戈-rs1-3

Shard 2:

  • 蒙戈-RS2-1
  • 蒙戈-RS2-2
  • 蒙戈-rs2-3

3个配置服务器:

  • CFG-1
  • CFG-2
  • CFG-3

路由器(Mongos):

  • mongos-1

这是我在运行sh.status()时所拥有的:

mongos> sh.status()  

--- Sharding Status ---                                                         
  sharding version: {                                                           
        "_id" : 1,                                                              
        "version" : 4,                                                          
        "minCompatibleVersion" : 4,                                             
        "currentVersion" : 5,                                                   
        "clusterId" : ObjectId("562491c645300851d95d85bb")                      
}                                                                               
  shards:                                                                       
        {  "_id" : "rs1",  "host" : "rs1/mongo-rs1-1:27017,mongo-rs1-2:27017,mon
go-rs1-3:27017" }                                                               
        {  "_id" : "rs2",  "host" : "rs2/mongo-rs2-1:27017,mongo-rs2-2:27017,mon
go-rs2-3:27017" }                                                               
  databases:                                                                    
        {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }     
        {  "_id" : "testshard",  "partitioned" : true,  "primary" : "rs1" }                     
        {  "_id" : "testrs2",  "partitioned" : false,  "primary" : "rs2" }                              

我用命令运行我的mongos:

mongos --configdb cfg-1:27017,cfg-2:27017,cfg-3:27017

我使用命令运行配置服务器:

mongod --noprealloc --smallfiles --configsvr --dbpath /data/db --port 27017

我使用命令运行我的复制集(rs1和rs2):

mongod --replSet rs1 --noprealloc --smallfiles

副本集的设置如下:

rs1:PRIMARY> rs.status()                                                        
{                                                                               
        "set" : "rs1",                                                          
        "date" : ISODate("2015-10-19T15:45:31Z"),                               
        "myState" : 1,                                                          
        "members" : [                                                           
                {                                                               
                        "_id" : 0,                                              
                        "name" : "mongo-rs1-1:27017",                           
                        "health" : 1,                                           
                        "state" : 1,                                            
                        "stateStr" : "PRIMARY",                                 
                        "uptime" : 28658,                                       
                        "optime" : Timestamp(1445239630, 1),                    
                        "optimeDate" : ISODate("2015-10-19T07:27:10Z"),         
                        "electionTime" : Timestamp(1445240879, 1),              
                        "electionDate" : ISODate("2015-10-19T07:47:59Z"),       
                        "self" : true                                           
                },    
                {                                                               
                        "_id" : 1,                                              
                        "name" : "mongo-rs1-2:27017",                           
                        "health" : 1,                                           
                        "state" : 2,                                            
                        "stateStr" : "SECONDARY",                               
                        "uptime" : 28654,                                       
                        "optime" : Timestamp(1445239630, 1),                    
                        "optimeDate" : ISODate("2015-10-19T07:27:10Z"),         
                        "lastHeartbeat" : ISODate("2015-10-19T15:45:30Z"),      
                        "lastHeartbeatRecv" : ISODate("2015-10-19T15:45:30Z"),  
                        "pingMs" : 0,                                           
                        "syncingTo" : "mongo-rs1-1:27017"                       
                },  
                {                                                               
                        "_id" : 2,                                              
                        "name" : "mongo-rs1-3:27017",                           
                        "health" : 1,                                           
                        "state" : 2,                                            
                        "stateStr" : "SECONDARY",                               
                        "uptime" : 28654,                                       
                        "optime" : Timestamp(1445239630, 1),                    
                        "optimeDate" : ISODate("2015-10-19T07:27:10Z"),         
                        "lastHeartbeat" : ISODate("2015-10-19T15:45:29Z"),      
                        "lastHeartbeatRecv" : ISODate("2015-10-19T15:45:30Z"),  
                        "pingMs" : 1,                                           
                        "syncingTo" : "mongo-rs1-1:27017"                       
                }                                                               
        ],                                                                      
        "ok" : 1                                                                
}                          

我做的测试:

  1. 我将MongoDB客户端连接到Mongos URL。
  2. 我创建了一个DB:“testshard”
  3. 我在“testshard”
  4. 中创建了一个文档
  5. 我登录了3副本:mongo-rs1- *和mongo-rs2- *来检查数据的保存位置
  6. 结果

    我注意到DB是在RS1(分片1)上创建的,并在3个副本上复制:mongo-rs1-1,mongo-rs1-2,mongo-rs1-3。数据库未在分片2上创建;我认为这是正常的,因为分片功能可以节省一个分片,但不能同时保存两个分片。

    从这里开始,它看起来像是复制品。但是碎片2怎么样?如何检查数据是否可以保存到分片2?

    测试#2

    1. 我登录了Mongos,我在Mongos的数据库“config”中创建了数据库rs2,我强制转到rs2。
    2. 我在testrs2中创建了一个文档。
    3. 我希望看到在rs2中创建新文档,但rs2仍然是一个空数据库。

      问题

      Q1:我如何测试“分片”功能?我希望保存一个文档并在正确的副本集(rs1或rs2)中看到它。

      Q2:Mongo如何知道在rs1或rs2之间保存数据的位置?

      问题3:有没有办法自动化分片?我不想告诉哪个数据库应该去哪里,这应该是自动的。我期待数据在2个分片之间随机保存。

      第四季:在我的案例中,最好的备份策略是什么?我想我只需要做一个rs1和rs2的mongodump?

      第五季:如果我说MongoDB的唯一接入点是通过Mongos,我是对的吗?没人应该查询副本集。

1 个答案:

答案 0 :(得分:1)

Q1:我如何测试“分片”功能?我希望保存一个文档并在正确的副本集(rs1或rs2)中看到它。

您已剪切了sh.status()并省略了分片信息。请参阅此帖子了解碎片状态应该是什么样子。知道该设计包含区域分片标记,如果省略它将与您想要的类似。 MongoDb regional replica set - primary node in each region?

Q2:Mongo如何知道在rs1或rs2之间保存数据的位置?

您的基本配置标识了一个分片键,mongo负责处理哪些文档在什么样的分片上,并根据需要重新平衡分片。

问题3:有没有办法自动化分片?我不想告诉哪个数据库应该去哪里,这应该是自动的。我期待数据在2个分片之间随机保存。

默认情况下,分片会“自动化”。当您对集合进行分片时,您指定了分片键,mongo会在数据库增长和分片键范围之间的文档分配更改时确定如何对集合进行分区和重新平衡。

第四季:在我的案例中,最好的备份策略是什么?我想我只需要做一个rs1和rs2的mongodump?

每个分片成员上的Mongo转储对于小型数据库来说是一个不错的策略,尽管使用分布均匀的副本集消除了除了某些类型的维护之外的所有内容的常规备份需求(例如,您正在重塑集合并且您需要回滚数据库副本如果维护不顺利的话)

第五季:如果我说MongoDB的唯一接入点是通过Mongos,我是对的吗?没人应该查询副本集。

所有访问权必须是mongos。只有管​​理员才能直接访问副本集(或分片成员)。直接成员访问会破坏分片 - 结果会因配置而异。