2015-10-19 44 views
1

我设置了一个MongoDb Sharded Replica Set 2簇,但我不知道如何测试一切是否正常。如何验证MongoDb Sharded副本集是否工作正常?

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

以下是主机名。

碎片1:

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

碎片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 

我的命令运行我replicat套(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. 我创建了一个文档中
  4. 我在3副本记录“testshard”:蒙戈 - rs1- *和蒙戈 - rs2- *以检查该数据被保存

结果

我注意到DB已于RS1创建(碎片1)和被复制在副本3:MONGO-rs1-1,蒙戈-rs1-2,蒙戈-rs1- 3。该数据库并未在分片2上创建;我认为这是正常的,因为分片功能保存在一个碎片上,但不能同时保存。

从这里,它看起来像复制品的作品。但是碎片2呢?如何检查数据是否可以保存到碎片2?

测试#2

  1. 我记录在Mongos和我创建的数据库RS2我强制RS2在Mongos的数据库“配置”。
  2. 我在testrs2中创建一个文档。

我期待看到在rs2中创建的新文档,但rs2仍然是一个空的数据库。

问题

Q1:如何测试了 “分片” 功能?我希望保存一个文档,并在正确的副本集(rs1或rs2)中查看它。 Q2:Mongo如何知道在rs1或rs2之间保存数据的位置?

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

问题4:在我的情况下,最好的备份策略是什么?我想我只需要做一个rs1和rs2的mongodump?

问题5:如果我说MongoDB的唯一访问点是通过Mongos?没有人应该查询副本集。

+0

你的问题是在这里脱离主题它可能更适合在[dba.stackexchange.com](http://dba.stackexchange.com),但一定要阅读他们的[如何问](http:// dba .stackexchange.com/help/how-to-ask)页面,以便您了解该网站的内容。 – styvane

回答

1

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

您已经修剪了sh.status()并省略了分片信息。看到这篇文章的分片状态应该是什么样子。知道设计包含区域分片标签,如果省略,则与您想要的类似。 MongoDb regional replica set - primary node in each region?

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

您的基本配置标识了分片键,mongo负责根据需要对文档进行什么分片和重新平衡分片。

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

默认情况下,分片是“自动化”的。分割集合时,指定分片键,mongo会指出如何分割集合并重新平衡数据库增长和分片键范围之间的分布更改。

问题4:在我的情况下,最好的备份策略是什么?我想我只需要做一个rs1和rs2的mongodump?

对于小型数据库来说,每个碎片成员上的Mongo转储是一个体面的策略,尽管使用体面分布的副本集可以消除除某些类型的维护(例如,您正在重塑集合并且需要回滚数据库在维护不好的情况下复制)

问题5:如果我说MongoDB的唯一访问点是通过Mongos?没有人应该查询副本集。

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

+0

非常感谢!关于第二季度,“你的基本配置标识分片键”,是否有你指的任何特定的配置? Q3:这个分片键在哪里定义? – JLavoie

+0

您使用mongod --shardsvr选项创建分片。给定两个分片和两个副本集,你有4个mongod's:在RS1中分片a/b,在RS2中分片a/b。在RS1/2之间分片复制,分片b是相同的。通过向rs.initiate()发送包含分片ID和成员的配置,将单个分片转换为分片集合。然后你创建你的配置服务器(基本上是RS /分片元数据的后备存储)。然后创建mongos,登录并使用admin命令添加碎片,启用碎片集合并识别碎片密钥。 –

+0

上面链接的stackoverflow问题有这些命令的例子。这一切都是在一台机器上完成的,所以如果你使用host:port,我认为它会非常相关。对于你的情况,你会忽略任何副本集成员的优先级,并省略最后4行 - 你想让mongo管理哪些文档去哪里。挑选分片键可能需要考虑 - 这应该让你开始:https://docs.mongodb.org/manual/core/sharding-shard-key/。如果上面链接的问题不清楚,请告诉我,以便我可以改进它。 –