MongoDB搭建分片集群

文/qiz 2017-08-17 18:20:00

简介

MongoDB支持分片机制,创建多个分片将数据分散存储,增强了MongoDB横向扩展的能力,从而满足数据大量增长的需求。

下图(图片源于Mongodb官方文档)是一个典型的Mongdb分片集群,每个分片配置为复制集的方式。 mongodb shard

本文将在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两个分片上。


参考资料

知识共享许可协议
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

最新文章 全部