本文共 24394 字,大约阅读时间需要 81 分钟。
本文档为在 Windows / CentOS 下
配置1个 mongos 服务,
多个 mongoDB 分片的操作。
具体操作为:
新增分片1,插入数据,
新增分片2,插入数据,
新增分片3,插入数据,
新增分片4,插入数据,
移除分片2,新增分片5 的处理。
用于模拟 一开始业务数据量不大,只使用一台服务器。
随着时间的流逝,数据量增大了, 不断地增加分片服务器。
以及某些旧的服务器需要淘汰了,更换新的服务器的处理。
以及如果一个 分片服务器 Down 了, 如果通过语句查询出来。
以及 同时运行多个 mongos 进程的时候, 及 C# 客户端连接代码的处理。
系统环境
五台 CentOS 虚拟机, 用于担当 “片” 机器名称分别为
MyCentOS_01 (192.168.253.209)
MyCentOS_02 (192.168.253.210)
MyCentOS_03 (192.168.253.211)
MyCentOS_04 (192.168.253.212)
MyCentOS_05 (192.168.253.213)
一台 Windows 主机 (192.168.253.78), 用于担当 “配置服务器”
步骤1. 启动配置服务器.
Windows 机器上, 下载 mongodb-win32-x86_64-2.4.6.zip
解压缩到 D: 盘
修改目录名为 mongodb
D: 盘下面, 创建一个 D:\data\db 目录
然后进入 D:\mongodb\bin 目录
运行
mongod.exe --dbpath D:\data\db
启动配置服务器
步骤2. 启动 mongos 进程
Windows 机器上
进入 D:\mongodb\bin 目录
运行
mongos --port 30000 --configdb 192.168.253.78:27017
启动 mongos 进程
(
注意事项:
1.运行 mongos , 必须要指定 --configdb 参数, 这个参数意思是 指定 配置服务器的地址
2. --configdb 参数, 后面需要写 具体的机器名称,或者 ip地址,不要使用 localhost
)
步骤3. 启动第一个片
在 MyCentOS_01 虚拟机上面, 运行
mkdir -p /data/sdb
创建用于存储数据库文件的目录
运行
./mongod --dbpath /data/sdb
启动 mongo 服务器端程序
步骤4. 添加第一个片
在 Windows 机器上
进入 D:\mongodb\bin 目录
运行
mongo.exe 192.168.253.78:30000/admin
运行 mongo 客户端, 连接到 mongos
(
注意事项:
这里的端口, 是 mongos 的端口, 不要写成 配置服务器的端口
)
在 mongo 客户端中, 输入命令
db.runCommand({addshard : "192.168.253.209:27017", "name" : "Basic Shard Server" })
新增一个片
系统返回:
{ "shardAdded" : "Basic Shard Server", "ok" : 1 }
步骤5. 数据库与表 的配置
运行
db.runCommand({"enableSharding" : "test"})
对数据库 test 启用 分片
系统返回:
{ "ok" : 1 }
运行
db.runCommand({"shardCollection" : "test.TestBasic", "key" : {"_id" : 1} })
对数据库 test 下面的 TestBasic 表, 启用分片
按照 _id 列进行分片
系统返回:
{ "collectionsharded" : "test.TestBasic", "ok" : 1 }
步骤6. 管理分片
在mongo 客户端中, 输入命令
mongos> use config
switched to db config查询所有的 片
mongos> db.shards.find()
{ "_id" : "Basic Shard Server", "host" : "192.168.253.209:27017" }
步骤7. 插入测试数据
步骤8. 查看数据分布
mongos> use test
switched to db testmongos> db.TestBasic.count()
50692 mongos> db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3, "minCompatibleVersion" : 3, "currentVersion" : 4, "clusterId" : ObjectId("525651ee5b9ed4426aece981") } shards: { "_id" : "Basic Shard Server", "host" : "192.168.253.209:27017" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "Basic Shard Serv er" } test.TestBasic shard key: { "_id" : 1 } chunks: Basic Shard Server 3 { "_id" : { "$minKey" : 1 } } -->> { "_id" : ObjectId("5 256589670da9a26988abf39") } on : Basic Shard Server Timestamp(1, 1) { "_id" : ObjectId("5256589670da9a26988abf39") } -->> { "_id" : ObjectId("525658c070da9a26988ade12") } on : Basic Shard Server Timestamp (1, 3) { "_id" : ObjectId("525658c070da9a26988ade12") } -->> { "_id" : { "$maxKey" : 1 } } on : Basic Shard Server Timestamp(1, 4)通过上面的结果, 可以看出, 数据被分成了3个片。
但是由于 服务器只有1个, 因此, 3个片都存储在那个 “Basic Shard Server” 服务器上面。
步骤9. 启动第二个片
在 MyCentOS_02 虚拟机上面, 运行
mkdir -p /data/sdb
创建用于存储数据库文件的目录
运行
./mongod --dbpath /data/sdb
启动 mongo 服务器端程序
步骤10. 添加第二个片
mongos> use admin
switched to db admin mongos> db.runCommand({addshard : "192.168.253.210:27017", "name" : "Exp Shard Server 02" }); { "shardAdded" : "Exp Shard Server 02", "ok" : 1 }步骤11. 查询片的分布.
mongos> use test
switched to db test mongos> db.TestBasic.count() 100000 mongos> db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3, "minCompatibleVersion" : 3, "currentVersion" : 4, "clusterId" : ObjectId("525651ee5b9ed4426aece981") } shards: { "_id" : "Basic Shard Server", "host" : "192.168.253.209:27017" } { "_id" : "Exp Shard Server 02", "host" : "192.168.253.210:27017" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "Basic Shard Serv er" } test.TestBasic shard key: { "_id" : 1 } chunks: Exp Shard Server 02 1 Basic Shard Server 2 { "_id" : { "$minKey" : 1 } } -->> { "_id" : ObjectId("5 256589670da9a26988abf39") } on : Exp Shard Server 02 Timestamp(2, 0) { "_id" : ObjectId("5256589670da9a26988abf39") } -->> { "_id" : ObjectId("525658c070da9a26988ade12") } on : Basic Shard Server Timestamp (2, 1) { "_id" : ObjectId("525658c070da9a26988ade12") } -->> { "_id" : { "$maxKey" : 1 } } on : Basic Shard Server Timestamp(1, 4)通过上面的结果, 可以看出, 数据被分成了3个片。
服务器有2个
其中1个片存储在那个 “Exp Shard Server 02” 服务器上面。
其中2个片存储在那个 “Basic Shard Server” 服务器上面。
步骤12. 启动第三个片
在 MyCentOS_03 虚拟机上面, 运行
mkdir -p /data/sdb
创建用于存储数据库文件的目录
运行
./mongod --dbpath /data/sdb
启动 mongo 服务器端程序
步骤13. 添加第三个片
mongos> use admin switched to db admin
mongos> db.runCommand({addshard : "192.168.253.211:27017", "name" : "Exp Shard Server 03" });
{ "shardAdded" : "Exp Shard Server 03", "ok" : 1 }步骤14. 查询片的分布.
mongos> use test
switched to db test mongos> db.TestBasic.count() 100000 mongos> db.printShardingStatus()--- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3, "minCompatibleVersion" : 3, "currentVersion" : 4, "clusterId" : ObjectId("525651ee5b9ed4426aece981") } shards: { "_id" : "Basic Shard Server", "host" : "192.168.253.209:27017" } { "_id" : "Exp Shard Server 02", "host" : "192.168.253.210:27017" } { "_id" : "Exp Shard Server 03", "host" : "192.168.253.211:27017" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "Basic Shard Serv er" } test.TestBasic shard key: { "_id" : 1 } chunks: Exp Shard Server 02 1 Exp Shard Server 03 1 Basic Shard Server 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : ObjectId("5 256589670da9a26988abf39") } on : Exp Shard Server 02 Timestamp(2, 0) { "_id" : ObjectId("5256589670da9a26988abf39") } -->> { "_id" : ObjectId("525658c070da9a26988ade12") } on : Exp Shard Server 03 Timestam p(3, 0) { "_id" : ObjectId("525658c070da9a26988ade12") } -->> { "_id" : { "$maxKey" : 1 } } on : Basic Shard Server Timestamp(3, 1)通过上面的结果, 可以看出, 数据被分成了3个片。
服务器有3个
其中1个片存储在那个 “Exp Shard Server 02” 服务器上面。
其中1个片存储在那个 “Exp Shard Server 03” 服务器上面。
其中1个片存储在那个 “Basic Shard Server” 服务器上面。
步骤15. 继续插入测试数据
步骤16. 查询片的分布.
mongos> db.TestBasic.count()
239170 mongos> db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3, "minCompatibleVersion" : 3, "currentVersion" : 4, "clusterId" : ObjectId("525651ee5b9ed4426aece981") } shards: { "_id" : "Basic Shard Server", "host" : "192.168.253.209:27017" } { "_id" : "Exp Shard Server 02", "host" : "192.168.253.210:27017" } { "_id" : "Exp Shard Server 03", "host" : "192.168.253.211:27017" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "Basic Shard Serv er" } test.TestBasic shard key: { "_id" : 1 } chunks: Exp Shard Server 02 2 Exp Shard Server 03 1 Basic Shard Server 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : ObjectId("5 256589670da9a26988abf39") } on : Exp Shard Server 02 Timestamp(2, 0) { "_id" : ObjectId("5256589670da9a26988abf39") } -->> { "_id" : ObjectId("525658c070da9a26988ade12") } on : Exp Shard Server 03 Timestam p(3, 0) { "_id" : ObjectId("525658c070da9a26988ade12") } -->> { "_id" : ObjectId("525660b070da9a23008cc895") } on : Basic Shard Server Timestamp (4, 1) { "_id" : ObjectId("525660b070da9a23008cc895") } -->> { "_id" : { "$maxKey" : 1 } } on : Exp Shard Server 02 Timestamp(4, 0)通过上面的结果, 可以看出, 随着数据量的增加,数据被分成了4个片。
服务器有3个
其中2个片存储在那个 “Exp Shard Server 02” 服务器上面。
其中1个片存储在那个 “Exp Shard Server 03” 服务器上面。
其中1个片存储在那个 “Basic Shard Server” 服务器上面。
步骤17. 启动第四个片
在 MyCentOS_04 虚拟机上面, 运行
mkdir -p /data/sdb
创建用于存储数据库文件的目录
运行
./mongod --dbpath /data/sdb
启动 mongo 服务器端程序
步骤18. 添加第四个片
mongos> use admin switched to db admin mongos> db.runCommand({addshard : "192.168.253.212:27017", "name" : "Exp Shard Server 04" });
{ "shardAdded" : "Exp Shard Server 04", "ok" : 1 }
步骤19. 查询片的分布.
mongos> use test
switched to db test mongos> db.TestBasic.count() 300000 mongos> db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3, "minCompatibleVersion" : 3, "currentVersion" : 4, "clusterId" : ObjectId("525651ee5b9ed4426aece981") } shards: { "_id" : "Basic Shard Server", "host" : "192.168.253.209:27017" } { "_id" : "Exp Shard Server 02", "host" : "192.168.253.210:27017" } { "_id" : "Exp Shard Server 03", "host" : "192.168.253.211:27017" } { "_id" : "Exp Shard Server 04", "host" : "192.168.253.212:27017" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "Basic Shard Serv er" } test.TestBasic shard key: { "_id" : 1 } chunks: Exp Shard Server 04 1 Exp Shard Server 03 1 Basic Shard Server 1 Exp Shard Server 02 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : ObjectId("5 256589670da9a26988abf39") } on : Exp Shard Server 04 Timestamp(5, 0) { "_id" : ObjectId("5256589670da9a26988abf39") } -->> { "_id" : ObjectId("525658c070da9a26988ade12") } on : Exp Shard Server 03 Timestam p(3, 0) { "_id" : ObjectId("525658c070da9a26988ade12") } -->> { "_id" : ObjectId("525660b070da9a23008cc895") } on : Basic Shard Server Timestamp (4, 1) { "_id" : ObjectId("525660b070da9a23008cc895") } -->> { "_id" : { "$maxKey" : 1 } } on : Exp Shard Server 02 Timestamp(5, 1)通过上面的结果, 可以看出, 随着数据量的增加,数据被分成了4个片。
服务器有4个
其中1个片存储在那个 “Exp Shard Server 04” 服务器上面。
其中1个片存储在那个 “Exp Shard Server 02” 服务器上面。
其中1个片存储在那个 “Exp Shard Server 03” 服务器上面。
其中1个片存储在那个 “Basic Shard Server” 服务器上面。
步骤20. 启动第五个片
在 MyCentOS_05 虚拟机上面, 运行
mkdir -p /data/sdb
创建用于存储数据库文件的目录
运行
./mongod --dbpath /data/sdb
启动 mongo 服务器端程序
步骤21. 移除 第二个片; 加入第五个片 ( 本操作模拟 新增一个服务器,更换掉旧有的服务器 )
mongos> use admin
switched to db adminmongos> db.runCommand({removeShard : "Exp Shard Server 02" });
{ "msg" : "draining started successfully", "state" : "started", "shard" : "Exp Shard Server 02", "ok" : 1 } mongos> db.runCommand({addshard : "192.168.253.213:27017", "name" : "Exp Shard Server 05" }); { "shardAdded" : "Exp Shard Server 05", "ok" : 1 }
注意: 移除分片,是一个比较耗时的处理。
上面的返回结果中, state 是 started
也就是 移除分片的处理开始了.
一段时间以后, 再次执行语句:
mongos> db.runCommand({removeShard : "Exp Shard Server 02" });
{ "msg" : "removeshard completed successfully", "state" : "completed", "shard" : "Exp Shard Server 02", "ok" : 1 }状态显示, 分片已经被移除了.
步骤22. 查询片的分布.
mongos> use test
switched to db test mongos> db.TestBasic.count() 300000 mongos> db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3, "minCompatibleVersion" : 3, "currentVersion" : 4, "clusterId" : ObjectId("525651ee5b9ed4426aece981") } shards: { "_id" : "Basic Shard Server", "host" : "192.168.253.209:27017" } { "_id" : "Exp Shard Server 03", "host" : "192.168.253.211:27017" } { "_id" : "Exp Shard Server 04", "host" : "192.168.253.212:27017" } { "_id" : "Exp Shard Server 05", "host" : "192.168.253.213:27017" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "Basic Shard Serv er" } test.TestBasic shard key: { "_id" : 1 } chunks: Exp Shard Server 04 1 Exp Shard Server 03 1 Exp Shard Server 05 1 Basic Shard Server 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : ObjectId("5 256589670da9a26988abf39") } on : Exp Shard Server 04 Timestamp(5, 0) { "_id" : ObjectId("5256589670da9a26988abf39") } -->> { "_id" : ObjectId("525658c070da9a26988ade12") } on : Exp Shard Server 03 Timestam p(3, 0) { "_id" : ObjectId("525658c070da9a26988ade12") } -->> { "_id" : ObjectId("525660b070da9a23008cc895") } on : Exp Shard Server 05 Timestam p(7, 0) { "_id" : ObjectId("525660b070da9a23008cc895") } -->> { "_id" : { "$maxKey" : 1 } } on : Basic Shard Server Timestamp(7, 1)通过上面的结果, 可以看出,数据被分成了4个片。
服务器有4个
其中1个片存储在那个 “Exp Shard Server 04” 服务器上面。
其中1个片存储在那个 “Exp Shard Server 05” 服务器上面。
其中1个片存储在那个 “Exp Shard Server 03” 服务器上面。
其中1个片存储在那个 “Basic Shard Server” 服务器上面。
其中的 Exp Shard Server 02 已经被移除掉了, 因此在上面的列表中, 没有该片的信息。
通过与 步骤 19 的结果对比。
数据库可能是这样处理 移除与新增的处理的:
当移除 “Exp Shard Server 02” 的时候, 原本由 Exp Shard Server 02 存储的数据, 需要迁移到 “Basic Shard Server” 上面去。
当新增 “Exp Shard Server 05” 的时候,数据又从 “Basic Shard Server” 迁移一部分到 “Exp Shard Server 05” 上面去。
步骤23. 模拟某个分片发生故障
在 MyCentOS_03 虚拟机上面, 运行
shutdown -h now
关闭计算机
步骤24. 查询片的分布.
mongos> use test
switched to db testmongos> db.TestBasic.count()
Thu Oct 10 17:06:24.159 count failed: { "code" : 15988, "ok" : 0, "errmsg" : "ex ception: error querying server" } at src/mongo/shell/query.js:180
mongos> use config
switched to db configmongos> db.mongos.find()
error: { "$err" : "socket exception [CONNECT_ERROR] for 192.168.253.211:27017", "code" : 11002, "shard" : "config" }
mongos> db.shards.find()
error: { "$err" : "socket exception [CONNECT_ERROR] for 192.168.253.211:27017", "code" : 11002, "shard" : "config" }步骤25. 启动第三个片 (模拟某个分片发生故障后恢复)
在 MyCentOS_03 虚拟机上面
运行
./mongod --dbpath /data/sdb
启动 mongo 服务器端程序
步骤26. 查询片的分布.
mongos> use test
switched to db test mongos> db.TestBasic.count() 300000mongos> use config
switched to db config mongos> db.mongos.find() { "_id" : "EdwardPC:30000", "mongoVersion" : "2.4.6", "ping" : ISODate("2013-10- 10T09:16:20.179Z"), "up" : 7798, "waiting" : true } mongos> db.shards.find() { "_id" : "Basic Shard Server", "host" : "192.168.253.209:27017" } { "_id" : "Exp Shard Server 03", "host" : "192.168.253.211:27017" } { "_id" : "Exp Shard Server 04", "host" : "192.168.253.212:27017" } { "_id" : "Exp Shard Server 05", "host" : "192.168.253.213:27017" }mongos> db.databases.find();
{ "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "Basic Shard Server" }mongos> db.collections.find();
{ "_id" : "test.TestBasic", "lastmod" : ISODate("1970-01-16T23:43:09.637Z"), "dr opped" : false, "key" : { "_id" : 1 }, "unique" : false, "lastmodEpoch" : Object Id("525655455b9ed4426aecea13") }mongos> db.chunks.find();
{ "_id" : "test.TestBasic-_id_MinKey", "lastmod" : Timestamp(5, 0), "lastmodEpoc h" : ObjectId("525655455b9ed4426aecea13"), "ns" : "test.TestBasic", "min" : { "_ id" : { "$minKey" : 1 } }, "max" : { "_id" : ObjectId("5256589670da9a26988abf39" ) }, "shard" : "Exp Shard Server 04" } { "_id" : "test.TestBasic-_id_ObjectId('5256589670da9a26988abf39')", "lastmod" : Timestamp(3, 0), "lastmodEpoch" : ObjectId("525655455b9ed4426aecea13"), "ns" : "test.TestBasic", "min" : { "_id" : ObjectId("5256589670da9a26988abf39") }, "max " : { "_id" : ObjectId("525658c070da9a26988ade12") }, "shard" : "Exp Shard Serve r 03" } { "_id" : "test.TestBasic-_id_ObjectId('525658c070da9a26988ade12')", "lastmod" : Timestamp(7, 0), "lastmodEpoch" : ObjectId("525655455b9ed4426aecea13"), "ns" : "test.TestBasic", "min" : { "_id" : ObjectId("525658c070da9a26988ade12") }, "max " : { "_id" : ObjectId("525660b070da9a23008cc895") }, "shard" : "Exp Shard Serve r 05" } { "_id" : "test.TestBasic-_id_ObjectId('525660b070da9a23008cc895')", "lastmod" : Timestamp(7, 1), "lastmodEpoch" : ObjectId("525655455b9ed4426aecea13"), "ns" : "test.TestBasic", "min" : { "_id" : ObjectId("525660b070da9a23008cc895") }, "max " : { "_id" : { "$maxKey" : 1 } }, "shard" : "Basic Shard Server" }步骤27. 启动第二个 mongos 进程 (用于避免第一个 mongos 进程 Down 掉 )
Windows 机器上
进入 D:\mongodb\bin 目录
运行
mongos --port 30001 --configdb 192.168.253.78:27017
启动 mongos 进程
步骤28. C# 客户端代码
// 下面这种情况, 是用于多个 mongos 进程的情况.
MongoClientSettings setting = new MongoClientSettings();
setting.ConnectionMode = ConnectionMode.ShardRouter;
setting.Servers = new List <MongoServerAddress>() {
new MongoServerAddress ("192.168.253.78", 30000),
new MongoServerAddress ("192.168.253.78", 30001) };
MongoClient client = new MongoClient(setting);
运行并插入数据。
核对数据量
步骤29. 停掉第一个 mongos 进程
在步骤2 的 “mongos” 窗口上, 按 Ctrl+C 停止该进程。
步骤30. 再次运行 C# 客户端代码
运行并插入数据。
核对数据量
步骤31. 备份的处理
D:\mongodb\bin>mongodump.exe -h 192.168.253.78:30001 -d test -o d:\test
connected to: 192.168.253.78:30001 Thu Oct 10 18:42:21.424 DATABASE: test to d:\test\test Thu Oct 10 18:42:21.446 test.system.indexes to d:\test\test\system.index es.bson Thu Oct 10 18:42:21.451 1 objects Thu Oct 10 18:42:21.453 test.TestBasic to d:\test\test\TestBasic.bson Thu Oct 10 18:42:24.193 Collection File Writing Progress: 109900 /500000 21% (objects) Thu Oct 10 18:42:27.515 Collection File Writing Progress: 403900 /500000 80% (objects) Thu Oct 10 18:42:27.658 500000 objects Thu Oct 10 18:42:27.659 Metadata for test.TestBasic to d:\test\test\Test Basic.metadata.json上面的操作, 是 通过 连接 mongos, 一次性备份全部分片的数据.
步骤32. 模拟 分片正常 配置服务器物理损坏.
把前面 步骤1 的 mongod.exe 停掉
步骤2 与 步骤 27 的 mongos 全部停掉
D: 盘下面, 创建一个 D:\data\db2 目录
然后进入 D:\mongodb\bin 目录
运行
mongod.exe --dbpath D:\data\db2
启动配置服务器
步骤33. 启动 mongos 进程
Windows 机器上
进入 D:\mongodb\bin 目录
运行
mongos --port 30000 --configdb 192.168.253.78:27017
启动 mongos 进程
步骤34. 重新加入分片
D:\mongodb\bin>mongo.exe 192.168.253.78:30000/admin
MongoDB shell version: 2.4.6 connecting to: 192.168.253.78:30000/admin mongos> db.runCommand({addshard : "192.168.253.209:27017", "name" : "Basic Shard Server" }) { "shardAdded" : "Basic Shard Server", "ok" : 1 } mongos> db.runCommand({addshard : "192.168.253.210:27017", "name" : "Exp Shard Server 02" }); { "ok" : 0, "errmsg" : "can't add shard 192.168.253.210:27017 because a local databa se 'test' exists in another Basic Shard Server:192.168.253.209:27017" } mongos> db.runCommand({addshard : "192.168.253.211:27017", "name" : "Exp Shard Server 03" }); { "ok" : 0, "errmsg" : "can't add shard 192.168.253.211:27017 because a local databa se 'test' exists in another Basic Shard Server:192.168.253.209:27017" }上面的执行结果显示, 如果 配置服务器 物理损坏了, 重新搭建一个新的 配置服务器, 没法简单的加入已有的 分片服务器了。
终止上面的 步骤23 的 配置服务器 与 步骤24 的 mongos 进程.
重新启动 步骤1的 配置服务器 与 步骤2的 mongos 进程.
D:\mongodb\bin>mongo.exe 192.168.253.78:30000/admin
MongoDB shell version: 2.4.6 connecting to: 192.168.253.78:30000/admin mongos> use test switched to db test mongos> db.TestBasic.count() 500000 mongos> db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3, "minCompatibleVersion" : 3, "currentVersion" : 4, "clusterId" : ObjectId("525651ee5b9ed4426aece981") } shards: { "_id" : "Basic Shard Server", "host" : "192.168.253.209:27017" } { "_id" : "Exp Shard Server 03", "host" : "192.168.253.211:27017" } { "_id" : "Exp Shard Server 04", "host" : "192.168.253.212:27017" } { "_id" : "Exp Shard Server 05", "host" : "192.168.253.213:27017" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "Basic Shard Serv er" } test.TestBasic shard key: { "_id" : 1 } chunks: Exp Shard Server 04 1 Exp Shard Server 03 2 Exp Shard Server 05 1 Basic Shard Server 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : ObjectId("5 256589670da9a26988abf39") } on : Exp Shard Server 04 Timestamp(5, 0) { "_id" : ObjectId("5256589670da9a26988abf39") } -->> { "_id" : ObjectId("525658c070da9a26988ade12") } on : Exp Shard Server 03 Timestam p(3, 0) { "_id" : ObjectId("525658c070da9a26988ade12") } -->> { "_id" : ObjectId("525660b070da9a23008cc895") } on : Exp Shard Server 05 Timestam p(7, 0) { "_id" : ObjectId("525660b070da9a23008cc895") } -->> { "_id" : ObjectId("52567a9e70da9a2bbc76c2a9") } on : Basic Shard Server Timestamp (8, 1) { "_id" : ObjectId("52567a9e70da9a2bbc76c2a9") } -->> { "_id" : { "$maxKey" : 1 } } on : Exp Shard Server 03 Timestamp(8, 0)显示各分片数据都正常。
再把 前面移除掉的 第2个片, 加进来
mongos> use admin
switched to db admin mongos> db.runCommand({addshard : "192.168.253.210:27017", "name" : "Exp Shard Server 02" }); { "ok" : 0, "errmsg" : "can't add shard 192.168.253.210:27017 because a local database 'test' exists in another Basic Shard Server:192.168.253.209:27017" }结果还是报错。
命令行 单独连接到这个 服务器上面去, 删除 分片2上面的 test 数据库。
D:\mongodb\bin>mongo 192.168.253.210:27017
> use test
switched to db test> show dbs
local 0.03125GB test 0.0625GB> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 } > show dbs local 0.03125GB >回到 mongos 客户端
mongos> db.runCommand({addshard : "192.168.253.210:27017", "name" : "Exp Shard Server 02" });
{ "shardAdded" : "Exp Shard Server 02", "ok" : 1 } mongos>mongos> use test
switched to db test mongos> db.TestBasic.count() 500000 mongos> db.printShardingStatus() --- Sharding Status --- sharding version: { "_id" : 1, "version" : 3, "minCompatibleVersion" : 3, "currentVersion" : 4, "clusterId" : ObjectId("525651ee5b9ed4426aece981") } shards: { "_id" : "Basic Shard Server", "host" : "192.168.253.209:27017" } { "_id" : "Exp Shard Server 02", "host" : "192.168.253.210:27017" } { "_id" : "Exp Shard Server 03", "host" : "192.168.253.211:27017" } { "_id" : "Exp Shard Server 04", "host" : "192.168.253.212:27017" } { "_id" : "Exp Shard Server 05", "host" : "192.168.253.213:27017" } databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "test", "partitioned" : true, "primary" : "Basic Shard Serv er" } test.TestBasic shard key: { "_id" : 1 } chunks: Exp Shard Server 04 1 Exp Shard Server 02 1 Exp Shard Server 05 1 Basic Shard Server 1 Exp Shard Server 03 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : ObjectId("5 256589670da9a26988abf39") } on : Exp Shard Server 04 Timestamp(5, 0) { "_id" : ObjectId("5256589670da9a26988abf39") } -->> { "_id" : ObjectId("525658c070da9a26988ade12") } on : Exp Shard Server 02 Timestam p(9, 0) { "_id" : ObjectId("525658c070da9a26988ade12") } -->> { "_id" : ObjectId("525660b070da9a23008cc895") } on : Exp Shard Server 05 Timestam p(7, 0) { "_id" : ObjectId("525660b070da9a23008cc895") } -->> { "_id" : ObjectId("52567a9e70da9a2bbc76c2a9") } on : Basic Shard Server Timestamp (8, 1) { "_id" : ObjectId("52567a9e70da9a2bbc76c2a9") } -->> { "_id" : { "$maxKey" : 1 } } on : Exp Shard Server 03 Timestamp(9, 1)步骤35. 独立备份每一个分片的处理
mongodump.exe -h 192.168.253.209 -d test -o d:\test\01
mongodump.exe -h 192.168.253.210 -d test -o d:\test\02
mongodump.exe -h 192.168.253.211 -d test -o d:\test\03
mongodump.exe -h 192.168.253.212 -d test -o d:\test\04
mongodump.exe -h 192.168.253.213 -d test -o d:\test\05
运行结果:
D:\mongodb\bin>mongodump.exe -h 192.168.253.209 -d test -o d:\test\01
connected to: 192.168.253.209 Fri Oct 11 11:19:54.350 DATABASE: test to d:\test\01\test Fri Oct 11 11:19:54.356 test.system.indexes to d:\test\01\test\system.in dexes.bson Fri Oct 11 11:19:54.361 1 objects Fri Oct 11 11:19:54.361 test.TestBasic to d:\test\01\test\TestBasic.bson Fri Oct 11 11:19:56.530 207418 objects Fri Oct 11 11:19:56.532 Metadata for test.TestBasic to d:\test\01\test\T estBasic.metadata.json D:\mongodb\bin>mongodump.exe -h 192.168.253.210 -d test -o d:\test\02 connected to: 192.168.253.210 Fri Oct 11 11:19:56.676 DATABASE: test to d:\test\02\test Fri Oct 11 11:19:56.680 test.system.indexes to d:\test\02\test\system.in dexes.bson Fri Oct 11 11:19:56.683 1 objects Fri Oct 11 11:19:56.684 test.TestBasic to d:\test\02\test\TestBasic.bson Fri Oct 11 11:19:56.727 7897 objects Fri Oct 11 11:19:56.728 Metadata for test.TestBasic to d:\test\02\test\T estBasic.metadata.json D:\mongodb\bin>mongodump.exe -h 192.168.253.211 -d test -o d:\test\03 connected to: 192.168.253.211 Fri Oct 11 11:19:56.866 DATABASE: test to d:\test\03\test Fri Oct 11 11:19:56.869 test.system.indexes to d:\test\03\test\system.in dexes.bson Fri Oct 11 11:19:56.874 1 objects Fri Oct 11 11:19:56.875 test.TestBasic to d:\test\03\test\TestBasic.bson Fri Oct 11 11:19:57.651 73824 objects Fri Oct 11 11:19:57.652 Metadata for test.TestBasic to d:\test\03\test\T estBasic.metadata.json D:\mongodb\bin>mongodump.exe -h 192.168.253.212 -d test -o d:\test\04 connected to: 192.168.253.212 Fri Oct 11 11:19:57.799 DATABASE: test to d:\test\04\test Fri Oct 11 11:19:57.804 test.system.indexes to d:\test\04\test\system.in dexes.bson Fri Oct 11 11:19:57.808 1 objects Fri Oct 11 11:19:57.809 test.TestBasic to d:\test\04\test\TestBasic.bson Fri Oct 11 11:19:57.813 0 objects Fri Oct 11 11:19:57.814 Metadata for test.TestBasic to d:\test\04\test\T estBasic.metadata.json D:\mongodb\bin>mongodump.exe -h 192.168.253.213 -d test -o d:\test\05 connected to: 192.168.253.213 Fri Oct 11 11:19:57.952 DATABASE: test to d:\test\05\test Fri Oct 11 11:19:57.957 test.system.indexes to d:\test\05\test\system.in dexes.bson Fri Oct 11 11:19:57.960 1 objects Fri Oct 11 11:19:57.961 test.TestBasic to d:\test\05\test\TestBasic.bson Fri Oct 11 11:20:00.067 Collection File Writing Progress: 172700 /210861 81% (objects) Fri Oct 11 11:20:00.079 210861 objects Fri Oct 11 11:20:00.080 Metadata for test.TestBasic to d:\test\05\test\T estBasic.metadata.json上面的 备份结果显示, 虽然分了5 个区, 但是每个区的数据分布, 是不均匀的。
参考资料:
转载自: