数据库

 首页 > 数据库 > MongoDB > MongoDB数据库集群分片

MongoDB数据库集群分片

分享到:
【字体:
导读:
         摘要:Mongodb集群分片一、简介1、MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSQL数据库产品中最热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式,MongoDB使用C++开发。2、MongoDB是一个介于关系数据库和非关系数据...

MongoDB数据库集群分片

Mongodb集群分片

一、简介

1、 MongoDB 是一个高性能,开源,无模式的文档型数据库,是当前NoSQL 数据库产品中最热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式,MongoDB使用C++开发。

2、 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json 的bjson 格式,因此可以存储比较复杂的数据类型。MongoDB 最大的特点是他支持的查询语言非    常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查    询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文   档型数据库。

二、部署介绍与部署目的

1、本次部署是在一台服务器上实现,下面用分组来表示,如果在多台上部署只需要修 改ip和端口就可以。

2、部署主要实现的功能是实现分片、复制集,主备可以在宕机之后自动切换,实现高 可用。

分组

服务端口号

第一组

mongod shard1_1:27017

mongod shard1_1:27018

mongod shard1_3:27019

mongod config:20000

mongs:30000

第二组

mongod shard2_1:27020

mongod shard2_2:27021

mongod shard2_3:27022

mongod config:20010

mongs:30010

第三组

mongod shard3_1:27023

mongod shard3_2:27024

mongod shard3_3:27025

mongod config:20020

mongs:30020

三、安装部署

1、创建第一组数据库储存路径

# mkdir -p /data/shard1_1

# mkdir -p /data/shard1_2

# mkdir -p /data/shard1_3

# mkdir -p /data/config

2、开启mongod进程,指定端口、路径、声明这是一个集群的分片、副本集名称;

# ./mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shard1_1 --logpath /data/mongodb.log --logappend --fork

# ./mongod --shardsvr --replSet shard1 --port 27018 --dbpath /data/shard1_2 --logpath /data/mongodb.log --logappend --fork

# ./mongod --shardsvr --replSet shard1 --port 27019 --dbpath /data/shard1_3 --logpath /data/mongodb.log --logappend --fork

3、 创建第二组数据储存路径

# mkdir -p /data/shard2_1

# mkdir -p /data/shard2_2

# mkdir -p /data/shard2_3

# mkdir -p /data/config_1

4、开启mongod进程,指定端口、路径、声明这是一个集群的分片、副本集名称;

# ./mongod --shardsvr --replSet shard2 --port 27020 --dbpath /data/shard2_1 --logpath /data/mongodb.log --logappend --fork

# ./mongod --shardsvr --replSet shard2 --port 27021 --dbpath /data/shard2_2 --logpath /data/mongodb.log --logappend --fork

# ./mongod --shardsvr --replSet shard2 --port 27022 --dbpath /data/shard2_3 --logpath /data/mongodb.log --logappend ?fork

5、 创建第二组数据储存路径

# mkdir -p /data/shard3_1

# mkdir -p /data/shard3_2

# mkdir -p /data/shard3_3

# mkdir -p /data/config_2

6、 开启mongod进程,指定端口、路径、声明这是一个集群的分片、副本集名称;

# ./mongod --shardsvr --replSet shard3 --port 27023 --dbpath /data/shard3_1 --logpath /data/mongodb.log --logappend --fork

# ./mongod --shardsvr --replSet shard3 --port 27024 --dbpath /data/shard3_2 --logpath /data/mongodb.log --logappend --fork

# ./mongod --shardsvr --replSet shard3 --port 27025 --dbpath /data/shard3_3 --logpath /data/mongodb.log --logappend --fork

7、第一组;进入数据库定义config server组;

[root@test1 bin]# ./mongo --port 27017 MongoDB shell version: 2.0.0

connecting to: 127.0.0.1:27017/test

> config = {_id: 'shard1', members: [

... ... {_id: 0, host: '127.0.0.1:27017'},

... ... {_id: 1, host: '127.0.0.1:27018'},

... ... {_id: 2, host: '127.0.0.1:27019'}]

... ... };

{

        "_id" : "shard1",

        "members" : [

{

"_id" : 0,

"host" : "127.0.0.1:27017"

},

{

                        "_id" : 1,

"host" : "127.0.0.1:27018"

},

{

"_id" : 2,

"host" : "127.0.0.1:27019"

}

        ]

}

> rs.initiate(config)

{

        "info" : "Config now saved locally. Should come online in about a minute.",

        "ok" : 1

}

8、第二组;进入数据库定义config server组;

[root@test1 bin]# ./mongo --port 27020

MongoDB shell version: 2.0.0

connecting to: 127.0.0.1:27020/test

> config = {_id: 'shard2', members: [

... ... ... {_id: 0, host: '127.0.0.1:27020'},

... ... ... {_id: 1, host: '127.0.0.1:27021'},

... ... ... {_id: 2, host: '127.0.0.1:27022'}]

... ... ... };

{

        "_id" : "shard2",

        "members" : [

{

                        "_id" : 0,

"host" : "127.0.0.1:27020"

},

{

"_id" : 1,

"host" : "127.0.0.1:27021"

},

{

       "_id" : 2,

"host" : "127.0.0.1:27022"

}

        ]

}

> rs.initiate(config)

{

        "info" : "Config now saved locally. Should come online in about a minute.",

        "ok" : 1

}

9、第三组;进入数据库定义config server组;

[root@test1 bin]# ./mongo --port 27025

MongoDB shell version: 2.0.0

connecting to: 127.0.0.1:27025/test

> config = {_id: 'shard3', members: [

... ... ... {_id: 0, host: '127.0.0.1:27023'},

... ... ... {_id: 1, host: '127.0.0.1:27024'},

... ... ... {_id: 2, host: '127.0.0.1:27025'}]

... ... ... };

{

        "_id" : "shard3",

        "members" : [

{

"_id" : 0,

"host" : "127.0.0.1:27023"

},

{

       "_id" : 1,

"host" : "127.0.0.1:27024"

},

{

"_id" : 2,

"host" : "127.0.0.1:27025"

}

        ]

}

> rs.initiate(config)

{

        "info" : "Config now saved locally. Should come online in about a minute.",

        "ok" : 1

}

10、第一组;声明一个集群的config server,指定端口号;开启mongos进程,启动route server,指定数据分块大小;

# ./mongod --configsvr --dbpath /data/config --port 20000 --logpath /data/config.log --logappend --fork

# ./mongos --configdb 127.0.0.1:20000,127.0.0.1:20010,127.0.0.1:20020 --port 30000 --chunkSize 1 --logpath /data/mongos.log --logappend ?fork

11、第二组;声明一个集群的config server,指定端口号;开启mongos进程,启动route server,指定数据分块大小;

# ./mongod --configsvr --dbpath /data/config_1 --port 20010 --logpath /data/config.log --logappend --fork

# ./mongos --configdb 127.0.0.1:20000,127.0.0.1:20010,127.0.0.1:20020 --port 30010 --chunkSize 1 --logpath /data/mongos.log --logappend ?fork

12、第三组;声明一个集群的config server,指定端口号;开启mongos进程,启动route server,指定数据分块大小;

# ./mongod --configsvr --dbpath /data/config_2 --port 20020 --logpath /data/config.log --logappend --fork

# ./mongos --configdb 127.0.0.1:20000,127.0.0.1:20010,127.0.0.1:20020 --port 30020 --chunkSize 1 --logpath /data/mongos.log --logappend ?fork

13、添加shard server;设置分片储存数据库;设置分片的集合名称,且必须指定Shard Key,系统会自动创建索引;

[root@test1 bin]# ./mongo --port 30000

MongoDB shell version: 2.0.0

connecting to: 127.0.0.1:30000/test

mongos> use admin

switched to db admin

mongos> db.runCommand({addshard:"shard1/127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019"});

{ "shardAdded" : "shard1", "ok" : 1 }

mongos> db.runCommand({addshard:"shard2/127.0.0.1:27020,127.0.0.1:27021,127.0.0.1:27022"});

{ "shardAdded" : "shard2", "ok" : 1 }

mongos> db.runCommand({addshard:"shard3/127.0.0.1:27023,127.0.0.1:27024,127.0.0.1:27025"});

{ "shardAdded" : "shard3", "ok" : 1 }

mongos> db.runCommand({ enablesharding:"test" })

{ "ok" : 1 }

mongos> db.runCommand({ shardcollection: "test.users", key: { _id:1 }})

{ "collectionsharded" : "test.users", "ok" : 1 }

mongos>

------------------------------测试-----------------------

1、随便连接到其中一台上的 mongos 进程(这里是30000、30010、30020三个端口)#

2、进入test库中

3、添加数据

4、查看数据库状态

