【发布时间】:2015-10-19 16:13:27
【问题描述】:
我设置了一个包含 2 个集群的 MongoDb 分片副本集,但我不知道如何测试一切是否正常。
我在任何主机上都没有错误消息,这表明我的设置正常。所有主机都可以互相 ping 通,并使用默认端口 27017。
这是主机名。
分片 1:
- mongo-rs1-1
- mongo-rs1-2
- mongo-rs1-3
分片 2:
- mongo-rs2-1
- mongo-rs2-2
- mongo-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
}
我做的测试:
- 我用我的 MongoDB 客户端连接到 Mongos URL。
- 我创建了一个数据库:“testshard”
- 我在“testshard”中创建了一个文档
- 我登录了 3 个副本:mongo-rs1-* 和 mongo-rs2-* 以检查数据的保存位置
结果
我注意到数据库是在 RS1(分片 1)上创建的,并在 3 个副本上复制:mongo-rs1-1、mongo-rs1-2、mongo-rs1-3。数据库不是在分片 2 上创建的;我认为这是正常的,因为分片功能保存在一个分片上,但不能同时保存。
从这里看,复制品似乎有效。但是分片2呢?如何检查数据是否可以保存到分片2?
测试#2
- 我登录了 Mongos 并创建了数据库 rs2,我在 Mongos 的数据库“config”中强制为 rs2。
- 我在 testrs2 中创建了一个文档。
我期待看到在 rs2 中创建的新文档,但 rs2 仍然是一个空 DB。
问题
Q1:如何测试“分片”功能?我希望保存一个文档并在正确的副本集(rs1 或 rs2)中查看它。
Q2:Mongo 如何知道 rs1 或 rs2 之间的数据保存在哪里?
Q3:有没有办法自动化分片?我不想告诉哪个数据库应该去哪里,这应该是自动的。我希望数据在 2 个分片之间随机保存。
Q4:就我而言,最好的备份策略是什么?我想我只需要做一个 rs1 和 rs2 的 mongodump 吗?
Q5:如果我说 MongoDB 的唯一访问点是通过 Mongos,我说得对吗?没有人应该查询副本集。
【问题讨论】:
-
您的问题在这里是题外话,它可能更适合dba.stackexchange.com,但请务必阅读他们的How to Ask 页面,以便了解该网站的内容。
标签: mongodb mongo-shell