MongoDB之分片集群(Sharding)

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: MongoDB之分片集群(Sharding)一、基本概念分片(sharding)是一个通过多台机器分配数据的方法。MongoDB使用分片支持大数据集和高吞吐量的操作。

MongoDB之分片集群(Sharding)

一、基本概念

分片(sharding)是一个通过多台机器分配数据的方法。MongoDB使用分片支持大数据集和高吞吐量的操作。大数据集和高吞吐量的数据库系统挑战着单一服务的性能。例如:高查询率将耗尽CPU的性能。大于系统RAM的工作集将给磁盘的IO很大的压力。

应对系统的增长有两个方法:垂直扩展和水平扩展。

垂直扩展的方法是提升单一服务的性能,例如:使用一个更强的CPU,或更多的内存,或提升大量的存储空间。可用技术的局限性将限制单一服务的工作负载。另外基于云的提供者也有硬件配置的上限。所以,垂直扩展是有上限的。

水平扩展的方法是将系统的数据集分配到多个服务上,添加额外的服务可以提升系统的能力。一个单独机器的性能和速度可以不是很高,每台机器处理整个工作负载的一个子集,潜在地相比一个单一的高速度、高性能的服务,提供了更好的性能。扩展部署的能力仅仅需要添加额外的需要的服务,这比添加高档的硬件要便宜不少。

1.1分片集群

MongoDB 的分片集群由下面的几个组件组成:

  • 分片(shard):每个分片包含了分片数据的一个子集,每个分片可以作为一个副本集部署。
  • mongos:mongos扮演者查询路由的角色,提供着客户端应用和分片集群的接口。
  • config servers:配置服务存储着集群的元数据和配置设置,MongoDB3.4以后,配置服务必须部署成副本集。

下图描述了分片集群中,各个组件的交互

image1

mongodb在collection级别对数据进行分片,分配collection数据到集群中的每一个分片。

1.2分片主键(shard keys)

为了在集合中分配文档,MongoDB使用分片主键分割集合。分片主键由不重复的字段或者字段集合组成。

对一个集合分片时,你要选择分片主键,分片主键在分片以后不能修改。一个分片集合只有一个分片主键。

为了对非空的集合进行分片,集合必须有一个以分片主键开头的索引。对于空集合,如果集合对于分片主键没有一个合适的索引,MongoDB将创建索引。

分片主键的选择将影响分片集群的性能、效果和扩展能力。一个最佳的硬件和基础设施的集群的瓶颈取决于分片主键的选择。分片主键的选择将影响你的集群使用的分片策略。

1.3区块(chunks)

MongoDB分割分片数据到区块,每一个区块包含基于分片主键的左闭右开的区间范围。在分片集群中,MongoDB通过分片迁移区块,使用分片集群权衡器。权衡器视图完成一个公平的区块平衡,通过集群中所有的分片。

1.4分片的优点

MongoDB通过集群中的分片分配读和写的工作负载,允许每个分片处理集群中的一部分操作,读和写的工作负载可以通过添加分片进行横向扩展。包含分片主键或者组合主键前缀的查询,mongos可以定位这个查询到特定的分片或者分片子集上。这种定位操作比广播到所有分片要高效的多。

集群中的分片存储整个数据中的一部分,随着数据的增长,增加额外的分片可以增加集群的存储能力。

即使集群中的一个或多个分片不可用,集群也可以继续执行一部分读写操作。在宕机期间,不可用的分片上的数据是不能够处理的,可用分片上的读写操作是可以被成功处理的。在生产环境,每一个分片将被部署成副本集,提供可增长的冗余和高可用。

1.5 分片之前的考虑

分片集群的基础需求和复杂性需要小心的计划、执行和维护。谨慎地考虑分片主键是确保集群性能和效率所必须的。在分片之后,你不能改变分片的主键,也不能使集合不分片。如果查询不包含分片主键或者组合主键的前缀,mongos将执行广播操作,查询所有分片,这些查询将执行很长时间。

1.6分片和不分片集合

