MongoDB集群之分片

  MongoDB分片

分片sharding)是将数据拆分,将其分散在不同的机器上的过程。MongoDB支持自动分片

片键shard key)设置分片时,需要从集合里面选一个键,用该键作为数据拆分的依据,此键就叫片键

分片一般有以下三部分组成:

     可以是普通的mongod进程,也可以是副本集。

但是即使一片内有多台服务器,也只能有一个主服务器,其他的服务器保存相同的数据

         Mongos

                  就是mongodb的路由器进程,它路由所有请求,然后将结果聚合。它不保存存储数据或配置信息

                   它本身并不存储数据或配置信息(但会缓存配置服务器信息)

         配置服务器

                   存储集群的配置信息:数据和片的对应关系

                   Mongos不会永久存放数据,所以需要个地方存放分片配置

环境规划

 

Dbpath

logpath

port

备注

1

/data/mongodb/conf

/data/mongodb/logs/conf.log

10000

配置服务器

2

——

/data/mongodb/logs/mongos.log

20000

mongos

3

/data/mongodb/shard1

/data/mongodb/logs/shard1.log

30000

分片1

4

/data/mongodb/shard2

/data/mongodb/logs/shard2.log

40000

分片2

创建db|logpath目录

~]# mkdir /data/mongodb/conf /data/mongodb/shard{1,2}

~]# mkdir /data/mongodb/logs/

启动配置服务

#配置服务器要最先启动,因为mongos会用它其上的配置信息

~]# mongod --dbpath /data/mongodb/conf --logpath /data/mongodb/logs/conf.log --logappend --fork --port 10000

about to fork child process, waiting until server is ready for connections.

forked process: 14234

child process started successfully, parent exiting

启动路由服务

#mongos进程不需要数据目录

~]# mongos --port 20000 --configdb 192.168.211.217:10000 --logpath /data/mongodb/logs/mongos.log  --logappend --fork

2015-01-15T17:21:13.758+0800 warning: running with 1 config server should be done only for testing purposes and is not recommended for production

about to fork child process, waiting until server is ready for connections.

forked process: 15361

child process started successfully, parent exiting

启动分片服务

~]#mongod --fork --dbpath /data/mongodb/shard1 --logpath /data/mongodb/logs/shard1.log --logappend -port 30000

about to fork child process, waiting until server is ready for connections.

forked process: 15426

child process started successfully, parent exiting

~]#mongod --fork --dbpath /data/mongodb/shard2 --logpath /data/mongodb/logs/shard2.log --logappend -port 40000

about to fork child process, waiting until server is ready for connections.

forked process: 15515

child process started successfully, parent exiting

添加分片

#查看mongos的端口

~]# netstat  -ntpl|grep mongos

tcp        0      0 0.0.0.0:20000               0.0.0.0:*                   LISTEN      15361/mongos

#连接刚才启动的mongos192.168.211.217:20000

~]# /usr/local/mongodb/bin/mongo --port 20000

MongoDB shell version: 2.6.6

connecting to: 127.0.0.1:20000/test

#确认是连接下mongos

mongos> use admin

switched to db admin

mongos> db.runCommand({addshard:"192.168.211.217:30000",allowLocal:true })

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

mongos> db.runCommand({addshard:"192.168.211.217:40000",allowLocal:true })

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

注:allowLocal:true当路由进程和分片在同一台机器上要指定allowLocaltrue

#进入mongos进程config库可以看到目前分片的情况

mongos> use config

switched to db config

mongos> db.shards.find()

{ "_id" : "shard0000", "host" : "192.168.211.217:30000" }

{ "_id" : "shard0001", "host" : "192.168.211.217:40000" }

切分数据

默认的是不会将存储的每条数据进行分片处理,需要在数据库和集合的粒度上都开启分片功能

#数据库级别开启分片

#开启test库的分片功能

~]# /usr/local/mongodb/bin/mongo --port 20000

MongoDB shell version: 2.6.6

connecting to: 127.0.0.1:20000/test

mongos> use admin

switched to db admin

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

{ "ok" : 1 }

#连接test库长生测试数据emp集合

mongos> use test

switched to db test

。。。。。。。

mongos> db.emp.find();

{ "_id" : ObjectId("54b78bb75cb5db3323e5e57b"), "empno" : 7369, "ENAME" : "SMITH", "JOB" : "CLERK", "MGR" : 7902, "SAL" : 800 }

{ "_id" : ObjectId("54b78bb95cb5db3323e5e57c"), "empno" : 7499, "ENAME" : "ALLEN", "JOB" : "SALESMAN", "MGR" : 7698, "SAL" : 1600 }

