MongoDB 分片

MongoDB 分片

高数据量(消耗内存)和高吞吐量(消耗CPU)的数据库应用会对单机的性能造成较大压力,为了解决这些问题,一般采用两种方法:水平扩展(将数据集分布在多个服务器上)和垂直扩展(增加更多的CPU和存储资源)。

当MongoDB存储海量数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们可以通过分割数据,使得数据分布在多个服务器上。

1. 分片集群架构

  • Config Server:存储集群所有节点、分片数据数据信息等元数据信息,默认需要配置3个Config Server节点;
  • Mongos:专用路由进程,提供对外应用访问,将客户端发来的请求准确无误的路由到集群中的一个或一组服务器上,同时会把接收到的响应拼装起来发回客户端;
  • Shard:存储数据,以chunk为单位存储数据;
    在这里插入图片描述
1.1 Chunk

在Shard内部,MongoDB还会把数据分为chunks,每个chunk包含shard的一部分数据,chunk的产生有两个用途:

  • Splitting:当chunk的大小超过配置的chunk size(默认为64M)时,MongoDB的后台进程会把这个chunk切分成更小的chunk;
  • Balancing:balancer时一个后台进程,负责chunk的迁移,从而均衡各个shard的负载;
    在这里插入图片描述
    在这里插入图片描述
    chunk size的选择:小的chunk size数据均衡时迁移速度快,数据分布更均匀,但数据分裂频繁,路由节点消耗更多资源;大的chunk size数据分裂少,但数据块迁移消耗IO资源大,通常选择100M~200M;

2. 数据区分

2.1 分片键 shard key

MongoDB中的数据分片是以集合为基本单位的,集合中的数据通过shard key被分成多个部分。其实shard key就是在集合中选一个键,用该键作为数据拆分的依据。

注意:

  • shard key是不可变的;
  • shard key必须有索引;
  • shard key大小限制512bytes;
  • shard key用于路由查询;
2.2 以范围为基础的分片 Sharded Cluster

Sharded Cluster支持将单个集合的数据分散存储到多个shard上,用户可以指定根据集合内文档的某个字段(shard key)来进行范围分片。
在这里插入图片描述
在使用shard key做范围划分的系统中,拥有”相近”shard key的文档很可能存储在同一个数据块中,因此也会存储在同一个分片中。

2.3 基于哈希的分片

对于基于哈希的分片,MongoDB计算一个字段的哈希值,并用这个哈希值来创建数据块。在使用基于哈希分片的系统中,拥有”相近”shard key的文档很可能不会存储在同一个数据块中,因此数据的分离性更好一些。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m6vLrJ3T-1629876693789)(/Users/zhuchangzhen/Library/Application Support/typora-user-images/image-20210825113939332.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

How many ways HDU - 1978(记忆化搜索关于求多少种方式模板)

题目: 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m)。游戏的规则描述如下: 1.机器人一开始在棋盘的起始点并有起始点所标有的能量。 2.机器人只能向右或者向下走,并且每走一步消耗一单位…

Sql Server之旅——第七站 复合索引和include索引到底有多大区别?

索引和锁,这两个主题对我们开发工程师来说,非常的重要。。。只有理解了这两个主题,我们才能写出高质量的sql语句,在之前的博客中,我所说的索引都是单列索引。。。当然数据库不可能只认单列索引,还有我这篇的…

Go中new和make的区别

Go中new和make的区别 变量声明 当我们声明变量时可以使用var关键字,当不指定变量的默认值时,这些变量的默认值就是他们的零值,比如int的默认值为0,string的默认值为"",引用类型的零值为nil。 但是当我们在…

POJ 3159 Candies(差分约束+SPAF)

题意: 给n个小朋友分发糖果,但小朋友们之间有嫉妒心。接下来m行,每行三个数,分别表示小朋友A希望B得到的糖果不能比他多x个。要求你计算在满足所有小朋友的条件的情况下最多需要准备多少颗糖。 题目: During the ki…

掌握了Docker Layer Caching才敢自称精通Dockerfile

长话短说:本次原创将向您展示在Docker中使用Layer Cache以加快镜像构建。“这个话题的初衷在于:应用打包过程是很慢的(下载并安装框架&第三方依赖包、生成assets),这个过程在Docker中也不能避免。About Layer Caching in DockerDocker使…

Go unsafe Pointer

Go unsafe Pointer Go被设计为一种强类型的静态语言,强类型意味着类型一旦确定就无法更改,静态意味着类型检查在运行前就做了。 指针类型转换 为了安全考虑,两个不同类型的指针不能相互转换,例如: package mainfun…

How Many Answers Are Wrong HDU - 3038(带权并查集)

题意: TT写一个数列,现在TT会选择一个区间,然后让FF计算这个区间里面所有数的和,FF准备捉弄一下TT,有时候她会故意计算出来一个错的答案,当然TT也比较聪明,他会发现这个答案跟以前的答案会有冲…

ASP.NET Core on K8s学习之旅(14)Ingress灰度发布

【云原生】| 作者/Edison Zhou这是恰童鞋骚年的第236篇原创文章上一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和使用,然后我还录了一个快速分享小视频介绍了一下蓝绿发布和灰度发布策略的基本概念,本篇介绍一下如何实战使用Nginx Ingress实现…

[汇编语言]实验:应用更灵活的寻址方式来定位内存地址

实验内容: (1)将datasg段中每个单词的头一个字母改成大写字母。 datasg段中的数据为: (2) 将datasg段中每个单词的字母改成大写字母。 datasg段中的数据为: ibm dec dos vax …

Redundant Paths POJ - 3177(tarjan+边双连通分量)

题意: 有n个牧场,要求从一个牧场到另一个牧场,要求至少要有2条独立的路可以走。现已有m条路,求至少要新建多少条路,使得任何两个牧场之间至少有两条独立的路。两条独立的路是指:没有公共边的路&#xff0c…

Slice的本质

Slice的本质 我们先看下面的代码,看看它的输出是什么: package mainimport "fmt"type Slice []intfunc (A Slice) Append(value int) {A append(A, value) } func main() {mSlice : make(Slice, 10, 20)mSlice.Append(5)fmt.Println(mSlice…

你需要了解操作系统发展历程

本文我们大概回顾计算机操作系统发展历程,这里不会记录关于操作系统的完整历史记录,只是记录那些里程碑事件,看看各位接触计算机时,操作系统发展正处于哪个年代起初没有操作系统,没有编程语言或编译器,甚至…

[汇编语言]实验:更灵活的寻址方式 -应用si和di

实验内容: (1) 用寄存器SI和DI实现将字符串‘welcome to masm!’ 复制到它后面的数据区中。 (2) 用[bx(si或di)idata]的方式,来使程序变得简洁。 (1) 代码如下: assume ds:datasg,cs:code…

http.ListenAndServe()到底做了什么?

参考:https://studygolang.com/articles/25849?frsidebar ​ http://blog.csdn.net/gophers 实现一个最简短的hello world服务器 package mainimport "net/http"func main() {http.HandleFunc("/", func(w http.ResponseWriter, r *http.Reque…

Strongly connected HDU - 4635(tarjan+强连通分量)

题意: 给一个简单有向图,让你加最多的边,使他还是一个简单有向图。 题目: Give a simple directed graph with N nodes and M edges. Please tell me the maximum number of the edges you can add that the graph is still a …

C++编程基础题训练

1.编写一个c风格的程序&#xff0c;用动态分配空间的方法计算Fibonacci数列的前20项并存储到动态分配的空间中 1.代码如下 #include <iostream> using namespace std;int main() {int *a new int[25];a[0] 0;a[1] 1;for (int i 2; i < 20; i){a[i] a[i - 1] a…

基于 abp vNext 和 .NET Core 开发博客项目 - 使用Redis缓存数据

上一篇文章完成了项目的全局异常处理和日志记录。在日志记录中使用的静态方法有人指出写法不是很优雅&#xff0c;遂优化一下上一篇中日志记录的方法&#xff0c;具体操作如下&#xff1a;在.ToolKits层中新建扩展方法Log4NetExtensions.cs。//Log4NetExtensions.cs using log4…

G - 水陆距离 HihoCoder - 1478(广搜+队列先进先出性质)

题目&#xff1a; 给定一个N x M的01矩阵&#xff0c;其中1表示陆地&#xff0c;0表示水域。对于每一个位置&#xff0c;求出它距离最近的水域的距离是多少。 矩阵中每个位置与它上下左右相邻的格子距离为1。 Input 第一行包含两个整数&#xff0c;N和M。 以下N行每行M个0…