Mongodb分片(Sharding)功能实现

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

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
目录
相关文章
|
2月前
|
存储 NoSQL 前端开发
MongoDB 分片
10月更文挑战第17天
39 2
|
7月前
|
Oracle NoSQL 关系型数据库
实时计算 Flink版产品使用合集之MongoDB CDC connector的全量快照功能可以并发读取吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
124 2
|
3月前
|
存储 监控 NoSQL
*MongoDB的水平扩展主要通过分片技术实
*MongoDB的水平扩展主要通过分片技术实
52 5
|
3月前
|
存储 NoSQL 前端开发
MongoDB 分片总结
这篇文章总结了MongoDB分片的概念、集群结构、分片实例、配置和测试过程。
84 6
|
4月前
|
存储 运维 NoSQL
轻松上手:逐步搭建你的高可用MongoDB集群(分片)
【8月更文挑战第13天】在数据激增的背景下,传统单机数据库难以胜任。MongoDB作为流行NoSQL数据库,采用分片技术实现水平扩展,有效处理海量数据。分片将数据分散存储,提高并发处理能力和容错性,是高可用架构基石。构建MongoDB集群需理解shard、config server和router三组件协同工作原理。通过具体实例演示集群搭建流程,包括各组件的启动及配置,确保数据高可用性和系统稳定性。合理规划与实践可构建高效稳定的MongoDB集群,满足业务需求并支持未来扩展。
126 0
|
4月前
|
存储 NoSQL 数据管理
揭秘MongoDB时间序列集合:这个超级功能将如何彻底改变你的数据管理?
【8月更文挑战第8天】时间序列数据记录随时间变化的信息,在数据库管理中至关重要。MongoDB自4.0版起引入时间序列集合,专为这类数据优化存储与查询。通过问答形式介绍其特点:自动数据过期、高效存储机制及快速查询操作。创建时需指定时间字段及可选元数据字段。支持设置数据过期时间,采用粗粒度索引减少I/O操作。查询时可通过时间范围筛选数据,并利用聚合框架进行数据分析。随着实时分析需求的增长,时间序列集合的应用将更加广泛。
189 0
|
7月前
|
NoSQL 算法 测试技术
【MongoDB 专栏】MongoDB 的自动分片与手动分片
【5月更文挑战第11天】MongoDB的分片技术在处理大规模数据和高并发场景中至关重要,提供自动和手动两种方式。自动分片基于预定义规则,简化管理,适合大部分场景,但灵活性有限。手动分片则允许用户自定义策略,实现高效布局,适用于有特殊需求的应用,但配置复杂。选择分片方式需考虑业务需求、数据特点和技术能力。正确实施分片策略能构建高性能、可扩展的系统,支持企业业务发展。随着技术进步,未来的分片技术将更加智能和易用。
189 3
【MongoDB 专栏】MongoDB 的自动分片与手动分片
|
7月前
|
存储 监控 NoSQL
【MongoDB 专栏】MongoDB 分片策略与最佳实践
【5月更文挑战第10天】MongoDB 分片是应对大数据量的扩展策略,涉及哈希和范围分片两种策略。分片架构包含分片服务器、配置服务器和路由服务器。最佳实践包括选择合适分片键、监控调整、避免热点数据等。注意数据分布不均和跨分片查询的挑战。通过实例展示了如何在电商场景中应用分片。文章旨在帮助理解并优化 MongoDB 分片使用。
274 3
【MongoDB 专栏】MongoDB 分片策略与最佳实践
|
6月前
|
存储 负载均衡 NoSQL
MongoDB的分片功能
【6月更文挑战第6天】MongoDB的分片功能
74 1
|
5月前
|
负载均衡 NoSQL 中间件