MongoDB的分布式分片集群(sharding cluster)配置
Sharding cluster介绍
这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统。
要构建一个 MongoDB Sharding Cluster,需要三种角色:
Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障.
Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。
Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
实验环境:
192.168.3.206 #IP地址
mongod shard11:27017 #27017端口为分片服务器11
mongod shard21:27018 #27018端口为分片服务器21
mongod config01:20000 #20000端口为配置服务器01
mongos01:30000 #30000端口为路由服务器01
192.168.3.210 #IP地址
mongod shard12:27017 #27017端口为分片服务器12
mongod shard22:27018 #27018端口为分片服务器22
mongod config02:20000 #20000端口为配置服务器02
mongos02:30000 #30000端口为路由服务器02
192.168.3.201 #IP地址
mongod shard13:27017 #27017端口为分片服务器13
mongod shard23:27018 #27018端口为分片服务器23
mongod config03:20000 #20000端口为配置服务器03
mongos03:30000 #30000端口为路由服务器03
备注:
分别在3台机器运行一个mongod实例(称为mongod shard11,mongod shard12,mongod shard13)组织replica 1905_01,作为cluster的shard_1905_01
分别在3台机器运行一个mongod实例(称为mongod shard21,mongod shard22,mongod shard23)组织replica 1905_02,作为cluster的shard_1905_02
每台机器运行一个mongod实例,作为3个config server
每台机器运行一个mongs进程,用于客户端连接
1.安装方法
参照http://blog.csdn.net/liu331095659/article/details/37870323来安装。安装成功后,不要用博客上面的启动命令。
2.创建数据目录
192.168.3.206服务器上面操作如下:
mkdir -p /data/mongodb/shard11
mkdir -p /data/mongodb/shard21
mkdir -p /data/mongodb/config
192.168.3.210服务器上面操作如下:
mkdir -p /data/mongodb/shard12
mkdir -p /data/mongodb/shard22
mkdir -p /data/mongodb/config
192.168.3.201服务器上面操作如下:
mkdir -p /data/mongodb/shard13
mkdir -p /data/mongodb/shard23
mkdir -p /data/mongodb/config
3.配置replice sets(副本集):
3.1配置shard_1905_01所用到的replica sets:
192.168.3.206服务器上面操作如下:
/usr/local/mongodb/bin/mongod --dbpath=/data/mongodb/shard11 --logpath /data/logs/mongodb/shard11.log --logappend --port=27017 -replSet shard_1905_01 -maxConns=2000 -oplogSize 100 -fork
192.168.3.210服务器上面操作如下:
/usr/local/mongodb/bin/mongod --dbpath=/data/mongodb/shard12 --logpath /data/logs/mongodb/shard12.log --logappend --port=27017 -replSet shard_1905_01 -maxConns=2000 -oplogSize 100 -fork
192.168.3.201服务器上面操作如下:
/usr/local/mongodb/bin/mongod --dbpath=/data/mongodb/shard13 --logpath /data/logs/mongodb/shard13.log --logappend --port=27017 -replSet shard_1905_01 -maxConns=2000 -oplogSize 100 -fork
3.2初始化replica set
用mongo连接其中一个mongod,执行:
/usr/local/mongodb/bin/mongo localhost:27017
config = {_id:"shard_1905_01",members:[{_id:0,host:'192.168.3.206:27017'},{_id:1,host:'192.168.3.210:27017'},{_id:2,host:'192.168.3.201:27017'}]}
rs.initiate(config);
3.3配置shard_1905_02所用到的replica sets:
192.168.3.206服务器上面操作如下:
/usr/local/mongodb/bin/mongod --dbpath=/data/mongodb/shard21 --logpath /data/logs/mongodb/shard21.log --logappend --port=27018 -replSet shard_1905_02 -maxConns=2000 -oplogSize 100 -fork
192.168.3.210服务器上面操作如下:
/usr/local/mongodb/bin/mongod --dbpath=/data/mongodb/shard22 --logpath /data/logs/mongodb/shard22.log --logappend --port=27018 -replSet shard_1905_02 -maxConns=2000 -oplogSize 100 -fork
192.168.3.201服务器上面操作如下:
/usr/local/mongodb/bin/mongod --dbpath=/data/mongodb/shard23 --logpath /data/logs/mongodb/shard23.log --logappend --port=27018 -replSet shard_1905_02 -maxConns=2000 -oplogSize 100 -fork
3.4初始化replica set
用mongo连接其中一个mongod,执行:
/usr/local/mongodb/bin/mongo localhost:27018
config = {_id:"shard_1905_02",members:[{_id:0,host:'192.168.3.206:27018'},{_id:1,host:'192.168.3.210:27018'},{_id:2,host:'192.168.3.201:27018'}]}
rs.initiate(config);
#到此就配置好了二个replica sets,也就是准备好了二个shards
4.配置三台config server
192.168.3.206服务器上面操作如下:
/usr/local/mongodb/bin/mongod --configsvr --dbpath=/data/mongodb/config/ --port=20000 --logpath=/data/logs/mongodb/config.log --logappend -fork
192.168.3.210服务器上面操作如下:
/usr/local/mongodb/bin/mongod --configsvr --dbpath=/data/mongodb/config/ --port=20000 --logpath=/data/logs/mongodb/config.log --logappend -fork
192.168.3.201服务器上面操作如下:
/usr/local/mongodb/bin/mongod --configsvr --dbpath=/data/mongodb/config/ --port=20000 --logpath=/data/logs/mongodb/config.log --logappend -fork
5.配置mongs
192.168.3.206服务器上面操作如下:
/usr/local/mongodb/bin/mongos --configdb 192.168.3.206:20000,192.168.3.210:20000,192.168.3.201:20000 --port=30000 --chunkSize 5 --logpath=/data/logs/mongodb/mongos.log --logappend -fork
192.168.3.210服务器上面操作如下:
/usr/local/mongodb/bin/mongos --configdb 192.168.3.206:20000,192.168.3.210:20000,192.168.3.201:20000 --port=30000 --chunkSize 5 --logpath=/data/logs/mongodb/mongos.log --logappend -fork
192.168.3.201服务器上面操作如下:
/usr/local/mongodb/bin/mongos --configdb 192.168.3.206:20000,192.168.3.210:20000,192.168.3.201:20000 --port=30000 --chunkSize 5 --logpath=/data/logs/mongodb/mongos.log --logappend -fork
6.连接到其中一个mongos进程,并切换到admin数据库做以下配置
6.1连接到mongs,并切换到admin
/usr/local/mongodb/bin/mongo 192.168.3.206:30000/admin
mongos> db #mongodb命令
6.2. 加入shards
#如里shard是单台服务器,用>db.runCommand( { addshard : “<serverhostname>[:<port>]” } )这样的命令加入,
#如果shard是replica sets,用replicaSetName/<serverhostname>[:port][,serverhostname2[:port],…]这样的格式表示,例如本例执行:
mongos>db.runCommand( { addshard : "shard_1905_01/192.168.3.206:27017,192.168.3.210:27017,192.168.3.201:27017",name:"s1",maxsize:20480} );
mongos>db.runCommand( { addshard : "shard_1905_02/192.168.3.206:27018,192.168.3.210:27018,192.168.3.201:27018",name:"s2",maxsize:20480} );
注意:在添加第二个shard时,出现error:test database 已经存在的错误,这里用mongo命令连接到第二个replica set,用db.dropDatabase()命令把test数据库给删除然后就可加入
name:用于指定每个shard的名字,不指定的话系统将自动分配
maxsize:指定各个shard可使用的最大磁盘空间,单位megabytes
6.3Listing shards
mongos> db.runCommand( { listshards : 1 } ) #mongodb命令
{
"shards" : [
{
"_id" : "s1",
"host" : "shard_1905_01/192.168.3.201:27017,192.168.3.206:27017,192.168.3.210:27017"
},
{
"_id" : "s2",
"host" : "shard_1905_02/192.168.3.201:27018,192.168.3.206:27018,192.168.3.210:27018"
}
],
"ok" : 1
}
#如果列出了以上二个你加的shards,表示shards已经配置成功
6.4 激活数据库分片
mongos>db.runCommand({enablesharding:”<dbname>”})
#通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的 collection将被存放在不同的shard上,
#但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还 需单独对collection作些操作。
如:
mongos> db.runCommand({enablesharding:"test"}) #mongodb命令
{ "ok" : 1 } #返回结果
查看数否生效:
mongos> db.printShardingStatus() #mongodb命令
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 4,
"minCompatibleVersion" : 4,
"currentVersion" : 5,
"clusterId" : ObjectId("53c76f7a9adee90a8b860eea")
}
shards:
{ "_id" : "s1", "host" : "shard_1905_01/192.168.3.201:27017,192.168.3.206:27017,192.168.3.210:27017" }
{ "_id" : "s2", "host" : "shard_1905_02/192.168.3.201:27018,192.168.3.206:27018,192.168.3.210:27018" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "test", "partitioned" : true, "primary" : "s2" }
注释:
一旦enable了个数据库,mongos将会把数据库里的不同数据集放在不同的分片上。除非数据集被分片(下面会设置),否则一个数据集的所有数据将放在一个分片上。
6.5collecton分片:
注释:
#要使单个collection也分片存储,需要给collections指定一个分片key,如下:
#> db.runCommand( {shardcollection : “<namespace>”,key : <shardkeypatternobject> })
#a. 分片的collection系统会自动创建一个索引(也可用户提前创建好)
#b. 分片的collection只能有一个在分片key上的唯一索引,其它唯一索引不被允许
分片collection例子:
mongos> db.runCommand({shardcollection:"test.liu_user",key:{id:1}}) #mongodb命令
{ "collectionsharded" : "test.liu_user", "ok" : 1 } #返回结果
mongos> use test #mongodb命令
#模拟向liu_user集合插入测试数据200003条:
mongos> for(var i =0; i<200003; i++) db.liu_user.save({id:i,value:"111111"}) #mongodb命令
mongos> db.liu_user.find().count() #mongodb命令
225366
mongos> db.liu_user.stats() #mongodb命令
{
"sharded" : true,
"systemFlags" : 1,
"userFlags" : 1,
"ns" : "test.liu_user",
"count" : 225366,
"numExtents" : 14,
"size" : 25240992,
"storageSize" : 48979968,
"totalIndexSize" : 13662096,
"indexSizes" : {
"_id_" : 7342048,
"id_1" : 6320048
},
"avgObjSize" : 112,
"nindexes" : 2,
"nchunks" : 6,
"shards" : {
"s1" : {
"ns" : "test.liu_user",
"count" : 25363,
"size" : 2840656,
"avgObjSize" : 112,
"storageSize" : 11182080,
"numExtents" : 6,
"nindexes" : 2,
"lastExtentSize" : 8388608,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 1,
"totalIndexSize" : 1553440,
"indexSizes" : {
"_id_" : 833952,
"id_1" : 719488
},
"ok" : 1
},
"s2" : {
"ns" : "test.liu_user",
"count" : 200003,
"size" : 22400336,
"avgObjSize" : 112,
"storageSize" : 37797888,
"numExtents" : 8,
"nindexes" : 2,
"lastExtentSize" : 15290368,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 1,
"totalIndexSize" : 12108656,
"indexSizes" : {
"_id_" : 6508096,
"id_1" : 5600560
},
"ok" : 1
}
},
"ok" : 1
}
#看到上面内容一样说明分片成功。我感觉神奇的是为什么我插入的是200003记录,怎么变成225366这么多了。还得继续研究...