Mongodb集群分片
一、简介
1、 MongoDB 是一个高性能,开源,无模式的文档型数据库,是当前NoSQL 数据库产品中最热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式,MongoDB使用C++开发。
2、 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json 的bjson 格式,因此可以存储比较复杂的数据类型。MongoDB 最大的特点是他支持的查询语言非    常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查    询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文   档型数据库。
二、部署介绍与部署目的
1、本次部署是在一台服务器上实现,下面用分组来表示,如果在多台上部署只需要修 改ip和端口就可以。
2、部署主要实现的功能是实现分片、复制集,主备可以在宕机之后自动切换,实现高 可用。
 

Shard1

Shard2

Shard3

Cnfig

Mongs

mongod shard1_1:27017

mongod shard2_1:27020

mongod shard3_1:27023

mongod config:20000

mongs:30000

mongod shard1_1:27018

mongod shard2_2:27021

mongod shard3_2:27024

mongod config:20010

mongs:30010

mongod shard1_3:27019

mongod shard2_3:27022

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手册》