{ "_id" : ObjectId("54b78bb95cb5db3323e5e57d"), "empno" : 7521, "ENAME" : "WARD", "JOB" : "SALESMAN", "MGR" : 7698, "SAL" : 1250 }

{ "_id" : ObjectId("54b78bb95cb5db3323e5e57e"), "empno" : 7566, "ENAME" : "JONES", "JOB" : "MANAGER", "MGR" : 7839, "SAL" : 2975 }

{ "_id" : ObjectId("54b78bb95cb5db3323e5e57f"), "empno" : 7654, "ENAME" : "MARTIN", "JOB" : "SALESMAN", "MGR" : 7698, "SAL" : 1250 }

{ "_id" : ObjectId("54b78bb95cb5db3323e5e580"), "empno" : 7698, "ENAME" : "BLAKE", "JOB" : "MANAGER", "MGR" : 7839, "SAL" : 2850 }

{ "_id" : ObjectId("54b78bb95cb5db3323e5e581"), "empno" : 7782, "ENAME" : "CLARK", "JOB" : "MANAGER", "MGR" : 7839, "SAL" : 2450 }

{ "_id" : ObjectId("54b78bb95cb5db3323e5e582"), "empno" : 7788, "ENAME" : "SCOTT", "JOB" : "ANALYST", "MGR" : 7566, "SAL" : 3000 }

{ "_id" : ObjectId("54b78bb95cb5db3323e5e583"), "empno" : 7788, "ENAME" : "SCOTT", "JOB" : "ANALYST", "MGR" : 7566, "SAL" : 3000 }

{ "_id" : ObjectId("54b78bb95cb5db3323e5e584"), "empno" : 7844, "ENAME" : "TURNER", "JOB" : "SALESMAN", "MGR" : 7698, "SAL" : 1500 }

{ "_id" : ObjectId("54b78bb95cb5db3323e5e585"), "empno" : 7876, "ENAME" : "ADAMS", "JOB" : "CLERK", "MGR" : 7788, "SAL" : 1100 }

{ "_id" : ObjectId("54b78bb95cb5db3323e5e586"), "empno" : 7900, "ENAME" : "JAMES", "JOB" : "CLERK", "MGR" : 7698, "SAL" : 950 }

{ "_id" : ObjectId("54b78bb95cb5db3323e5e587"), "empno" : 7902, "ENAME" : "FORD", "JOB" : "ANALYST", "MGR" : 7566, "SAL" : 3000 }

{ "_id" : ObjectId("54b78bb95cb5db3323e5e588"), "empno" : 7934, "ENAME" : "MILLER", "JOB" : "CLERK", "MGR" : 7782, "SAL" : 1300 }

#对集合进行分片(shardcollection

mongos> use admin

switched to db admin

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

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

mongos> use config

switched to db config

mongos> db.databases.find()

{ "_id" : "admin", "partitioned" : false, "primary" : "config" }

{ "_id" : "test", "partitioned" : true, "primary" : "shard0000" }

#“_id”,字符串。表示数据库名。

“ partioned”,布尔型。如果为true则表示开启了分片功

“primary”,字符串。这个值与“_id”对应表示这个数据库的大本营在哪里

mongos> db.collections.find()

{ "_id" : "test.emp", "lastmod" : ISODate("2015-01-15T09:48:49.919Z"), "dropped" : false, "key" : { "_id" : 1 }, "unique" : false, "lastmodEpoch" : ObjectId("54b78d0167f270682893cda6") }

mongos> db.chunks.find()

{ "_id" : "test.emp-_id_MinKey", "lastmod" : Timestamp(1, 0), "lastmodEpoch" : ObjectId("54b78d0167f270682893cda6"), "ns" : "test.emp", "min" : { "_id" : { "$minKey" : 1 } }, "max" : { "_id" : { "$maxKey" : 1 } }, "shard" : "shard0000" }

#这样emp集合就按照“_id”分片了,再添加数据,就会依据“_id”片键分散到各个片上

查看分片情况

mongos> sh.status()

--- Sharding Status ---

  sharding version: {

        "_id" : 1,

        "version" : 4,

        "minCompatibleVersion" : 4,

        "currentVersion" : 5,

        "clusterId" : ObjectId("54b7865f648316c44268333c")

}

  shards:

        {  "_id" : "shard0000",  "host" : "192.168.211.217:30000" }

        {  "_id" : "shard0001",  "host" : "192.168.211.217:40000" }

  databases:

        {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }

        {  "_id" : "test",  "partitioned" : true,  "primary" : "shard0000" }

                test.emp

                        shard key: { "_id" : 1 }

                        chunks:

                                shard0000       1

                        { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0)
请使用浏览器的分享功能分享到微信等