Mongodb分片(Sharding)功能实现

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介:

MongoDB 分片概述


分片

在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。

当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。


为什么使用分片

  • 复制所有的写入操作到主节点

  • 延迟的敏感数据会在主节点查询

  • 单个副本集限制在12个节点

  • 当请求量巨大时会出现内存不足。

  • 本地磁盘不足

  • 垂直扩展价格昂贵


MongoDB分片

下图展示了在MongoDB中使用分片集群结构分布:

sharding.png

上图中主要有如下所述三个主要组件:

  • Shard:

    用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障

  • Config Server:

    mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。

  • Query Routers:

    前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

分片实例

192.168.1.100 :   mongos

192.168.1.110 :   config server

192.168.1.101 :   Shard1

192.168.1.102 :   Shard2

以上四个主机上都以安装mongodb数据库。

一.配置config server

编辑配置文件mongod.conf:

1
vim  /etc/mongod .conf

添加如下并启用config server服务:

1
configsvr= true

重新启动mongodb服务:

1
service mongod restart

注:默认监听27019端口。也可以使用如下命令启动mongod进程。

1
# mongod --configsvr --dbpath <path> --port <port>

此时,默认端口由27017变为27019:

wKioL1jU5xDSUa-9AABB4cvrN-8860.jpg-wh_50

二.配置mongos实例

安装mongos:

1
yum  install  mongodb-org-mongos-2.6.1-1.x86_64.rpm

启动mongos:

1
mongos --configdb=192.168.1.110 --fork --logpath= /var/log/mongodb/mongos .log

注:mongos属于轻量级应用,完全可以与其它服务运行于同一节点;启动时,需要为mongos实例指明各config服务器的访问地址;

默认情况下,mongos监听于27017端口;可以使用如下命令启动mongos实例。

1
# mongos --configdb <config server hostnames((IP|Hostname):Port)>

也可以直接编辑配置文件:

1、注释dbpath指令;

2、添加configdb指令,并指定config服务器的地址;

而后使用如下命令启动mongos实例:

1
# mongos -f /etc/mongod.conf

登录mongos并配置shard节点:

1
2
3
4
5
mongo --host 192.168.1.100
mongos> sh.addShard( "192.168.1.101" )
"shardAdded"  "shard0000" "ok"  : 1 }
mongos> sh.addShard( "192.168.1.102" )
"shardAdded"  "shard0001" "ok"  : 1 }

查看shard状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mongos> sh.status()
--- Sharding Status --- 
   sharding version: {
"_id"  : 1,
"version"  : 4,
"minCompatibleVersion"  : 4,
"currentVersion"  : 5,
"clusterId"  : ObjectId( "58d4bd8a102ad4bdad74aa1d" )
}
   shards:
{   "_id"  "shard0000" ,   "host"  "192.168.1.101:27017"  }
{   "_id"  "shard0001" ,   "host"  "192.168.1.102:27017"  }
   databases:
{   "_id"  "admin" ,   "partitioned"  false ,   "primary"  "config"  }

启动sharding功能:

1
2
mongos> sh.enableSharding( "testdb" );
"ok"  : 1 }

注:mongodb的shard功能实现于collection级别,但若要在collection上启动shard,还需要事先其相关的数据库上启用之。在数据库上启用shard功能后,MongoDB会为其指定一个主shard。

启用过程需要mongos实例上实现,可以使用sh.enableSharding()方法,也可以使用db.runCommand()的“enableSharding命令,它们的使用格式分别如下所示:

1
2
sh.enableSharding( "<database>" )
db.runCommand( { enableSharding: <database> } )

此时,再次查看shard状态为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mongos> sh.status()
--- Sharding Status --- 
   sharding version: {
"_id"  : 1,
"version"  : 4,
"minCompatibleVersion"  : 4,
"currentVersion"  : 5,
"clusterId"  : ObjectId( "58d4bd8a102ad4bdad74aa1d" )
}
   shards:
{   "_id"  "shard0000" ,   "host"  "192.168.1.101:27017"  }
{   "_id"  "shard0001" ,   "host"  "192.168.1.102:27017"  }
   databases:
{   "_id"  "testdb" ,   "partitioned"  true ,   "primary"  "shard0000"  }

