# 连接
mongo 172.16.206.34:27000
use admin
# config变量
config = {_id:"shard1",members:[{_id:0,host:"172.16.206.34:27000"},{_id:1,host:"172.16.206.36:27000"},{_id:2,host:"172.16.206.47:27000",arbiterOnly:true}]}
# 初始化副本集
rs.initiate(config)
# 查看分区状态
rs.status()
------------------------------------------------------------------
# 连接
mongo 172.16.206.34:25000
use admin
# config变量
config = {_id:"shard2",members:[{_id:0,host:"172.16.206.34:25000"},{_id:1,host:"172.16.206.36:25000",arbiterOnly:true},{_id:2,host:"172.16.206.47:25000"}]}
# 初始化副本集
rs.initiate(config)
# 查看分区状态
rs.status()
----------------------------------------------------------------------------------------
# 连接
mongo 172.16.206.34:35000
use admin
# config变量
config = {_id:"shard3",members:[{_id:0,host:"172.16.206.34:35000"},{_id:1,host:"172.16.206.36:35000",arbiterOnly:true},{_id:2,host:"172.16.206.47:35000"}]}
----------------------------------------------------------------
# 初始化副本集
rs.initiate(config)
# 查看分区状态
rs.status()
#config server 服务
# 连接
mongo 172.16.206.34:20000
config = { _id: "configs", members: [ {_id : 0, host : "172.16.206.34:20000"},{_id : 1, host : "172.16.206.36:20000"},{_id : 2, host : "172.16.206.47:20000"}] }
# 查看分区状态
rs.status()
mongo 172.16.206.34:30000
sh.addShard("shard1/172.16.206.34:27000,172.16.206.36:27000,172.16.206.47:27000")
sh.addShard("shard2/172.16.206.34:25000,172.16.206.36:25000,172.16.206.47:25000")
sh.addShard("shard3/172.16.206.34:35000,172.16.206.36:35000,172.16.206.47:35000")
#查看主分片
rs.status()
进入主分片里移除从分片
#移除
rs.remove("172.16.206.34:27000");
#更改权重,后再把主降为从 #注意[ ]按照顺序从0、1、2开始
cfg= rs.conf();
cfg.members[1].priority=2;
rs.reconfig(cfg);
#备份
mongodump -h 172.16.101.179 -d data -o /var/data/
#还原
mongorestore --port 30000 --host 172.16.206.34 --drop /var/data/
db.runCommand( { enablesharding : "data" } )
#导入和导出:
mongoexport -h 172.16.206.34:30000 -d data -c claimBinding -o claimBinding.json
mongoimport -h 172.16.206.34:30000 --collection claimBindingv3 --db data --file /opt/claimBindingv3.json
可以看到对于未启动分片的数据库,可以看出我们随便创建的数据库的集合,他可以随机分布在不同的片上,mongo用这种机制实现主的平均分布,实现数据库 的均衡。
扩展一下,对于分片通常实验范围分片和hash分片,分片具体看业务情况的。而且分片以后是不能直接更改的,除非删除数据库或者collection,停业务实验mongodump重新导数据,这个代价太大,所以分片时候要谨慎。
范围分片:
1,适合普通范围查询,可以优化到让热查询定位到某个片,数据集中取出避免数据分散而走网络取数据
2,最好给分片键建立序列,实践证明依据序列查找比全片所有chunk查找快的多
3,缺点在于,如果shardkey有明显递增(或者递减)趋势,则新插入的文档多会分布到同一个chunk,无法扩展写的能力
hash分片:
1,适合大规模插入,由于范围平均可以充分利用整个集群的性能
2,适合高并发,集群的各个集群平均分担压力,
3,不能高效的服务范围查询,所有的范围查询要分发到后端所有的Shard才能找出满足条件的文档
#查询集合claimBinding的数量
db.getCollection('claimBinding').find({"createDate":/2017-07-03/}).count()
#删除集合claimBinding的数量
db.getCollection('claimBinding').remove({"createDate":/2017-07-03/})