MongoDB配置Sharding (负载均衡)

Mongod DB中有Sharding(分片)和Replication(副本)两个功能。

前者主要是将数据水平分割到各个结点上,达到负载均衡的目的。

后者用于故障恢复。即一般一个Sharding有若干个Replication。

本文只讨论Sharding的情况,因为我们的环境机器本来就不够,不会拿来做Replication的。

配置Sharding有如下三个要素

1、1~1000个Sharding。

2、1~3个mongo config服务器。

3、1~n个mongo routing服务器。

下面讨论配置

环境,我们用两个机器A和B,配置两个Shards。

1、下载

wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.5.tgz
tar -xzvf ./mongodb-linux-x86_64-2.0.5.tgz

2、执行mongod

在两个机器上分别启动mongod,如下:

#创建数据文件夹
mkdir data

#启动, 后台服务模式, pid文件记录, 日志记录, 数据./data0
./bin/mongod --fork --logpath=`pwd`/mongod.log --pidfilepath=`pwd`/mongod.pid --shardsvr --dbpath=`pwd`/data/

#杀死进程,要用信号2!
kill -2 `cat ./mongod.pid`

至此,A、B机器上启动了两个mongod进程,端口为27018

3、启动一个mongod config server

测试环境可以只有一个config server,线上环境建议有3个。我们就用第一台机器吧。

# 创建config的数据目录
mkdir config_data

# 启动mongod config进程
./bin/mongod --fork --logpath=`pwd`/mongoc.log --pidfilepath=`pwd`/mongoc.pid --dbpath=`pwd`/config_data --configsvr

至此,A机器上启动了mongod(config)进程,端口27019

4、启动一个mongos Router

mongos的--configdb参数如下:

--configdb arg        1 or 3 comma separated config servers

要指定上面mongod(config)进程,由于我们只有1个,写一个就好。

#启动mongos
./bin/mongos --fork --pidfilepath=`pwd`/mongos.pid --logpath=`pwd`/mongos.log --configdb=172.22.0.12:27019 --port 11000

5、配置Shard

刚才我们只是将各自部分启动起来,现在需要在中央控制中,将Shards对应到具体的mongod。

首先连接任意一个mongos(我们只有一个的说):

# 连接先前配置的mongos
./bin/mongo AA.AA.AA.AA:11000/admin

# 先选择admin数据库
MongoDB shell version: 2.0.5
connecting to: 172.22.0.12:11000/admin
mongos> db
admin
mongos> 

# 将A B C的mongod进程分别添加一次Shard
mongos> db.runCommand( { addshard : "A.A.A.A:13000]", name:"shard_A" } );
{ "shardAdded" : "shard0000", "ok" : 1 }

mongos> db.runCommand( { addshard : "B.B.B.B:13000]", name:"shard_B" } );
{ "shardAdded" : "shard0000", "ok" : 1 }

mongos> db.runCommand( { addshard : "C.C.C.C:13000]", name:"shard_C" } );
{ "shardAdded" : "shard0000", "ok" : 1 }

# 列出、验证Shards
mongos> db.runCommand( { listshards : 1 } );
{
	"shards" : [
		{
			"_id" : "shard0000",
			"host" : "172.22.0.12:13000"
		},
		{
			"_id" : "shard0001",
			"host" : "172.22.0.16:13000"
		}
	],
	"ok" : 1
}

6、启用Shards

必须在对应的DB/Coll上启用Shards,数据负载均衡才能生效!否则,只会存在一个Shards上!

注意在Colleciton启用Shards时候,还需要一个key做为划分依据。

关于划分key的选择:

1、最好是在插入中能包含的字段(否则会把插入发配到每个Shard上,速度很慢)。

2、尽量随机化。

# 给db启用Shards
mongos> db.runCommand( { enablesharding : "test" } );
{ "ok" : 1 }

# 给Coll启用Shards, 注意需要一个key做为划分依据
mongos> db.runCommand({shardcollection:"test.people", key: {name:1}, unique : true })
{ "collectionsharded" : "test.people", "ok" : 1 }

7、创建DB、Coll

我们创建db:db

再创建一个Coll: people

由于都是lazy-make,所以我们直接创建数据即可

# Create testdb
./bin/mongo 172.22.0.12:11000/db
MongoDB shell version: 2.0.5
connecting to: 172.22.0.12:11000/db
mongos> db
db

插入数据

mongos> for (var i = 1; i <= 200000; i++) db.people.save({name:"fly_people",sex:"female",age:25});

mongos> for (var i = 1; i <= 20000000; i++) db.people.save({name:"houxuefeng",sex:"male",age:30});

mongos> db.people.stats()
{
        "sharded" : true,
        "ns" : "test.people",
        "count" : 462008,
        "size" : 33264600,
        "avgObjSize" : 72.00005194715243,
        "storageSize" : 902522624,
        "nindexes" : 2,
        "nchunks" : 4,
        "shards" : {
                "shard0000" : {
                        "ns" : "test.people",
                        "count" : 402006,
                        "size" : 28944448,
                        "avgObjSize" : 72.00003980040098,
                        "storageSize" : 891340544,
                        "numExtents" : 22,
                        "nindexes" : 2,
                        "lastExtentSize" : 155079936,
                        "paddingFactor" : 1,
                        "flags" : 1,
                        "totalIndexSize" : 58966016,
                        "indexSizes" : {
                                "_id_" : 18694144,
                                "name_1" : 40271872
                        },
                        "ok" : 1
                },
                "shard0001" : {
                        "ns" : "test.people",
                        "count" : 60002,
                        "size" : 4320152,
                        "avgObjSize" : 72.00013332888904,
                        "storageSize" : 11182080,
                        "numExtents" : 6,
                        "nindexes" : 2,
                        "lastExtentSize" : 8388608,
                        "paddingFactor" : 1,
                        "flags" : 1,
                        "totalIndexSize" : 5275648,
                        "indexSizes" : {
                                "_id_" : 2498560,
                                "name_1" : 2777088
                        },
                        "ok" : 1
                }
        },
        "ok" : 1
}

备注:数据到达一定规模才会开始进行负载均衡!

参考文章1:《MongoDB auto shard配置说明》

参考文章2:《Configuring Sharding》

8、其他命令:

列出db

mongos> show dbs
config  0.1875GB

列出collection

show collections

切换数据库

use dbname

列出collection详情

db.printCollectionStats()

删除Collection

db.foo.drop()

创建索引

db.doc.ensureIndex({id:1}, {unique:true, dropDups:true})

更多DB级别的可以参考:http://www.mongodb.org/display/DOCS/DBA+Operations+from+the+Shell

One thought on “MongoDB配置Sharding (负载均衡)

  1. wutianzhi

    您好,您的文章里说mongodb数据库负载均衡,当数据量到一定规模才会进行负载均衡,请问这个数据量是多大啊?哪里有限制?在mongdb里怎么配置啊

    谢谢

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *