本教程基于Ubuntu 14.04.2 LTS \n \l和mongoDB 3.0, 配置了3个 Config Servers(在产品环境中被要求),2个Query Router查询分发(最少1个必要),和3个shard Server(最少2个)。
注意确保在所有上述Server上已经安装了MongoDB 3.0以上版本,否则首先安装MongoDB,要在Ubuntu上安装MongoDB可以按照这个教程,《升级MongoDB到3.0.2并启用wiredTiger存储引擎 基于ubuntu 14.04》,http://www.askmaclean.com/archives/upgrade-to-mongodb-302-wiredtiger.html
dbDao 百度贴吧:http://tieba.baidu.com/dbdao
MongoDB技术学习QQ群: 421431253
以下是HOSTNAME 和 IP 列表,注意本文的网络拓扑按照如下配置,如果与之不同则需要相应修改
10.132.24.62 config0.dbdao.com 10.132.24.60 config1.dbdao.com 10.132.24.61 config2.dbdao.com 10.132.24.59 query0.dbdao.com 10.132.24.63 query1.dbdao.com 10.132.24.64 shard0.dbdao.com 10.132.24.65 shard1.dbdao.com 10.132.24.67 shard2.dbdao.com
第一步配置config server
需要在配置query router和shard server前配置3个 mongoDB config server:
以下需要在3个 mongoDB config server上均需以root用户执行
以下在三个config server上配置目录 mkdir -p /m01/mongo-metadata chown mongodb:mongodb /m01/mongo-metadata 在三个config server上分别执行,注意 IP要一一对应 config0: mongod --configsvr --dbpath /m01/mongo-metadata --bind_ip 10.132.24.62 --port 35001 config1: mongod --configsvr --dbpath /m01/mongo-metadata --bind_ip 10.132.24.60 --port 35001 config2: mongod --configsvr --dbpath /m01/mongo-metadata --bind_ip 10.132.24.61 --port 35001
第二步配置Query Router Instances
分别在2个Query Router服务器上执行下列的命令
确保2个Query Router服务器上的mongd服务已经关闭 su - root service mongod stop 启动mongos 在2个Query Router服务器上执行下列命令 su - root mongos --configdb config0.dbdao.com:35001,config1.dbdao.com:35001,config2.dbdao.com:35001
第三步 增加shard到集群
注意这里没有配置Replication Set RS ,如果需要配置replica-set可以关注maclean今后的文章。
以root用户在三个sharding server上执行下面的命令:
service mongod stop mkdir -p /m01/mongo-data chown mongodb:mongodb /m01/mongo-data 以下是针对不同server分别执行 shard0: mongod --dbpath /m01/mongo-data --bind_ip 10.132.24.64 --port 35001 --storageEngine wiredTiger shard1: mongod --dbpath /m01/mongo-data --bind_ip 10.132.24.65 --port 35001 --storageEngine wiredTiger shard2: mongod --dbpath /m01/mongo-data --bind_ip 10.132.24.67 --port 35001 --storageEngine wiredTiger
之后登陆query router来增加shard
sh.addShard( "shard0.dbdao.com:35001" ) sh.addShard( "shard1.dbdao.com:35001" ) sh.addShard( "shard2.dbdao.com:35001" )
之后可以在DB级别启用sharding
mongo query0.dbdao.com:27017
use test_db
db
show dbs
sh.enableSharding("test_db")
mongos> db.databases.find()
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test_db", "partitioned" : true, "primary" : "shard0000" }
在collection级别启用sharding
mongo query0.dbdao.com:27017
use test_db
db.test_collection.ensureIndex( { _id : "hashed" } )
mongos> db.test_collection.ensureIndex( { _id : "hashed" } )
{
"raw" : {
"shard0.dbdao.com:35001" : {
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
},
"ok" : 1
}
mongos> sh.shardCollection("test_db.test_collection", { "_id": "hashed" } )
{ "collectionsharded" : "test_db.test_collection", "ok" : 1 }
mongos>
mongos> use test_db
switched to db test_db
mongos> for (var i = 1; i <= 500; i++) db.test_collection.insert( { x : i } ) WriteResult({ "nInserted" : 1 }) mongos> db.test_collection.find();
{ "_id" : ObjectId("554b296c160953211da4b523"), "x" : 2 }
{ "_id" : ObjectId("554b296c160953211da4b522"), "x" : 1 }
{ "_id" : ObjectId("554b296c160953211da4b524"), "x" : 3 }
{ "_id" : ObjectId("554b296c160953211da4b526"), "x" : 5 }
{ "_id" : ObjectId("554b296c160953211da4b529"), "x" : 8 }
{ "_id" : ObjectId("554b296c160953211da4b525"), "x" : 4 }
{ "_id" : ObjectId("554b296c160953211da4b52c"), "x" : 11 }
{ "_id" : ObjectId("554b296c160953211da4b52b"), "x" : 10 }
{ "_id" : ObjectId("554b296c160953211da4b527"), "x" : 6 }
{ "_id" : ObjectId("554b296c160953211da4b52d"), "x" : 12 }
{ "_id" : ObjectId("554b296c160953211da4b52f"), "x" : 14 }
{ "_id" : ObjectId("554b296c160953211da4b528"), "x" : 7 }
{ "_id" : ObjectId("554b296c160953211da4b52e"), "x" : 13 }
{ "_id" : ObjectId("554b296c160953211da4b530"), "x" : 15 }
{ "_id" : ObjectId("554b296c160953211da4b52a"), "x" : 9 }
{ "_id" : ObjectId("554b296c160953211da4b531"), "x" : 16 }
{ "_id" : ObjectId("554b296c160953211da4b532"), "x" : 17 }
{ "_id" : ObjectId("554b296c160953211da4b533"), "x" : 18 }
{ "_id" : ObjectId("554b296c160953211da4b53b"), "x" : 26 }
{ "_id" : ObjectId("554b296c160953211da4b534"), "x" : 19 }
Type "it" for more
mongos> db.test_collection.count();
500
mongos> sh.status();
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("554b241f4df23a46a60f6a9c")
}
shards:
{ "_id" : "shard0000", "host" : "shard0.dbdao.com:35001" }
{ "_id" : "shard0001", "host" : "shard1.dbdao.com:35001" }
{ "_id" : "shard0002", "host" : "shard2.dbdao.com:35001" }
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
2 : Success
1 : Failed with error 'could not acquire collection lock for test_db.test_collection to migrate chunk [{ : MinKey },{ : MaxKey }) :: caused by :: Lock for migrating chunk [{ : MinKey }, { : MaxKey }) in test_db.test_collection is taken.', from shard0000 to shard0002
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test_db", "partitioned" : true, "primary" : "shard0000" }
test_db.test_collection
shard key: { "_id" : "hashed" }
chunks:
shard0000 2
shard0001 2
shard0002 2
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : NumberLong("-6148914691236517204") } on : shard0000 Timestamp(3, 2)
{ "_id" : NumberLong("-6148914691236517204") } -->> { "_id" : NumberLong("-3074457345618258602") } on : shard0000 Timestamp(3, 3)
{ "_id" : NumberLong("-3074457345618258602") } -->> { "_id" : NumberLong(0) } on : shard0001 Timestamp(3, 4)
{ "_id" : NumberLong(0) } -->> { "_id" : NumberLong("3074457345618258602") } on : shard0001 Timestamp(3, 5)
{ "_id" : NumberLong("3074457345618258602") } -->> { "_id" : NumberLong("6148914691236517204") } on : shard0002 Timestamp(3, 6)
{ "_id" : NumberLong("6148914691236517204") } -->> { "_id" : { "$maxKey" : 1 } } on : shard0002 Timestamp(3, 7)
> use test_db;
switched to db test_db
> db.serverStatus();
{
"host" : "shard1.dbdao.com:35001",
> db.test_collection.count();
171
> db.serverStatus();
{
"host" : "shard0.dbdao.com:35001",
> use test_db;
switched to db test_db
>
> db.test_collection.count();
169
> db.serverStatus();
{
"host" : "shard2.dbdao.com:35001",
> use test_db;
switched to db test_db
> db.test_collection.count();
160
以上三个sharding server的数据分别为 171、169、160 , 正好为总数500.