一个数据库可以有分片集合和不分片集合的混合,分片集合通过集群中的分片进行分割和分配,不分片集合将存储在基础分片中。每个数据库都有一个自己的基础分片。

image2

1.7 连接分片集群

你必须连接mongos路由和集合中的集合进行交互。这包含分片和不分片的集合。客户端绝不可能连接一个单独的分片进行操作。你可以像连接mongod一样连接mongos,他们是一样的。

image3

1.8分片策略

MongoDB支持两种分片策略进行数据分片。

Hash分片

Hash分片是计算一个分片主键的hash值,每一个区块将分配一个范围的hash值。

image4

当分片主键中的一个范围被“关闭”,他们的hash值不可能在相同的区块中。基于hash值分布的数据促使了更多的数据分布,特别是分片主键单调变化的数据集。

Hash分布意味着基于分片主键的范围查询很少可能命中一个单一的分片,导致了更多的广播操作。

范围分片

范围分片是基于分片主键的值切分数据,每一个区块将会分配到一个范围。

image5

分片主键的范围被“关闭”,他们也很有可能落在相同的区块中。这使得mongos可以路由操作到请求数据的分片上。范围分片的效率取决于分片主键的选择,欠考虑的分片主键将导致数据分布不均匀。这将取消一些分片的益处,还可以导致性能瓶颈。

二、分片集群的搭建

由于测试机有限,这里我们只展示最简单的分片搭建,即一个分片、一个配置服务、一个路由。

image6

首先,我们启动配置服务,配置服务的mongodb的配置文件如下:

sharding:
  clusterRole: configsvr
replication:
   replSetName: "rs"
net:
   bindIp: 192.168.2.233

clusterRole设置成configsvr,表名这个mongod是配置服务;副本集的名字叫做“rs”。

./bin/mongod --config conf/mongod.conf

然后,我们通过mongo shell连接这个mongod实例。

mongo --host 192.168.2.233 --port 27019

值得注意的是,配置服务启动时,默认的端口是27019,本人一开始并没有注意到,一直连接27017,连接不上,最后才发现端口不对。然后添加副本集。

rs.initiate()

返回如下:

