MongoDB是由C++语言编写的一个基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案, 支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引,MogoDB的主要特点就是 高性能、易部署、易使用,存储数据非常方便,以下来说明一下MongoDB的分片chunk集群部署。
Mongodb Sharding Cluster 的构建需要三种角色
1. Shard Server:mongod 实例,用于存储实际的数据块
2. Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息
3. Route Server: mongos 实例,前端路由,应用程序访问由此进入,调度具体的shard分配,使得整个集群得以透明化
环境配置:
Server1: 192.168.231.129
Server2: 192.168.231.130
Server3: 192.168.231.131
首先配置 shard1 集群,登录 Server1:
创建数据目录:mkdir -p /data/mongodb/shard1_1
启动shard1分片实例:cd /$mongopath/bin
./mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shard1_1 --oplogSize 100 --logpath /data/mongodb/shard1_1/shard1_1.log --logappend --fork (logappend 表示日志写入为追加的方式,不会覆盖之前已写入的日志内容,fork表示后台运行)
登录Server2
创建数据目录:mkdir -p /data/mongodb/shard1_2
启动shard1分片实例:cd /$mongopath/bin
./mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shard1_2 --oplogSize 100 --logpath /data/mongodb/shard1_2/shard1_2.log --logappend --fork
登录Server3
创建数据目录:mkdir -p /data/mongodb/shard1_3
启动shard1分片实例:cd /$mongopath/bin
./mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shard1_3 --oplogSize 100 --
logpath /data/mongodb/shard1_3/shard1_3.log --logappend --fork
在确定三台上的27017端口都起来之后,连接其中任意一台mongo,初始化replication set
./mongo --port 27017 执行
> config={_id:'shard1',members:[{_id:0,host:'192.168.231.129:27017'},{ _id:1,host:'192.168.231.130:27017' },{ _id:2,host:'192.168.231.131:27017' }]}
{
"_id" : "shard1",
"members" : [
{
"_id" : 0,
"host" : " 192.168.231.129:27017 "
},
{
"_id" : 1,
"host" : " 192.168.231.130:27017 "
},
{
"_id" : 2,
"host" : " 192.168.231.131:27017 "
}
]
}
> rs.initiate(config)
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
添加完成后,执行 rs.initiate(config); 初始化replca set内容
这里,我们就完成了shard1的配置,下面来配置shard2的信息
登录 Server1:
创建数据目录:mkdir -p /data/mongodb/shard2_1
启动shard1分片实例:cd /$mongopath/bin
./mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shard2_1 --oplogSize 100 --logpath /data/mongodb/shard2_1/shard2_1.log --logappend --fork (logappend 表示日志写入为追加的方式,不会覆盖之前已写入的日志内容,fork表示后台运行)
登录Server2
创建数据目录:mkdir -p /data/mongodb/shard2_2
启动shard1分片实例:cd /$mongopath/bin
./mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shard2_2 --oplogSize 100 --logpath /data/mongodb/shard2_2/shard2_2.log --logappend --fork
登录Server3
创建数据目录:mkdir -p /data/mongodb/shard2_3
启动shard1分片实例:cd /$mongopath/bin
./mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shard2_3 --oplogSize 100 --
logpath /data/mongodb/shard2_3/shard2_3.log --logappend --fork
在确定三台上的27018端口都起来之后,连接其中任意一台mongo,初始化replication set
./mongo --port 27018 执行
> config={_id:'shard2',members:[{_id:0,host:'192.168.231.129:27018'},{ _id:1,host:'192.168.231.130:27018' },{ _id:2,host:'192.168.231.131:27018' }]}
{
"_id" : "shard2",
"members" : [
{
"_id" : 0,
"host" : " 192.168.231.129:27018 "
},
{
"_id" : 1,
"host" : " 192.168.231.130:27018 "
},
{
"_id" : 2,
"host" : " 192.168.231.131:27018 "
}
]
}
> rs.initiate(config)
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
至此,三台shard已经配置完成,下面配置config server
在三台机器上分别执行:
mkdir -p /data/mongodb/config
./mongod –configsvr –dbpath /data/mongodb/config –port 20000 –logpath /data/mongodb/config/config.log –logappend –fork
配置router server:
在三台server上分别执行:
./mongos –configdb 192.168.231.129:20000,192.168.231.130:20000,192.168.231.131:20000 –port 30000 –chunkSize 5 –logpath /data/mongodb/mongos.log --logappend --fork (chunkSize 指定分片的大小,可以视情况而定)
Configuring the Shard Cluster
连接到其中一个mongos进程,并切换到admin数据库做以下配置
1. 连接到mongs,并切换到admin
./mongo 192.168.231.129:30000/admin
2. 加入shards
db.runCommand( { addshard : “shard1/192.168.231.129:27017, 192.168.231.130:27017,192.168.231..131:27017″,name:”s1″} ); (名字可以随意指定,如果不指定,则默认为shard1)
db.runCommand( { addshard : “shard2/ 192.168.231.129:27018, 192.168.231.130:27018, 192.168.231.131:27018″,name:”s2″} );
每一次点击确定之后,出现{ "shardAdded" : "shard1", "ok" : 1 } 提示,表示添加成功了。
这个时候,可以用 db.runCommand( { listshards : 1 } ) 命令查看分片的情况 , 如果出现两个分片,则代表配置成功了。
激活数据库分片: db.runCommand( { enablesharding : “<dbname>” } );
例:我们用test测试库分别激活其数据库及集合的分片
db.runCommand({ enablesharding:"test" })
db.runCommand({ shardcollection: "test.users", key: { _id:1 }})
use test; 我们插入一些数据进行一下测试:
for(var i=1;i<=20000;i++) db.users.insert({id:i,name:"xiaoxiao",tel:"123456"});
插入完毕之后,运行db.users.stats() 查看分片结果:
mongos> db.users.stats()
{
"sharded" : true,
"flags" : 1,
"ns" : "test.users",
"count" : 22000,
"numExtents" : 10,
"size" : 1632028,
"storageSize" : 5586944,
"totalIndexSize" : 735840,
"indexSizes" : {
"_id_" : 735840
},
"avgObjSize" : 74.18309090909091,
"nindexes" : 1,
"nchunks" : 3,
"shards" : {
"shard1" : {
"ns" : "test.users",
"count" : 8128,
"size" : 577744,
"avgObjSize" : 71.08070866141732,
"storageSize" : 2793472,
"numExtents" : 5,
"nindexes" : 1,
"lastExtentSize" : 2097152,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 277984,
"indexSizes" : {
"_id_" : 277984
},
"ok" : 1
},
"shard2" : {
"ns" : "test.users",
"count" : 13872,
"size" : 1054284,
"avgObjSize" : 76.00086505190312,
"storageSize" : 2793472,
"numExtents" : 5,
"nindexes" : 1,
"lastExtentSize" : 2097152,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 457856,
"indexSizes" : {
"_id_" : 457856
},
"ok" : 1
}
},
"ok" : 1
}
以上结果表示,分片已经成功了。