分类: NOSQL
2014-04-03 15:47:35
MongoDB Sharding Cluster 包含三种角色:
Shard Server: mongod 实例,用于存储实际的数据块,数据层
Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息,配置层
Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一进程
数据库,路由层。
10.14.2.201 |
10.14.2.202 |
10.14.2.203 |
10.14.2.204 |
Shard1 |
Shard2 |
Shard3 |
Shard1 |
Shard2 |
Shard1 |
Shard2 |
Shard3 |
Shard3 |
Shard3 |
Shard1 |
Shard2 |
1.节点:
S1: 10.14.2.201, 10.14.2.202, 10.14.2.203, 10.14.2.204 (arbiter)
S2: 10.14.2.201, 10.14.2.202, 10.14.2.203 (arbiter), 10.14.2.204
S3: 10.14.2.201, 10.14.2.202(arbiter), 10.14.2.203, 10.14.2.204
主机 |
端口信息 |
10.14.2.201 |
mongod shard1:27017 mongod shard2:27018 mongod shard3:27019 mongod config:30000 mongs:40000 |
10.14.2.202 |
mongod shard1:27017 mongod shard2:27018 mongod shard3:27019 mongod config:30000 mongs:40000 |
10.14.2.203 |
mongod shard1:27017 mongod shard2:27018 mongod shard3:27019 mongod config:30000 mongs:40000 |
10.14.2.204 |
mongod shard1:27017 mongod shard2:27018 mongod shard3:27019 mongod config:30000 mongs:40000 |
在所有机器上运行
1、下载mongodb程序
mongodb-linux-x86_64-2.4.4.tgz
2、解压mongodb-linux-x86_64-2.4.4.tgz到/export/ 目录下
tar -xvf mongodb-linux-x86_64-2.4.4.tgz -C /usr/local/
3、建立软连接
cd /usr/local/
ln -s mongodb-linux-x86_64-2.4.4 mongodb
4、配置环境变量 vim /etc/profile 添加
#mongodb
export PATH=/usr/local/mongodb/bin:$PATH
source /etc/profile
5、创建目录
mkdir -p /export/mongodb/data/shard1
mkdir -p /export/mongodb/data/shard2
mkdir -p /export/mongodb/data/shard3
mkdir -p /export/mongodb/data/config
mkdir -p /export/mongodb/logs/shard1
mkdir -p /export/mongodb/logs/shard2
mkdir -p /export/mongodb/logs/shard3
mkdir -p /export/mongodb/logs/config
mkdir -p /export/mongodb/logs/mongos
6、在10.14.2.201(任意一台都可以) 生成keyfile文件
openssl rand -base64 753 > /export/mongodb/keyfile
7、把keyfile文件传输到其他机器上
scp /export/mongodb/keyfile 10.14.2.202:/export/mongodb/
scp /export/mongodb/keyfile 10.14.2.203:/export/mongodb/
scp /export/mongodb/keyfile 10.14.2.204:/export/mongodb/
8、在每台机器上执行 修改keyfile权限
chmod 600 /export/mongodb/keyfile
配置Replica Sets,Config Server
9、在每台机器上执行
/usr/local/mongodb/bin/mongod --fork --shardsvr --port 27017 --dbpath /export/mongodb/data/shard1/ --logpath /export/mongodb/logs/shard1/log.log --logappend --replSet s1 --auth --rest --keyFile /export/mongodb/keyfile
/usr/local/mongodb/bin/mongod --fork --shardsvr --port 27018 --dbpath /export/mongodb/data/shard2/ --logpath /export/mongodb/logs/shard2/log.log --logappend --replSet s2 --auth --rest --keyFile /export/mongodb/keyfile
/usr/local/mongodb/bin/mongod --fork --shardsvr --port 27019 --dbpath /export/mongodb/data/shard3/ --logpath /export/mongodb/logs/shard3/log.log --logappend --replSet s3 --auth --rest --keyFile /export/mongodb/keyfile
/usr/local/mongodb/bin/mongod --fork --configsvr --port 30000 --dbpath /export/mongodb/data/config/ --logpath /export/mongodb/logs/config/log.log --logappend --auth --rest --keyFile /export/mongodb/keyfile
10、在10.14.2.201上执行
1)查看mongod的进程是否启动
ps aux | grep mongodb | grep -v grep
2)初始化replica sets
/usr/local/mongodb/bin/mongo --port 27017
config
= {_id: 's1', members: [
{_id: 0, host: '10.14.2.201:27017'},
{_id: 1, host: '10.14.2.202:27017'},
{_id: 2, host: '10.14.2.203:27017'},
{_id: 3, host: '10.14.2.204:27017',
arbiterOnly: true}
]}
rs.initiate(config)
rs.status()
11、在10.14.2.202上执行
1)查看mongod的进程是否启动
ps aux | grep mongodb | grep -v grep
2)初始化replica sets
/usr/local/mongodb/bin/mongo --port 27018
config =
{_id: 's2', members: [
{_id: 0, host: '10.14.2.201:27018'},
{_id: 1, host: '10.14.2.202:27018'},
{_id: 2, host: '10.14.2.203:27018',
arbiterOnly: true },
{_id: 3, host: '10.14.2.204:27018'
}
]}
rs.initiate(config)
rs.status()
12、在10.14.2.203上执行
1)查看mongod的进程是否启动
ps aux | grep mongodb | grep -v grep
2)初始化replica sets
/usr/local/mongodb/bin/mongo --port 27019
config
= {_id: 's3', members: [
{_id: 0, host: '10.14.2.201:27019'},
{_id: 1, host: '10.14.2.202:27019',
arbiterOnly: true },
{_id: 2, host: '10.14.2.203:27019' },
{_id: 3, host: '10.14.2.204:27019'
}
]}
rs.initiate(config)
rs.status()
配置Mongos(在每一台机子上建立路由)
13、在每台机器上执行
/usr/local/mongodb/bin/mongos --fork --port 40000 --logpath /export/mongodb/logs/mongos/log.log --configdb 10.14.2.201:30000,10.14.2.202:30000,10.14.2.203:30000 --keyFile /export/mongodb/keyfile
添加分片
1连接任意一台,其他无需这样操作:
/usr/local/mongodb/bin/mongo --port 40000
use admin
db.runCommand({addshard:'s1/10.14.2.201:27017,10.14.2.202:27017,10.14.2.203:27017'})
db.runCommand({addshard:'s2/10.14.2.201:27018,10.14.2.202:27018,10.14.2.203:27018' })
db.runCommand({addshard:'s3/10.14.2.201:27019,10.14.2.203:27019,10.14.2.203:27019' })
db.runCommand({ listshards:1 })
通过执行以下命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的collection将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对collection作些操作
db.runCommand({enablesharding:"test"});
要使单个collection也分片存储,需要给collection指定一个分片key,通过以下命令操作
db.runCommand( { shardcollection : "test.c1",key : {id: 1},unique : true } )
创建测试数据
use test
for(var i=1;i<=200003;i++) db.c1.save({id:i,value1:"1234567890",value2:"1234567890",value3:"1234567890",value4:"1234567890"});
> db.c1.stats() \\查看数据已经分到了s1,s2,s3上
{
"sharded" : true,
"ns" : "test.c1",
"count" : 200003,
"numExtents" : 14,
"size" : 25600384,
"storageSize" : 40599552,
"totalIndexSize" : 12182240,
"indexSizes" : {
"_id_" : 6540800,
"id_1" : 5641440
},
"avgObjSize" : 128,
"nindexes" : 2,
"nchunks" : 4,
"shards" : {
"s1" : {
"ns" : "test.c1",
"count" : 194287,
"size" : 24868736,
"avgObjSize" : 128,
"storageSize" : 37797888,
"numExtents" : 8,
"nindexes" : 2,
"lastExtentSize" : 15290368,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 11781616,
"indexSizes" : {
"_id_" : 6328224,
"id_1" : 5453392
},
"ok" : 1
},
"s2" : {
"ns" : "test.c1",
"count" : 0,
"size" : 0,
"storageSize" : 8192,
"numExtents" : 1,
"nindexes" : 2,
"lastExtentSize" : 8192,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 16352,
"indexSizes" : {
"_id_" : 8176,
"id_1" : 8176
},
"ok" : 1
},
"s3" : {
"ns" : "test.c1",
"count" : 5716,
"size" : 731648,
"avgObjSize" : 128,
"storageSize" : 2793472,
"numExtents" : 5,
"nindexes" : 2,
"lastExtentSize" : 2097152,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 384272,
"indexSizes" : {
"_id_" : 204400,
"id_1" : 179872
},
"ok" : 1
}
},
"ok" : 1
}