测试:

在collection上进行sharding:

1
2
mongos> sh.shardCollection( "testdb.student" ,{ "age" :1})
"collectionsharded"  "testdb.student" "ok"  : 1 }

插入数据:

1
2
mongos>  for  (i=1;i<=100000;i++) db.student.insert({name: "student" +i,age:(i%120),classes: "class+(i%10)" });
WriteResult({  "nInserted"  : 1 })

此时我们再次查看sharding状态如下:

wKiom1jU7KLzU_tMAAEpDByx8Kk967.jpg-wh_50










本文转自 SoulMio 51CTO博客,原文链接:http://blog.51cto.com/bovin/1910120,如需转载请自行联系原作者
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
6月前
|
运维 NoSQL 安全
【最佳实践】高可用mongodb集群(1分片+3副本):规划及部署
结合我们的生产需求,本次详细整理了最新版本 MonogoDB 7.0 集群的规划及部署过程,具有较大的参考价值,基本可照搬使用。 适应数据规模为T级的场景,由于设计了分片支撑,后续如有大数据量需求,可分片横向扩展。
485 1
|
1月前
|
NoSQL MongoDB
搭建MongoDB分片式集群
搭建MongoDB分片式集群
15 0
|
6月前
|
NoSQL MongoDB
MongoDB分片+副本集高可用集群的启停步骤
MongoDB分片+副本集高可用集群的启停步骤
139 0
|
8月前
|
存储 NoSQL MongoDB
MongoDB-分片片键
?> 那么紧接着上一篇的文章内容,如何将数据存储到不同的分片服务器上的? 答:通过分片片键
41 0
|
4月前
|
存储 人工智能 NoSQL
MongoDB推出高级数据管理功能,实现随处可运行应用程序
借助MongoDB Atlas for the Edge,企业不仅可以安全地存储数据,还可以跨越不同数据源和目的地实时同步数据,从而提供具有高可用性、高弹性和高可靠性的应用程序
|
5月前
|
NoSQL 测试技术 API
Eolink Apikit 版本更新:「数据字典」功能上线、支持 MongoDB 数据库操作...
Eolink Apikit 版本更新: 1. 搭建自定义接口协议架构,支持快速适配金融行业各类型私有协议的导入、编辑和展示。 2. 数据字典功能上线,支持以数据字典的形式管理参数枚举值。 3. 数据库连接支持 MongoDB 数据库操作。 4. 基于 Apikit 类型导入 API 数据支持增量更新。
33 0
|
7月前
|
存储 NoSQL MongoDB
MongoDB分片教程
MongoDB分片教程
203 0
|
8月前
|
NoSQL MongoDB 数据库
MongoDB-分片集群搭建
搭建配置服务器复制集: • 早期版本的配置服务器只要一台即可 • 最新版本 MongoDB 要求配置服务器必须是一个复制集
190 0
|
8月前
MongoDB-分片查询
用户的请求会发送给 mongos 路由服务器, 路由服务器会根据查询条件去配置服务器查询对应的数据段和属于哪个分片服务器, 如果用户查询的条件是分片片键字段, 那么路由服务器会返回保存在那一台分片服务器上, 路由服务器就会去对应的分片服务器获取数据, 并将取到的数据返回给用户。
106 0
|
8月前
|
NoSQL MongoDB
MongoDB-分片优化
分片的主要目的就是将数据分配到不同的服务器中保存, 提升服务器的容量, 让数据更加的均衡, 更有效的降低服务器的压力, 但是随着时间推移, 某些数据段中保存的数据会越来越多, 所以为了保证个分片均衡, 当某个数据段数据过多或体积过大的时候, 系统就会自动在下一次操作这个数据段时(新增/更新), 将一个大的数据段分裂成多个小的数据段。
124 0