六、配置shard集群
1.连接一台路由
- [root@mongo01 sh]# mongo 192.168.8.30:30000/admin
- MongoDB shell version: 2.0.5
- connecting to: 192.168.8.30:30000/admin
- mongos>
2.加入shards
- mongos> db.runCommand({ addshard : "shard1/192.168.8.30:27021,192.168.8.31:27021,192.168.8.32:27021",name:"shard1",maxSize:20480})
- { "shardAdded" : "shard1", "ok" : 1 }
- mongos> db.runCommand({ addshard : "shard2/192.168.8.30:27022,192.168.8.31:27022,192.168.8.32:27022",name:"shard2",maxSize:20480})
- { "shardAdded" : "shard2", "ok" : 1 }
PS:
分片操作必须在 admin 库下操作
如果只启动206和207服务器的路由!因此可不用把208服务器加进来!
可选参数说明:
Name:用于指定每个shard的名字,不指定的话系统将自动分配
maxSize:指定各个shard可使用的最大磁盘空间,单位 MegaBytes
3.列出加入的shards
- mongos> db.runCommand( { listshards : 1 } );
- {
- "shards" : [
- {
- "_id" : "shard1",
- "host" : "shard1/192.168.8.30:27021,192.168.8.31:27021,192.168.8.32:27021",
- "maxSize" : NumberLong(20480)
- },
- {
- "_id" : "shard2",
- "host" : "shard2/192.168.8.30:27022,192.168.8.31:27022,192.168.8.32:27022",
- "maxSize" : NumberLong(20480)
- }
- ],
- "ok" : 1
- }
PS: 列出了以上二个我加的shards(shard1和shard2),表示shards已经配置成功!!
如果206那台机器挂了,其它两个节点中某个会成为主节点,mongos会自动连接到主节点!
- mongos> db.runCommand({ismaster:1});
- {
- "ismaster" : true,
- "msg" : "isdbgrid",
- "maxBsonObjectSize" : 16777216,
- "ok" : 1
- }
- mongos> db.runCommand( { listshards : 1 } );
- { "ok" : 0, "errmsg" : "access denied - use admin db" }
- mongos> use admin
- switched to db admin
- mongos> db.runCommand( { listshards : 1 } );
- {
- "shards" : [
- {
- "_id" : "s1",
- "host" : "shard1/192.168.8.30:27021,192.168.8.31:27021"
- },
- {
- "_id" : "s2",
- "host" : "shard2/192.168.8.30:27022,192.168.8.31:27022"
- }
- ],
- "ok" : 1
- }
- mongos>
七.添加分片
1.激活数据库分片
db.runCommand( { enablesharding : "<dbname>" } );
如:db.runCommand( { enablesharding : "" } );
插入测试数据:
- mongos> use nosql
- switched to db nosql
- mongos> for(var i=0;i<100;i++)db.fans.insert({uid:i,uname:'nosqlfans'+i});
激活数据库:
- mongos> use admin
- switched to db admin
- mongos> db.runCommand( { enablesharding : "nosql" } );
- { "ok" : 1 }
通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的collection 将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对 collection作些操作!
2.添加索引
必须加索引,不然不能对collections分片!
- mongos> use nosql
- switched to db nosql
- mongos> db.fans.find()
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad081"), "uid" : 0, "uname" : "nosqlfans0" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad082"), "uid" : 1, "uname" : "nosqlfans1" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad083"), "uid" : 2, "uname" : "nosqlfans2" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad084"), "uid" : 3, "uname" : "nosqlfans3" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad085"), "uid" : 4, "uname" : "nosqlfans4" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad086"), "uid" : 5, "uname" : "nosqlfans5" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad087"), "uid" : 6, "uname" : "nosqlfans6" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad088"), "uid" : 7, "uname" : "nosqlfans7" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad089"), "uid" : 8, "uname" : "nosqlfans8" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad08a"), "uid" : 9, "uname" : "nosqlfans9" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad08b"), "uid" : 10, "uname" : "nosqlfans10" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad08c"), "uid" : 11, "uname" : "nosqlfans11" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad08d"), "uid" : 12, "uname" : "nosqlfans12" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad08e"), "uid" : 13, "uname" : "nosqlfans13" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad08f"), "uid" : 14, "uname" : "nosqlfans14" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad090"), "uid" : 15, "uname" : "nosqlfans15" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad091"), "uid" : 16, "uname" : "nosqlfans16" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad092"), "uid" : 17, "uname" : "nosqlfans17" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad093"), "uid" : 18, "uname" : "nosqlfans18" }
- { "_id" : ObjectId("4ff2ae6816df1d1b33bad094"), "uid" : 19, "uname" : "nosqlfans19" }
- has more
- mongos> db.fans.ensureIndex({"uid":1})
- mongos> db.fans.find({uid:10}).explain()
- {
- "cursor" : "BtreeCursor uid_1",
- "nscanned" : 1,
- "nscannedObjects" : 1,
- "n" : 1,
- "millis" : 25,
- "nYields" : 0,
- "nChunkSkips" : 0,
- "isMultiKey" : false,
- "indexOnly" : false,
- "indexBounds" : {
- "uid" : [
- [
- 10,
- 10
- ]
- ]
- }
- }
3.Collecton分片
要使单个collection也分片存储,需要给collection指定一个分片key,通过以下命令操作:
db.runCommand( { shardcollection : "",key : });
- mongos> use admin
- switched to db admin
- mongos> db.runCommand({shardcollection : "nosql.fans",key : {uid:1}})
- { "collectionsharded" : "nosql.fans", "ok" : 1 }
PS:
1). 操作必须切换到admin数据库下
2). 分片的collection系统要创建好索引
3). 分片的collection只能有一个在分片key上的唯一索引,其它唯一索引不被允许
4.查看分片状态
些时分片没有发生变化!
- mongos> use nosql
- mongos> db.fans.stats()
- {
- "sharded" : true,
- "flags" : 1,
- "ns" : "nosql.fans",
- "count" : 100,
- "numExtents" : 2,
- "size" : 5968,
- "storageSize" : 20480,
- "totalIndexSize" : 24528,
- "indexSizes" : {
- "_id_" : 8176,
- "uid0_1" : 8176,
- "uid_1" : 8176
- },
- "avgObjSize" : 59.68,
- "nindexes" : 3,
- "nchunks" : 1,
- "shards" : {
- "shard1" : {
- "ns" : "nosql.test",
- "count" : 100,
- "size" : 5968,
- "avgObjSize" : 59.68,
- "storageSize" : 20480,
- "numExtents" : 2,
- "nindexes" : 3,
- "lastExtentSize" : 16384,
- "paddingFactor" : 1,
- "flags" : 1,
- "totalIndexSize" : 24528,
- "indexSizes" : {
- "_id_" : 8176,
- "uid0_1" : 8176,
- "uid_1" : 8176
- },
- "ok" : 1
- }
- },
- "ok" : 1
- }
- mongos>
再插入比较多的数据:
- mongos> use nosql
- switched to db nosql
- mongos> for(var i=200;i<200003;i++)db.fans.save({uid:i,uname:'nosqlfans'+i});
- mongos> db.fans.stats()
- {
- "sharded" : true,
- "flags" : 1,
- "ns" : "nosql.fans",
- "count" : 200002,
- "numExtents" : 12,
- "size" : 12760184,
- "storageSize" : 22646784,
- "totalIndexSize" : 12116832,
- "indexSizes" : {
- "_id_" : 6508096,
- "uid_1" : 5608736
- },
- "avgObjSize" : 63.80028199718003,
- "nindexes" : 2,
- "nchunks" : 10,
- "shards" : {
- "shard1" : {
- "ns" : "nosql.fans",
- "count" : 9554,
- "size" : 573260,
- "avgObjSize" : 60.00209336403601,
- "storageSize" : 1396736,
- "numExtents" : 5,
- "nindexes" : 2,
- "lastExtentSize" : 1048576,
- "paddingFactor" : 1,
- "flags" : 1,
- "totalIndexSize" : 596848,
- "indexSizes" : {
- "_id_" : 318864,
- "uid_1" : 277984
- },
- "ok" : 1
- },
- "shard2" : {
- "ns" : "nosql.fans",
- "count" : 190448,
- "size" : 12186924,
- "avgObjSize" : 63.990821641602956,
- "storageSize" : 21250048,
- "numExtents" : 7,
- "nindexes" : 2,
- "lastExtentSize" : 10067968,
- "paddingFactor" : 1,
- "flags" : 1,
- "totalIndexSize" : 11519984,
- "indexSizes" : {
- "_id_" : 6189232,
- "uid_1" : 5330752
- },
- "ok" : 1
- }
- },
- "ok" : 1
- }
- mongos>
当再次插入大量数据时。。自动分片处理了!!所以OK!!!