MongoDB版本:3.2.9 节点:192.168.20.70/71/72 架构说明: 70:包含mongos、config server(master)、3个shards(master) 71:包含config server(slave)、3个shards(slave) 72:包含3个shards(arbiter) --网上很多资料说config server必须是奇数个,但至少在本次搭建的3.2.9版本中2个也是可以的。
--master的mongo.conf(192.168.20.70) directoryperdb=true replSet=config configsvr=true logpath=/home/mongod/config_master/mongod.log logappend=true fork=true port=27018 dbpath=/home/mongod/config_master pidfilepath=/home/mongod/config_master/mongod.pid
--slave的mongo.conf(192.168.20.71) directoryperdb=true replSet=config configsvr=true logpath=/home/mongod/config_slave/mongod.log logappend=true fork=true port=27018 dbpath=/home/mongod/config_slave pidfilepath=/home/mongod/config_slave/mongod.pid
mongod -f /home/mongod/config_master/mongo.conf mongod -f /home/mongod/config_slave/mongo.conf use admin cfg={_id:"config",members:[{_id:0,host:'192.168.20.70:27018',priority:2}, {_id:1,host:'192.168.20.71:27018',priority:1}]}; rs.initiate(cfg)
--shard1的master、slave、arbiter的配置文件(分别在70、71、72上) --master: directoryperdb=true replSet=shard1 shardsvr = true logpath=/home/mongod/shard1_master/mongod.log logappend=true fork=true port=27017 dbpath=/home/mongod/shard1_master pidfilepath=/home/mongod/shard1_master/mongod.pid
--slave: directoryperdb=true replSet=shard1 shardsvr = true logpath=/home/mongod/shard1_slave/mongod.log logappend=true fork=true port=27017 dbpath=/home/mongod/shard1_slave pidfilepath=/home/mongod/shard1_slave/mongod.pid
--arbiter: directoryperdb=true replSet=shard1 shardsvr = true logpath=/home/mongod/shard1_arbiter/mongod.log logappend=true fork=true port=27017 dbpath=/home/mongod/shard1_arbiter pidfilepath=/home/mongod/shard1_arbiter/mongod.pid
use admin cfg={_id:"shard1",members:[{_id:0,host:'192.168.20.70:27017',priority:2}, {_id:1,host:'192.168.20.71:27017',priority:1},{_id:2,host:'192.168.20.72:27017',arbiterOnly:true}]}; rs.initiate(cfg)
--注意:dbpath、directoryperdb等参数是不能出现在mongos的配置文件中的,简单起见只配置如下参数即可: configdb = config/192.168.20.70:27018,192.168.20.71:27018 --这里的config是config server副本集的名称,后接config server的2个副本集节点。 logpath=/home/mongod/mongos/mongod.log logappend=true fork=true port=27019 pidfilepath=/home/mongod/mongos/mongod.pid
mongos -f /home/mongod/mongos/mongo.conf
登录mongos服务器: mongo --port=27019 use admin sh.addShard("shard1/192.168.20.70:27017,192.168.20.71:27017,192.168.20.72:27017"); sh.addShard("shard2/192.168.20.70:27020,192.168.20.71:27020,192.168.20.72:27020"); sh.addShard("shard3/192.168.20.70:27021,192.168.20.71:27021,192.168.20.72:27021"); 然后在mongos上为具体的数据库配置sharding: sh.enableSharding("test") --允许test数据库进行sharding sh.shardCollection("test.t",{id:"hashed"}) --对test.t集合以id列为shard key进行hashed sharding 通过db.t.getIndexes()可以看到自动为id列创建了索引。
mongo --port=27019 --27019是mongos的端口号 use test for(i=1,i<=1000,i++){db.t.insert({id:i,name:"Leo"})}
sh.shardCollection("test.t",{id:1}) --对test.t集合以id列为shard key进行ranged sharding
for(i=1;i<=1000;i++){db.t.insert({id:i,name:"Leo"})}
--sh.status()的相关结果: test.t shard key: { "id" : 1 } unique: false balancing: true chunks: shard1 1 shard2 1 shard3 1 { "id" : { "$minKey" : 1 } } -->> { "id" : 2 } on : shard1 Timestamp(2, 0) { "id" : 2 } -->> { "id" : 22 } on : shard3 Timestamp(3, 0) { "id" : 22 } -->> { "id" : { "$maxKey" : 1 } } on : shard2 Timestamp(3, 1) 从sh.status的结果可以看到id为[1,2)的被分配至shard1,[2,22)被分配至shard2,其他的全部被分配至shard3,分布极其不均匀。
sh.splitAt("test.t",{id:500}) sh.splitAt("test.t",{id:1000}) sh.splitAt("test.t",{id:1500}) sh.splitAt("test.t",{id:2000}) for(i=1;i<=3000;i++){db.t.insert({id:i,name:"Leo"})} --sh.status()显示的分片结果如下: test.t shard key: { "id" : 1 } unique: false balancing: true chunks: shard1 2 --shard2上有2个chunks,分别是[1500,2000]和[2000,$maxKey) shard2 2 shard3 1 { "id" : { "$minKey" : 1 } } -->> { "id" : 500 } on : shard1 Timestamp(2, 0) { "id" : 500 } -->> { "id" : 1000 } on : shard3 Timestamp(3, 0) { "id" : 1000 } -->> { "id" : 1500 } on : shard1 Timestamp(4, 0) { "id" : 1500 } -->> { "id" : 2000 } on : shard2 Timestamp(4, 1) { "id" : 2000 } -->> { "id" : { "$maxKey" : 1 } } on : shard2 Timestamp(3, 3)
directoryperdb=true shardsvr = true logpath=/home/mongod/shard4/mongod.log logappend=true fork=true port=27022 dbpath=/home/mongod/shard4 pidfilepath=/home/mongod/shard4/mongod.pid
sh.addShard("192.168.20.70:27022")
test.t shard key: { "id" : 1 } unique: false balancing: true chunks: shard1 1 shard0004 1 --mongos自动将新的单实例mongoDB的chunk命名为shard0004 shard2 2 shard3 1 { "id" : { "$minKey" : 1 } } -->> { "id" : 500 } on : shard0004 Timestamp(5, 0) { "id" : 500 } -->> { "id" : 1000 } on : shard3 Timestamp(3, 0) { "id" : 1000 } -->> { "id" : 1500 } on : shard1 Timestamp(5, 1) { "id" : 1500 } -->> { "id" : 2000 } on : shard2 Timestamp(4, 1) { "id" : 2000 } -->> { "id" : { "$maxKey" : 1 } } on : shard2 Timestamp(3, 3) --可以看到balancer自动将chunk进行了迁移,迁移机制为mongodb内部决定,原理参见第八部分。
mongo --port=27019 --连接到mongos use config db.settings.update( { _id: "balancer" }, { $set: { activeWindow : { start : "02:00", stop : "06:00" } } }, { upsert: true } ) Balancer会在服务器local time的凌晨2-6点才执行chunk的balance。
sh.setBalancerState("false") 或者: sh.stopBalancer()
PRIMARY> db.isMaster() { "hosts" : [ "host1:9003", "host2:9003", "host3:9003" ], "setName" : "mongo-9003", "setVersion" : 9, "ismaster" : false, // primary 的 ismaster 为 false??? "secondary" : true, "primary" : "host1:9003", "me" : "host1:9003", "electionId" : ObjectId("57c7e62d218e9216c70aa3cf"), "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2016-09-01T12:29:27.113Z"), "maxWireVersion" : 4, "minWireVersion" : 0, "ok" : 1 }
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
MongoDB中数据的替换方法实现类Replace()函数功能详解
理解Redis持久化,RDB持久化和AOF持久化的不同处理方式
网友评论