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
#连接刚才启动的mongos(192.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当路由进程和分片在同一台机器上要指定allowLocal为true
#进入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)