5、以下可以看出数据分别放在了不同的3组中

6、查看数据库存放的目录可以看出每个数据库组都有数据

[root@test1 bin]# ./mongo --port 30010

MongoDB shell version: 2.0.0

connecting to: 127.0.0.1:30010/test

mongos> use test

switched to db test

mongos> for (var i = 1; i <= 500000; i++) db.users.insert({age:i,name:"qinshou",addr:"Beijing",country:"China"})

mongos> db.users.stats()

{

        "sharded" : true,

        "flags" : 1,

        "ns" : "test.users",

        "count" : 200000,

        "numExtents" : 17,

        "size" : 15200076,

        "storageSize" : 25157632,

        "totalIndexSize" : 6532624,

        "indexSizes" : {

                "_id_" : 6532624

        },

        "avgObjSize" : 76.00038,

        "nindexes" : 1,

        "nchunks" : 15,

        "shards" : {

"shard1" : {

"ns" : "test.users",

"count" : 82398,

                        "size" : 6262280,

"avgObjSize" : 76.00038835894075,

"storageSize" : 11182080,

"numExtents" : 6,

"nindexes" : 1,

"lastExtentSize" : 8388608,

"paddingFactor" : 1,

"flags" : 1,

"totalIndexSize" : 2689904,

"indexSizes" : {

"_id_" : 2689904

                        },

"ok" : 1

},

"shard2" : {

"ns" : "test.users",

"count" : 15780,

"size" : 1199292,

"avgObjSize" : 76.00076045627377,

"storageSize" : 2793472,

"numExtents" : 5,

"nindexes" : 1,

"lastExtentSize" : 2097152,

"paddingFactor" : 1,

"flags" : 1,

"totalIndexSize" : 523264,

"indexSizes" : {

"_id_" : 523264

},

"ok" : 1

},

"shard3" : {

"ns" : "test.users",

"count" : 101822,

"size" : 7738504,

"avgObjSize" : 76.000314273929,

"storageSize" : 11182080,

"numExtents" : 6,

"nindexes" : 1,

"lastExtentSize" : 8388608,

"paddingFactor" : 1,

"flags" : 1,

"totalIndexSize" : 3319456,

"indexSizes" : {

"_id_" : 3319456

},

"ok" : 1

}

        },

        "ok" : 1

}

mongos>

[root@test1 data]# ll

total 1076

drwxr-xr-x 4 root root   4096 Jul 11 10:31 config

drwxr-xr-x 4 root root   4096 Jul 11 10:31 config_1

drwxr-xr-x 4 root root   4096 Jul 11 10:31 config_2

-rw-r--r-- 1 root root 653298 Jul 11 11:22 config.log

drwxr-xr-x 3 root root   4096 Oct 9 2011 db

-rw-r--r-- 1 root root 154454 Jul 11 11:22 mongodb.log

-rw-r--r-- 1 root root 236269 Jul 11 11:22 mongos.log

drwxr-xr-x 4 root root   4096 Jul 11 10:42 shard1_1

drwxr-xr-x 3 root root   4096 Jul 11 10:40 shard1_2

drwxr-xr-x 4 root root   4096 Jul 11 10:42 shard2_1

drwxr-xr-x 3 root root   4096 Jul 11 10:42 shard2_2

drwxr-xr-x 4 root root   4096 Jul 11 10:42 shard3_1

drwxr-xr-x 3 root root   4096 Jul 11 10:42 shard3_2

到此!搭建完成!!!有疑问请参考《mongodb实践》《mongodb手册》

MongoDB数据库集群分片
分享到:
MongoDB数据库sharding集群增加和删除节...
MongoDB数据库sharding集群增加和删除节点 MongoDB的Auto-Sharding能够做到: 1 当各Sharding间负载和数据分布不平衡时,自动rebalancing 2 简单方便的添加和删除节点 3 自动故障转移(auto failover) 4 可扩展至上千台节点  如何增加shard节点,在之前的shard集群配置过程使用过。当向一个sharding集群添...
MongoDB数据库如何使用地理位置索引
MongoDB数据库如何使用地理位置索引  mongoDB支持二维空间索引,使用空间索引,mongoDB支持一种特殊查询,如某地图网站上可以查找离你最近的咖啡厅,银行等信息。这个使用mongoDB的空间索引结合特殊的查询方法很容易实现。 前提条件: 建立空间索引的key可以使用array或内嵌文档存储,但是前两个elements必须存储固...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……