简介
MongoDB支持分片机制,创建多个分片将数据分散存储,增强了MongoDB横向扩展的能力,从而满足数据大量增长的需求。
下图(图片源于Mongodb官方文档)是一个典型的Mongdb分片集群,每个分片配置为复制集的方式。
本文将在3台server上创建MongoDB分片集群:
- 数据节点,2个分片(shard)
- 每个分片为3节点的复制集(replica set)
- 3个路由节点(mongos)
- 3个配置服务器节点(config server)
关于复制集可以参考MongoDB的高可用
安装mongodb
每台server上安装mongodb:
tar zxvf mongodb-linux-x86_64-3.2.10.tgz -C /opt/
配置server1
数据节点分片1:
mkdir -p /data/mongodb/shard11
cat > /data/mongodb/shard11.conf <<EOF
shardsvr=true
replSet=shard1
port=27017
dbpath=/data/mongodb/shard11
oplogSize=2048
logpath=/data/mongodb/shard11.log
logappend=true
fork=true
rest=true
nojournal=true
EOF
数据节点分片2:
mkdir -p /data/mongodb/shard21
cat > /data/mongodb/shard21.conf <<EOF
shardsvr=true
replSet=shard2
port=27018
dbpath=/data/mongodb/shard21
oplogSize=2048
logpath=/data/mongodb/shard21.log
logappend=true
fork=true
rest=true
nojournal=true
EOF
配置节点:
mkdir -p /data/mongodb/config/
cat > /data/mongodb/config1.conf <<EOF
configsvr=true
dbpath=/data/mongodb/config/
port=20000
logpath=/data/mongodb/config1.log
logappend=true
fork=true
EOF
路由节点:
mkdir -p /data/mongodb/mongos1
cat > /data/mongodb/mongos1.conf <<EOF
configdb=server1:20000,server2:20000,server3:20000
port=28885
chunkSize=100
logpath=/data/mongodb/mongos1.log
logappend=true
fork=true
EOF
配置server2
数据节点分片1:
mkdir -p /data/mongodb/shard12
cat > /data/mongodb/shard12.conf <<EOF
shardsvr=true
replSet=shard1
port=27017
dbpath=/data/mongodb/shard12
oplogSize=2048
logpath=/data/mongodb/shard12.log
logappend=true
fork=true
rest=true
nojournal=true
EOF
数据节点分片2:
mkdir -p /data/mongodb/shard22
cat > /data/mongodb/shard22.conf <<EOF
shardsvr=true
replSet=shard2
port=27018
dbpath=/data/mongodb/shard22
oplogSize=2048
logpath=/data/mongodb/shard22.log
logappend=true
fork=true
rest=true
nojournal=true
EOF
配置节点:
mkdir -p /data/mongodb/config/
cat > /data/mongodb/config2.conf <<EOF
configsvr=true
dbpath=/data/mongodb/config/
port=20000
logpath=/data/mongodb/config2.log
logappend=true
fork=true
EOF
路由节点:
mkdir -p /data/mongodb/mongos2
cat > /data/mongodb/mongos2.conf <<EOF
configdb=server1:20000,server2:20000,server3:20000
port=28885
chunkSize=100
logpath=/data/mongodb/mongos2.log
logappend=true
fork=true
EOF
配置server3
数据节点分片1:
mkdir -p /data/mongodb/shard13
cat > /data/mongodb/shard13.conf <<EOF
shardsvr=true
replSet=shard1
port=27017
dbpath=/data/mongodb/shard13
oplogSize=2048
logpath=/data/mongodb/shard13.log
logappend=true
fork=true
rest=true
nojournal=true
EOF
数据节点分片2:
mkdir -p /data/mongodb/shard23
cat > /data/mongodb/shard23.conf <<EOF
shardsvr=true
replSet=shard2
port=27018
dbpath=/data/mongodb/shard23
oplogSize=2048
logpath=/data/mongodb/shard23.log
logappend=true
fork=true
rest=true
nojournal=true
EOF
配置节点:
mkdir -p /data/mongodb/config/
cat > /data/mongodb/config3.conf <<EOF
configsvr=true
dbpath=/data/mongodb/config/
port=20000
logpath=/data/mongodb/config3.log
logappend=true
fork=true
EOF
路由节点:
mkdir -p /data/mongodb/mongos3
cat > /data/mongodb/mongos3.conf <<EOF
configdb=server1:20000,server2:20000,server3:20000
port=28885
chunkSize=100
logpath=/data/mongodb/mongos3.log
logappend=true
fork=true
EOF
启动服务
server1:
cd /opt/mongodb-linux-x86_64-3.2.10/bin
./mongod --config /data/mongodb/shard11.conf
./mongod --config /data/mongodb/shard21.conf
./mongod --config /data/mongodb/config1.conf
server2:
cd /opt/mongodb-linux-x86_64-3.2.10/bin
./mongod --config /data/mongodb/shard12.conf
./mongod --config /data/mongodb/shard22.conf
./mongod --config /data/mongodb/config2.conf
server3:
cd /opt/mongodb-linux-x86_64-3.2.10/bin
./mongod --config /data/mongodb/shard13.conf
./mongod --config /data/mongodb/shard23.conf
./mongod --config /data/mongodb/config3.conf
可根据使用情况启动1个或多个mongos:
[root@server1 bin]#./mongos --config /data/mongodb/mongos1.conf
[root@server2 bin]#./mongos --config /data/mongodb/mongos2.conf
[root@server3 bin]#./mongos --config /data/mongodb/mongos3.conf
配置分片
server1:
./mongo server1:27017/admin
> config = {
_id:'shard1',
members: [
{
_id: 0,
host: 'server1:27017'
},
{
_id: 1,
host: 'server2:27017'
},
{
_id: 2,
host: 'server3:27017'
}]
};
> rs.initiate(config);
server2:
./mongo server2:27018/admin
> config = {
_id:'shard2',
members: [
{
_id: 0,
host: 'server2:27018'
},
{
_id: 1,
host: 'server1:27018'
},
{
_id: 2,
host: 'server3:27018'
}]
};
> rs.initiate(config);
server3:
./mongo server3:28885/admin
> db.runCommand({"addshard" : "shard1/server1:27017,server2:27017,server3:27017"})
> db.runCommand({"addshard" : "shard2/server2:27018,server1:27018,server3:27018"})
数据分片测试
连接到mongos节点:
mongos> db.runCommand({"enablesharding" : "shardb"})
mongos> db.runCommand({"shardcollection" : "shardb.coll",key : {_id: 1}})
mongos> for(var i=0;i<10000;i++){db.coll.insert({_id:i+1,content:'test'+i})}
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("59953e12614e2dac889e3d58")
}
shards:
{ "_id" : "shard1", "host" : "shard1/server1:27017,server2:27017,server3:27017" }
{ "_id" : "shard2", "host" : "shard2/server1:27018,server2:27018,server3:27018" }
active mongoses:
"3.2.10" : 3
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
1 : Success
databases:
{ "_id" : "shardb", "primary" : "shard1", "partitioned" : true }
shardb.coll
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
shard1 2
shard2 1
{ "_id" : { "$minKey" : 1 } } -->> { "_id" : 2 } on : shard2 Timestamp(2, 0)
{ "_id" : 2 } -->> { "_id" : 28 } on : shard1 Timestamp(2, 1)
{ "_id" : 28 } -->> { "_id" : { "$maxKey" : 1 } } on : shard1 Timestamp(1, 3)
可以看到集合shardb.coll的数据分布在shard1和shard2两个分片上。