MongoDB数据分片
随着数据集的扩大和吞吐量的提升,单个MongoDB服务器可能在cpu,内存或IO这些资源上出现瓶颈,这是需要对MongoDB进行扩展,比较经济的方式是水平扩展,将数据集分布到多个节点上来分散访问压力。这里的每个节点也称作分片,每个分片都是一个独立的数据库。所有的分片组合在一起才是一个完整的数据库。
MongoDB的分片框架中有3个角色:
1)Query Routers:路由
2)Config servers:元数据服务器
3)Shards:数据节点
工作机制:Query Routers用于接收用户的请求,将请求路由到对应的分片上(shards)执行,然后将结果返回给客户端。Config servers存储服务器集群的元数据,Query Routers通过使用这些元数据将请求定位至特定的shard节点。Shards节点存储数据,为了提供高可用性和数据一致性,每个shard都可以是一个副本集。在生产环境中,为了避免单点故障,Query Routers和Config servers往往有多个节点。
实现过程
实验环境:
Config server:192.168.1.106
Query Routers:192.168.1.131
Shared:192.168.1.138,192.168.1.127
1)配置config server
在192.168.1.106上更改配置文件信息:
[root@node1 ~]# vim /etc/mongod.conf
#replSet=rs0
#replIndexPrefetch = _id_only
configsvr = true
配置完成后启动服务:
[root@node1 ~]# service mongod start
Starting mongod: [ OK ]
可以看到对应的服务监听在27019上。
2)配置Query Routers
Query Routers节点只需要安装mongodb-org-mongos即可,无需安装其他的软甲包。
[root@node4 mongodb-2.6.5]# yum install mongodb-org-mongos-2.6.5-1.x86_64.rpm
默认情况下,mongos监听于27017端口,在启动mongos是需要指定config服务器的地址。
启动mongos:
[root@node4 ~]# mkdir /var/log/mongodb
[root@node4 ~]# mongos --configdb=192.168.1.106 --fork --logpath=/var/log/mongodb/mongo.log
也可以直接编辑配置文件:
1)注释dbpath指令
2)添加configdb指令,并指定config服务器的地址
3)启动mongos,命令:mongos -f /etc/mongod.conf
3)配置shard节点
shard(数据节点)的配置与配置mongodb一致,如果不是副本集,把以下两项注销。
#replSet=rs0
#replIndexPrefetch = _id_only
在两个shard节点上启动mongod服务:
[root@node2 ~]# service mongod start
Starting mongod: [ OK ]
###################
[root@node3 ~]# service mongod start
Starting mongod: [ OK ]
4)向分区集群中添加各shard服务器或副本集
连接mongos节点,添加shard。由于在mongos节点上仅安装了mongos的包,没有mongo命令,可以在其他节点上使用mongo --host 来连接。
[root@node1 ~]# mongo --host 192.168.1.131
MongoDB shell version: 2.6.5
connecting to: 192.168.1.131:27017/test
mongos>
添加shard节点:
mongos> sh.addShard("192.168.1.127")
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> sh.addShard("192.168.1.138")
{ "shardAdded" : "shard0001", "ok" : 1 }
可以看到节点已经添加成功,只是上面还没有数据,没有进行分片。
5)启用sharding功能
启用指定数据库的sharding功能:
mongos> sh.enableSharding("student_db")
{ "ok" : 1 }
################################
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 4,
"minCompatibleVersion" : 4,
"currentVersion" : 5,
"clusterId" : ObjectId("55e89a17f0cf218cb7edd0c5")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.1.127:27017" }
{ "_id" : "shard0001", "host" : "192.168.1.138:27017" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "student_db", "partitioned" : true, "primary" : "shard0000" } #显示该数据库已经支持分片
最后一行显示student_db数据库的partition为true,已支持数据分片功能。
指定需要分片的Collection及索引:
mongos> sh.shardCollection("student_db.students",{"age":1})
{ "collectionsharded" : "student_db.student", "ok" : 1 }
#################################
#插入数据
mongos> for (i=1;i<=100000;i++) db.students.insert({name:"student"+i,age:(i%120),address:"china_nb"});
WriteResult({ "nInserted" : 1 })
查看集群的状态信息:
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 4,
"minCompatibleVersion" : 4,
"currentVersion" : 5,
"clusterId" : ObjectId("55e89a17f0cf218cb7edd0c5")
}
shards:
{ "_id" : "shard0000", "host" : "192.168.1.127:27017" }
{ "_id" : "shard0001", "host" : "192.168.1.138:27017" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "student_db", "partitioned" : true, "primary" : "shard0000" }
student_db.students
shard key: { "age" : 1 }
chunks:
shard0001 1
shard0000 2
{ "age" : { "$minKey" : 1 } } -->> { "age" : 1 } on : shard0001 Timestamp(2, 0)
{ "age" : 1 } -->> { "age" : 119 } on : shard0000 Timestamp(2, 1)
{ "age" : 119 } -->> { "age" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 4)
可以看到数据已经分别存储在不同的shard上。
若需要分片时,数据已经存在,则需要对collection中的某一字段先创建索引,然后才能够分片。以上是MongoDB的简单应用。.................^_^
MongoDB 的详细介绍:请点这里
MongoDB 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-09/123320.htm