{
    "info2" : "no configuration specified. Using a default configuration for the set",
    "me" : "192.168.2.233:27019",
    "ok" : 1,
    "operationTime" : Timestamp(1519283130, 1),
    "$gleStats" : {
        "lastOpTime" : Timestamp(1519283130, 1),
        "electionId" : ObjectId("000000000000000000000000")
    },
    "$clusterTime" : {
        "clusterTime" : Timestamp(1519283130, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

当出现ok=1时,说明添加成功了。

其次,我们启动shard实例。配置文件的内容如下:

sharding:
   clusterRole: shardsvr
replication:
   replSetName: "rs0"
net:
   bindIp: 192.168.2.234

clusterRole配置shardsvr,说明这个实例是shard实例。副本集的名字我们叫做“rs0”,区别于配置服务的“rs”。启动mongod实例

./bin/mongod --config conf/mongod.conf

通过mongo shell连接这个实例

./bin/mongo --host 192.168.2.234 --port 27018

注意shard的实例启动时端口默认为27018。然后初始化副本集

rs.initiate()

返回结果如下:

{
    "info2" : "no configuration specified. Using a default configuration for the set",
    "me" : "192.168.2.234:27018",
    "ok" : 1
}

最后启动mongos实例,配置文件内容如下:

sharding:
  configDB: rs/192.168.2.233:27019
net:
   bindIp: 192.168.2.235

configDB是配置服务副本集的名字,格式如下:副本集名称/ip:端口。启动mongos实例

./bin/mongos --config conf/mongod.conf

注意这里的命令是mongos,而不是之前的mongod。通过mongo shell连接这个实例

./bin/mongo --host 192.168.2.235 --port 27017

这里的端口是mongodb的默认端口27017。向集群中添加分片

sh.addShard( "rs0/192.168.2.234:27018")

分片的格式为:副本集名称/ip:端口。然后添加分片的数据库

sh.enableSharding("<database>")

配置分片的集合和主键

sh.shardCollection("<database>.<collection>", { <key> : <direction> } )

<key>为主键字段的名字。

<direction>为以下3种:

  • “1”:主键值正向遍历;
  • “-1”:主键值反向遍历;
  • “hashed”:主键hash值

至此,MongoDB的分片集群介绍完了。

相关实践学习
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天
44 2
|
3月前
|
存储 监控 NoSQL
*MongoDB的水平扩展主要通过分片技术实
*MongoDB的水平扩展主要通过分片技术实
55 5
|
3月前
|
存储 NoSQL 前端开发
MongoDB 分片总结
这篇文章总结了MongoDB分片的概念、集群结构、分片实例、配置和测试过程。
105 6
|
7月前
|
存储 负载均衡 NoSQL
MongoDB分片技术:实现水平扩展的利器
【4月更文挑战第30天】MongoDB的分片技术是应对数据增长和复杂业务需求的解决方案,它将数据水平拆分存储在多个实例上,实现数据库的水平扩展。分片带来水平扩展性、负载均衡、高可用性和灵活的数据管理。分片工作涉及mongos路由进程、config server和shard实例。设置分片包括部署配置服务器、添加分片、启动mongos、配置分片键和开始分片。选择合适的分片键和有效管理能确保系统性能和稳定性。
|
4月前
|
存储 NoSQL 算法
MongoDB保姆级指南(中):从副本集群、分片集群起航,探索分布式存储的趋势!
本文一起来聊聊MongoDB集群,顺带以MongoDB集群为起点,共同探讨一下分布式存储的发展趋势~
453 15
|
5月前
|
自然语言处理 运维 NoSQL
MongoDB集群同步
实现 MongoDB Cluster-to-Cluster 即集群同步的工具是:mongosync 详情可参考如下官方文档: https://www.mongodb.com/zh-cn/docs/cluster-to-cluster-sync/current/quickstart/ 以上这个地址的文档一看就是机器翻译的,可能有不恰当的地方,但基本可参考使用。 以下是本次在某项目地配置集群同步的简要步骤,可参考使用。
95 6
|
4月前
|
存储 运维 NoSQL
轻松上手:逐步搭建你的高可用MongoDB集群(分片)
【8月更文挑战第13天】在数据激增的背景下,传统单机数据库难以胜任。MongoDB作为流行NoSQL数据库,采用分片技术实现水平扩展,有效处理海量数据。分片将数据分散存储,提高并发处理能力和容错性,是高可用架构基石。构建MongoDB集群需理解shard、config server和router三组件协同工作原理。通过具体实例演示集群搭建流程,包括各组件的启动及配置,确保数据高可用性和系统稳定性。合理规划与实践可构建高效稳定的MongoDB集群,满足业务需求并支持未来扩展。
136 0
|
7月前
|
NoSQL 算法 测试技术
【MongoDB 专栏】MongoDB 的自动分片与手动分片
【5月更文挑战第11天】MongoDB的分片技术在处理大规模数据和高并发场景中至关重要,提供自动和手动两种方式。自动分片基于预定义规则,简化管理,适合大部分场景,但灵活性有限。手动分片则允许用户自定义策略,实现高效布局,适用于有特殊需求的应用,但配置复杂。选择分片方式需考虑业务需求、数据特点和技术能力。正确实施分片策略能构建高性能、可扩展的系统,支持企业业务发展。随着技术进步,未来的分片技术将更加智能和易用。
203 3
【MongoDB 专栏】MongoDB 的自动分片与手动分片
|
7月前
|
存储 监控 NoSQL
【MongoDB 专栏】MongoDB 分片策略与最佳实践
【5月更文挑战第10天】MongoDB 分片是应对大数据量的扩展策略,涉及哈希和范围分片两种策略。分片架构包含分片服务器、配置服务器和路由服务器。最佳实践包括选择合适分片键、监控调整、避免热点数据等。注意数据分布不均和跨分片查询的挑战。通过实例展示了如何在电商场景中应用分片。文章旨在帮助理解并优化 MongoDB 分片使用。
282 3
【MongoDB 专栏】MongoDB 分片策略与最佳实践