MongoDB 高手课
唐建法(TJ)
Tapdata CTO、MongoDB 中文社区主席、前 MongoDB 大中华区首席架构师
19351 人已学习
新⼈⾸单¥59
课程目录
已完结/共 53 讲
MongoDB 高手课
登录|注册
留言
22
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 26 | 分片集群设计
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
03 | 认识文档数据库MongoDB
04 | MongoDB特色及优势
05 | 实验:安装MongoDB
06 | MongoDB基本操作
07 | 实验:Hello World程序开发
08 | 聚合查询
09 | 实验:聚合查询
10 | 复制集机制及原理
11 | 实验:搭建MongoDB复制集
12 | MongoDB全家桶
13 | 模型设计基础
14 | JSON文档模型设计特点
15 | 文档模型设计之一:基础设计
16 | 文档模型设计之二:工况细化
17 | 文档模型设计之三:模式套用
18 | 设计模式集锦
19 | 事务开发:写操作事务
20 | 事务开发:读操作事务之一
21 | 事务开发:读操作事务之二
22 | 事务开发:多文档事务
23 | Change Stream
24 | MongoDB开发最佳实践
25 | 分片集群机制及原理
26 | 分片集群设计
27 | 实验:分片集群搭建及扩容
28 | MongoDB监控最佳实践
29 | MongoDB备份与恢复
30 | 备份与恢复操作
31 | MongoDB安全架构
32 | MongoDB安全加固实践
33 | MongoDB索引机制(一)
34 | MongoDB索引机制(二)
35 | MongoDB读写性能机制
36 | 性能诊断工具
37 | 高级集群设计:两地三中心
38 | 实验:搭建两地三中心集群
39 | 高级集群设计:全球多写
40 | MongoDB上线及升级
41 | MongoDB应用场景及选型
42 | MongoDB典型案例(一)
43 | MongoDB典型案例(二)
44 | 关系型数据库迁移
45 | 数据库迁移方式及工具
46 | Oracle迁移实战
47 | MongoDB + Spark实时大数据
48 | MongoDB + Spark连接实战
49 | MongoDB SQL套接件
50 | MongoDB与微服务
51 | MongoDB与数据中台
52 | MongoDB数据中台案例
53 | 结果测试&结束语
登录 后留言

全部留言(22)

  • 最新
  • 精选
lostsky
老师,请问email的例子里,user_id & time做片键,就是说一个user_id下的邮件还是会因为time的不同落到不同分片上。 如果只按user_id查询,就意味着查询请求会发向所有分片?

作者回复: 不会,因为根据user_id的值,你可以从config里面获得准确的shard#。只有少数几个(取决分片数)user_id 才需要跨分片。其他的都是指定分片

2020-04-07
3
6
Mr.zhou
email系统以user_id作为片键,为什么会造成超级快?难道chunk达到一定的大小后,不会分裂吗?不会生成新的chunk?

作者回复: chunk的是以片键值的upper bound 和 lower bound范围决定的。如果user_id是片键,那么对于user_id:1000,在他的email数量达到一定程度,不断分块后最后的就是: user_id >= 1000(包含1000) user_id < 1001( 不包含) 到了这一步,这一块里面只有他自己一个人的数据了。如果继续增长,你已经无法只用user_id这一个字段作为范围键来定义多余一个的chunk了。这时候就会早场超级块

2020-09-08
4
月迷津渡
这里有个问题没理解,工作集大小是热数据加索引数据,隐含的意思就是索引数据和热数据都是全量在内存里的?如果是的话,索引数据是mongodb自己维护在内存的?热数据是自己应用程序维护在内存里的?

作者回复: mongodb使用LRU算法对缓存数据进行管理。热数据和索引数据,他们本身的特性就决定了会经常被访问。你只要提供足够大小的缓存空间,他们自然就会被mongo留在缓存里,因为被经常访问缘故。 应用程序不用自己维护缓存数据。

2020-01-24
4
polk
是否可以理解为,userId + time, 同一个userId都在同一个分片,time使其在同一个分片分散在不同的块上。

作者回复: 你的理解正确。如果同一个userid下面的行数很多的时候,使用time可以将数据分布到多个块上。

2020-07-27
3
沈洪彬
关于分片这个感觉和 mysql+mycat这种差不多。这里有个疑问: 如果查询没有使用分表键,那么理论上查询会分发到多有的具体集群执行。那么这个结果的汇总(可能存在排序/分组) 在那里做呢? 是在mongos的内存上,还是config的内存上? mycat那种实在mycat中间件机器上,但是我看前面说mongos是无状态的

作者回复: 在某一个shard的主节点上进行合并排序。 “mongos 是无状态的“ - 合并排序操作不需要记状态。但是确实不是在mongos做的。 和mysql/mycat架构上类似,但是对应用基本是全透明,使用上几乎和未分片的复制集没有区别。对程序员的使用体验更好

2020-02-27
3
乖,摸摸头
我的分片集群有 2个shard, 集合shard key 使用 _id:"hashed" ,写入数据能正常分布到2个shard 上去,当使用 shard key 使用{user_id:1,time:1} 时,数据始终分布在一个 分片上面,无论我怎么调整插入 user_id 和 time 的值,请教老师,这是为什么?

作者回复: 开始的时候你都是写入到同一个chunk,只有到了一定的量以后,超过chunk的阈值,chunk 会拆分变成2个或者更多,然后chunk会迁移到另一个分片。这个时候你的写入就会分布了。

2020-06-11
2
李英权
老师,是整个数据库超过2T还是单个集合超过2T的时候需要分片? 我设想 如果我的项目需要分片的时候,大概率是某一个集合太大了,这时是不是只需要对这个集合设置分片键?其它小集合怎么处理呢 不做任何设置 它们会被mongodb怎么安排?

作者回复: 分片是基于单表的。 不分片的集合默认留在主分片上。你也可以通过movePrimary 命令调整主分片所在位置。

2020-04-01
2
Hoboson!
老师好:我们生产使用的是分片模式,但是有一个集合没有建片键,这个集合现在太大了占了7.4TB, 1:现在怎么建片键,可以建吗? 2:建了片键之后会不会影响之前的数据查询

作者回复: 1)可以,直接用shardCollection就可以 2)不会。 数据均衡可能会花很长时间(数天),这是正常的。

2020-03-04
2
1
t86
老师,用userid加time做片键,在查询时会有需要等待多个分片的结果一起返回的问题吗?

作者回复: 如果你的查询条件里有userid,就不会用到多个分片。 如果你的查询条件里没有userid,就会发散到多个片

2020-01-19
1
Jason
老师,请教一个问题,数据大小与机器配置有没有经验换算方式,比如1TB数据,1主2从复制集,单台服务器需要多大的配置,CPU、内存,还是需要模拟压测

作者回复: 官方没有标准算法 - 根据workload的不同,硬件配置可以差别很大。你可以参考MongoDB Atlas上面有个机器大小可以支持的Connections,所以从应用要支持的连接数,可以做一个反推。但是并不考虑你的数据量,所以只是个概括估计。 https://docs.atlas.mongodb.com/connection-limits/index.html

2020-01-11
1
收起评论