1、分片实际情况例子:
Shard Server 1:27020
Shard Server 2:27021
Shard Server 3:27022
Shard Server 4:27023
Config Server :27100
Route Process:40000
创建分片数据目录:
mkdir -p /mongoDB/shard/s0
mkdir -p /mongoDB/shard/s1
mkdir -p /mongoDB/shard/s2
mkdir -p /mongoDB/shard/s3
创建分片服务器日志目录:建立4个日志目录
mkdir -p /mongoDB/shard/log/s0
mkdir -p /mongoDB/shard/log/s1
mkdir -p /mongoDB/shard/log/s2
mkdir -p /mongoDB/shard/log/s3
启动分片进程,启动分片数据库
mongod --port 27020 --dbpath=/mongoDB/shard/s0 --logpath=/mongoDB/shard/log/s0/s0.log --logappend --fork
mongod --port 27021 --dbpath=/mongoDB/shard/s1 --logpath=/mongoDB/shard/log/s1/s1.log --logappend --fork
mongod --port 27022 --dbpath=/mongoDB/shard/s2 --logpath=/mongoDB/shard/log/s2/s2.log --logappend --fork
mongod --port 27023 --dbpath=/mongoDB/shard/s3 --logpath=/mongoDB/shard/log/s3/s3.log --logappend --fork
创建配置目录
mkdir -p /mongoDB/shard/config
启动配置服务器,可以启动三台,保证安全
mongod --port 27100 --dbpath=/mongoDB/shard/config --logpath=/mongoDB/shard/log/config.log --logappend --fork
启动路由,3.4以上版本必须是复制集模式,否则报错,所以本例子必须做成3.2版本
mongos --port 40000 --configdb localhost:27100 --fork --logpath=/mongoDB/shard/log/route.log
mongos --port 40001 --configdb localhost:27100 --fork --logpath=/mongoDB/shard/log/route1.log
mongos --port 40000 --configdb localhost:27100 --fork --logpath=/www/mongoDB/shard/log/route.log --chunkSize 500
登陆mongos
mongo --port 40000
use admin
下面命令等同
sh.addShard("localhost:27020")
sh.addShard("localhost:27021")
sh.addShard("localhost:27022")
sh.addShard("localhost:27023")
db.runCommand({ addshard:"localhost:27020" })
db.runCommand({ addshard:"localhost:27021" })
db.runCommand({ addshard:"localhost:27022" })
db.runCommand({ addshard:"localhost:27023" })
db.runCommand({"enablesharding":"test_shard" }) #设置分片存储的数据库
db.runCommand({"enablesharding":"test" }) #设置分片存储的数据库
做哈希分片,必须先建立哈希索引
db.test.createIndex({"_id": 1});
db.test.createIndex({"_id": "hashed"});
哈希分片
db.runCommand({ shardcollection: "test.test", key: {"_id": "hashed"}});
db.runCommand({ shardcollection: "test.log", key: { id:1,time:1}})
测试上线
for(var i=0;i<50000;i++){ db.test.insert({name:'test'+i}) };
1、检查库是否为分片,进入mongos,可以看到有几个分片
use admin
sh.status();
db.printShardingStatus();
mongs刷新过时信息
db.adminCommand({"flushRouterConfig":1})
分片信息得查询和管理,登陆mongos或者配置集都可以
use config
db.shards.find()
迁移分片,从2021端口迁移到端口2023
停止2021、2023分片
pgrep mongo -a
kill 9495 9496
迁移分片数据,把2021的数据全部拷贝到2023
cp -r /mongoDB/shard/s1/* /mongoDB/shard/s3
修改配置库(如果多个,需要都修改),原来2021修改为2023
db.shards.find();
{ "_id" : "shard0000", "host" : "localhost:27020" }
{ "_id" : "shard0001", "host" : "localhost:27021" }
{ "_id" : "shard0002", "host" : "localhost:27022" }
db.shards.update({"_id":"shard0001"},{$set:{"host" : "localhost:27023"}})
特别注意,复制集,新增加节点会变other,在主配置服务器节点上必须要做下面命令:在添加和移除的时候,只能在PRIMARY节点类型上操作
use admin
rs.status()
rs.add("10.20.222.63:10001")
rs.remove("10.20.0.44:10001")
启动2023服务器,原来没数据,现在应该有一条,检查没问题
mongod --port 27023 --dbpath=/mongoDB/shard/s3 --logpath=/mongoDB/shard/log/s3.log --logappend --fork
mongo --port 27023
use test_shard
db.test.find();
启动配置服务器和mongos
mongod --port 27100 --dbpath=/mongoDB/shard/config --logpath=/mongoDB/shard/log/config.log --logappend --fork
mongos --port 40000 --configdb localhost:27100 --fork --logpath=/mongoDB/shard/log/route.log
检查数据是否存在
mongo --port 40000
db.test.find({"_id" : ObjectId("5ac9d47b8d6a9994ad2fd956")});
运行,mongs会显示 "msg" : "isdbgrid"
db.isMaster()