MongoDB Sharding(一) -- 分片的概念
(一)分片的由来
随着系统的业务量越来越大,业务系统往往会出现这样一些特点:
- 高吞吐量
- 高并发
- 超大规模的数据量
高并发的业务可能会耗尽服务器的CPU,高吞吐量、超大规模的数据量也会带来内存、磁盘的压力。
对于这类问题,解决系统增长的方法有2种:垂直扩展和水平扩展。
- 垂直扩展主要是增加单个服务器的资源。例如:使用增强大的CPU、增加更多的内存、使用固态硬盘等。
- 水平扩展主要是增加服务器。虽然单台服务器的整体速度或者容量都比较低,但如果每台服务器只处理工作量的一部分,则与单台服务器相比,可以提供更多的资源,提高效率。
垂直扩展终归有一个上限,例如,我已经用了最好的CPU、服务器主板也已经插满了内存、也使用了SSD存储设备,可是依然还是无法满足需求。那么这个时候就不得不考虑使用水平扩展了,通过增加机器,将业务、数据拆分到不同的机器上,实现业务的分流。
MongoDB是如何实现水平扩展的呢?Sharding,中文即分片。分片是指将数据拆分,将其分散放在不同主机上的过程。
(二)何时分片
如果在系统建设初期,就能够较为准确的评估出将来的业务量,那么直接在建设系统时就实施分片是最好的。但是在实际应用中,我们很难评估出将来的业务量大小,所以最好是在业务运行一段时间之后进行分片,当然,也不能在业务运行了几乎达到满负载运行时才进行分片,因为在近乎满负载的集群上不停机进行分片是非常困难的。通常,分片用来:
- 增加可用RAM
- 增加可用磁盘空间
- 减轻单台服务器的负载
- 处理单台服务器无法处理的吞吐量
(三)分片集群架构
一个完整的分片集群的架构如下图
其核心主要包括:mongos、config server、shard三部分。
(3.1)mongos
mongos是查询路由,在客户端程序和分片之间提供接口,用户如果要访问mongodb分片数据库,必须使用mongos。部署多个mongos可支持高可用性和可拓展性,一个常见的模式是在每个应用服务器上部署一个mongos,以减少应用程序和mongos之间的网络延迟。
mongos从配置服务器读取分片集群元数据并缓存下来,利用元数据,实现对客户端读写操作的路由。
(3.1.1)mongos如何处理查询修饰符
sort :如果查询语句不包含排序,则mongos实例将打开结果游标,对该游标分片上的所有游标进行轮询。
limit :如果使用limit限制了结果集大小,则mongos会将limit操作下发到分片上,然后再将limit操作用于分片返回的结果。
skip :如果查询中使用了skip,则不能将skip传给分片,而是从分片检索未跳过的结果,并将组装完结果后跳过指定的文档数量
(3.1.2)确认与mongos实例的连接
要检测客户端是否连接到mongos,使用isMaster命令,当连接到mongos时,会返回"msg" : "isdbgrid"。
db.isMaster() /* 1 */
{
"ismaster" : true,
"msg" : "isdbgrid",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2021-01-15T07:00:23.585Z"),
"logicalSessionTimeoutMinutes" : 30,
"connectionId" : 42,
"maxWireVersion" : 8,
"minWireVersion" : 0,
"ok" : 1.0,
"operationTime" : Timestamp(1610694017, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1610694017, 2),
"signature" : {
"hash" : { "$binary" : "AAAAAAAAAAAAAAAAAAAAAAAAAAA=", "$type" : "00" },
"keyId" : NumberLong(0)
}
}
}
(3.1.3)目标操作和广播操作
在分片集群中,最快的操作是使用mongos通过shard key路由到单个分片上,这种目标操作使用shard key定位满足查询的文档分片或分片子集。对于不包含分片键的查询,mongos必须查询所有的分片,然后将结果返回给客户端,这些“scatter/gather”查询可能会消耗更多的时间。
(3.1.4)元数据操作
mongos使用"majority"写关注操作元数据:
命令 方法
------------- ----------------
addShard sh.addShard()
create db.createCollection()
drop db.collection.drop()
dropDatabase db.dropDatabase()
enableSharding sh.enableSharding()
movePrimary
renameCollection db.collection.renameCollection()
shardCollection sh.shardCollection()
removeShard
setFeatureCompatibilityVersion
(3.1.5)FCV兼容性
从MongoDB 4.0开始,mongos尝试连接mongod实例时,如果mongos功能兼容版本(feature compatibility version,fcv)小于mongod,则会造成mongos的二进制文件崩溃。例如:
- 不能使用fcv是4.0版本的mongos连接到fcv是4.2版本的分片集群
- 可以使用fcv是4.2版本的mongos连接到fcv是4.0版本的分片集群
(3.2)config server
配置服务器存储集群的元数据,元数据反映分片集群的内所有数据和组件的状态和组织方式,元数据包含每个分片上的块列表以及定义块的范围。从3.4版本开始,已弃用镜像服务器用作配置服务器(SCCC),config Server必须部署为副本集架构(CSRS)。
Mongos实例缓存配置服务器的数据,并使用它路由读和写操作到正确的分片。当元数据发生改变的时候(例如:添加新的分片、chunks分裂),mongos更新缓存数据。此外,配置服务器还存储基于角色的用户权限信息。MongoDB也是用配置服务器管理分布式锁。每个分片集群都必须有自己的配置服务器,不能共享同一个配置服务器,配置服务器必须运行在WiredTiger存储。
(3.2.1)配置服务器的读写操作
在配置服务器上存在admin和config数据库,admin数据库包含身份验证以及授权相关的集合及其它的system.*集合,config数据库包含分片集群元数据的集合,当元数据发生变更时,MongoDB会将数据写入到config服务器。在做操作或者维护期间,我们应该避免直接去写配置服务器。当我们从副本集配置服务器读数据时,MongoDB使用”majority”读关注,以避免幻读;当我们从副本集配置服务器写数据时,MongoDB使用”majority”写关注,以确保数据不会丢失。
(3.2.2)配置服务器可用性
如果配置副本集丢失其主服务器并且无法选举主节点,则集群元数据变为只读,此时仍然可以从集群中读和写数据,但是不能够执行chunk合并、分裂等改变元数据的操作。
如果所有的副本集服务器不可用,集群将变得不可用。为了确保配置服务器保持可用和完整,备份就显得十分重要,配置服务器数据量很小,备份对主机的性能影响也相对较小。
(3.3.3)分片集群的元数据
分片集群的元数据存储在配置服务器的config数据库中。通常,永远不要直接编辑config数据库的内容,config数据库包含以下集合:
use config show collections
------------------------------
actionlog
changelog
chunks
collections
databases
lockpings
locks
migrations
mongos
shards
system.sessions
tags
transactions
version
(3.3)Shard
shard是存储数据的地方,每个shard包含集合的一部分数据,从3.6版本开始,每个shard必须部署为副本集(replica set)架构。
(3.3.1)主分片的概念
分片集群中的每个数据库都有一个主分片,其中包含该数据库所有未分片的集合。当在分片集群中创建一个新的数据库时,mongos会为新数据库选择一个分片作为主分片。选择的机制为:选择数据量少的分片作为新数据库的主分片。如下图:集群存在2个分片,对于Collection2集合,没有实施分片,则将全部数据存放在其主分片上。
特别注意:
主分片与副本集的主节点没有任何关系。
【完】
相关文档合集: 1. MongoDB Sharding(一) -- 分片的概念 |
MongoDB Sharding(一) -- 分片的概念的更多相关文章
- MongoDB Sharding(二) -- 搭建分片集群
在上一篇文章中,我们基本了解了分片的概念,本文将着手实践,进行分片集群的搭建 首先我们再来了解一下分片集群的架构,分片集群由三部分构成: mongos:查询路由,在客户端程序和分片之间提供接口.本次实 ...
- 02 . MongoDB复制集,分片集,备份与恢复
复制集 MongoDB复制集RS(ReplicationSet): 基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB)Paxos(mysql MGR 用的是变种)) 如果发生主 ...
- MongoDB学习笔记——分片(Sharding)
分片(Sharding) 分片就是将数据进行拆分,并将其分别存储在不同的服务器上 MongoDB支持自动分片能够自动处理数据在分片上的分布 MongoDB分片有三种角色 配置服务器:一个单独的mong ...
- MongoDB Sharding分片配置
Ps:mongod是mongodb实例,mongos被默认为为mongodb sharding的路由实例. 本文使用的mongodb版本为3.2.9,因此参考网址为:https://docs.mong ...
- Mongodb 笔记07 分片、配置分片、选择片键、分片管理
分片 1. 分片(sharding)是指将数据拆分,将其分散存放在不同的机器上的过程.有时也用分区(partitioning)来表示这个概念.将数据分散到不同的机器上,不需要功能强大的大型计算机就可以 ...
- 【七】MongoDB管理之分片集群介绍
分片是横跨多台主机存储数据记录的过程,它是MongoDB针对日益增长的数据需求而采用的解决方案.随着数据的快速增长,单台服务器已经无法满足读写高吞吐量的需求.分片通过水平扩展的方式解决了这个问题.通过 ...
- MongoDB Auto-Sharding(自动分片)入门介绍
MongoDB是10gen团队开发的一款面向文档的NoSQL数据库.最近一年多以来,MongoDB被越来越多的大型网站应用到生产环境中,比较著名的有Foursquare, bit.ly, Source ...
- [置顶] MongoDB 分布式操作——分片操作
MongoDB 分布式操作——分片操作 描述: 像其它分布式数据库一样,MongoDB同样支持分布式操作,且MongoDB将分布式已经集成到数据库中,其分布式体系如下图所示: 所谓的片,其实就是一个单 ...
- mongodb移除分片
MongoDB的Shard集群来说,添加一个分片很简单,AddShard就可以了. 但是缩减集群(删除分片)这种一般很少用到.由于曙光的某服务器又挂了,所以我们送修之前必须把它上面的数据自动迁移到其他 ...
随机推荐
- sqli-labs less38-53(堆叠注入 order by之后相关注入)
堆叠注入 less-38 less-39 less-40 less-41 less-42 less-43 less-44 less-45 考察order by相关注入 less-46 less-47 ...
- Linux shell 获取目录下时间最新的文件的文件名
ls -lt /dirname/ | grep filename | head -n 1 |awk '{print $9}' 逐条解释: ls -lt /dirname/ 列出此目录下的所有文件并按照 ...
- spark streaming 消费 kafka入门采坑解决过程
kafka 服务相关的命令 # 开启kafka的服务器bin/kafka-server-start.sh -daemon config/server.properties &# 创建topic ...
- 2020-2021-1 20209307《Linux内核原理与分析》第四周作业
一.Linux内核源代码简介 1.计算机三大法宝 存储程序计算机 函数调用堆栈 中断机制 2.操作系统两把宝剑 中断上下文的切换 进程上下文的切换 3.函数目录 Linux-3.18.6/arch/x ...
- vue第十八单元(单向数据流 vuex状态管理)
第十八单元(单向数据流 vuex状态管理) #课程目标 1.理解什么是数据管理模式 2.什么是vuex 3.什么时候使用vuex 4.vuex安装及工作原理 5.vuex语法 #知识点 1.首先来看下 ...
- PHP远程代码执行漏洞:CVE-2019-11043
漏洞详情: Nginx上fastcgi_split_path_info在处理带有 %0a 的请求时,会因为遇到换行符 \n 导致PATH_INFO为空.而php-fpm在处理PATH_INFO为空的情 ...
- Java基础知识面试题详解(2019年)
文章目录 1. 面向对象和面向过程的区别 2. Java 语言有哪些特点? 3. 关于 JVM JDK 和 JRE 最详细通俗的解答 JVM JDK 和 JRE 4. Oracle JDK 和 Ope ...
- 5行Python代码就能实现刷爆全网的动态条形图!
说起动态图表,最火的莫过于动态条形图了. 在B站上搜索「数据可视化」这个关键词,可以看到很多与动态条形图相关的视频. 好多视频都达到了上百万的播放量,属实厉害. 目前网上实现动态条形图现成的工具也很多 ...
- C# HTML帮助类 包括补全标签 截取HTML字符串包含标签
public static class HtmlHelper { /// <summary> /// 按文本内容长度截取HTML字符串(支持截取带HTML代码样式的字符串) /// < ...
- 配置redis服务器允许远程连接
说明 默认情况下,redis只允许本机访问.如果需要外部访问,需要修改下配置文件. 配置修改 redis.windows.conf 将bind 127.0.0.1 注释 将protected-mode ...