[toc]
stromal 2020-12-22 810浏览量
简介: 【MongoDB训练营】第一课:走进 MongoDB 答疑汇总
stromal 2020-12-24 265浏览量
简介: 【MongoDB训练营】第二课:MongoDB聚合框架 答疑汇总
问:数组中push元素时,如果文档慢慢变大,会不会出现关系型数据库中行迁移问题?此类问题需要如何优化?
答:push大量元素后,索引更新压力也是较大的,他的索引是 multikey index 同时不建议在数组中插入过多元素
一看就是oracle dba出没了。。。
这个问题我感觉不会,但是可能会出现数据倾斜。
问:mongodb 为什么只有左外连接?
答:join操作反范式设计,违反mongodb设计初衷,可以导致跨分片的查询,性能会有影响
右表不能是分片表
问:从Mysql迁移到mongodb成本有多少,有什么工具吗
答:数据模型都不一样了,业务迁移有一定成本,实际上是从关系型到文档型的数据库,业务访问逻辑也需要进行修改。
问:service的副本是几个,增加分片怎么扩容
答:底层是基于mongodb分片,每个shard是3副本的副本集,参见https://help.aliyun.com/document_detail/184598.html?spm=a2c6h.20980894.J_2725970650.3.5cfd4f50kLua7L 产品架构部分 提供az部署
根据业务压力由平台引擎自动扩容,主要参考业务压力kps及CU,CU概念参见https://help.aliyun.com/document_detail/184598.html?spm=a2c6h.20980894.J_2725970650.3.5cfd4f50kLua7L 读写吞吐量CU部分
问:仅能本地连接mongodb?
答:这个参见https://help.aliyun.com/document_detail/185471.html?spm=a2c6h.20980894.J_2725970650.5.5cfd4f50kLua7L
讲的很详细,
公网 首先要创建公网地址,设置白名单
问:买了mongodb是不是不需要自己创建索引?
答:目前阶段还是需要自己业务去创建的,但是老师也提到了后续的daas服务可以智能的创建索引
问:每天凌晨统计海量昨日订单,是交给数据库,还是交给业务?
答:从效率角度,数据库测运算减少了数据流转,如果数据库压力比较低,适合在数据库端。同时也解放了业务逻辑
问:遇到一个问题是在一个集合里面有几百万的数据,物理大小将近10G,通过一个索引字段做排序分页查询,通过skip、limit的方式查询越到后面越慢,有什么优化的方案
答:个人认为老师回答不正确,大家可以参考类似mysql类似的优化手段,网上类似的文章很多
可以不用skip,而通过where+limit的方式或者通过一个标记直接定位到下次要limit的起始位置
问:阿里云提供增量备份吗?原理是什么?
答:提供按时间点恢复的功能,全量备份+ operation log的方式实现
问:文档很大,update对性能影响大吗?
答:wiredtiger 是按照key-value来管理的,还是得有索引嘛
这个我感觉同学问的是集合,不知道对不对。。。
问:4.4版本增加了那些功能?
答:参见老师的社区文章,找到的同学补充下,比如可以更改shard key,全量同步的断点续传,等
兼容性较好,4.2迁移4.4 问题少
问:mongodb其他的引擎
答:现在默认是 wiredtiger 大部分都用这个,还有memory引擎,
问:mongodb最佳实践
答:参见老师的ppt
问:wiredTiger 内存淘汰策略是什么?可以更改吗?
答:我觉得这个问题可以参考官方文档,LRU
问:mongodb和mysql的qps差多少?mongodb可以代替mysql吗?mongodb适用于什么场景?mongodb的缓存模式可以替代mysql+redis吗?mogodb和redis的对比?
答:这个我自己回答吧
mongodb是文档性数据库,首先使用的场景和mysql就有很大不同,交易类的业务显然不适合用mongodb,但是日志系统具有文档属性,倒是很合适的,但是现在也有很多时序数据库,ch,elk等,所以用什么怎么用还是要看业务和能力。
mongodb适用于半结构,非结构数据,比如列不固定,数据一致性能力要求不高,扩展性比较高,但是现在mysql8 也在弥补这块能力。
问:建议开启balance吗?
答:建议开启,同时设置窗口
问:最后一个OLAP,OPTP的混合场景?
答:目前貌似只有大厂的产品感这么宣传吧,对还有最近挺火的tidb
stromal 2020-12-24 225浏览量
简介: 【MongoDB训练营】第三课:复制集使用及原理介绍 答疑汇总
1.MongoDB副本集模式下,如果复制其中一个 节点的DB目录文件到其他新的3台机器上,是否可以使用这3台机器组建一个副本集,而且不需要这3台机器间再去重新同步数据呢?
阿里云帮助文档:
https://help.aliyun.com/document_detail/58329.html
里面是只把数据复制到一台机器上,然后以单节点模式恢复MongoDB物理备份的数据,然后再删除单节点上local库中原有副本集配置信息,然后再准备两个空节点,跟这个单节点模式的节点initiate成一个新的集群。这样的话,需要在2个空节点间传送数据,现在想避免这种数据传送,请问老师该如何操作。
答:可以以拷贝数据文件的方式重新组建新的副本级节点,但是要注意数据的一致性。
最佳实践:以三节点副本集为例,可以把一个节点shutdown,拷贝数据到新节点,最后在主节点执行rs.add把新节点加入;fsynclock写锁定,保证数据是最新且一致的。
2.作为之前没有接触过mongodb的人感觉课程内容听不太懂怎么办?另外能不能介绍些mongodb severless的内容,官网介绍说它完美解决了MongoDB使用门槛高的问题,帮助中小客户轻松上云,那么它解决了哪些运维的门槛啊?
答:大家可以去mongodb大学进行自我学习,mongodb serverless 可以更加透明的提供mongodb服务,提供弹性的扩容;不需要关注太多的参数配置,最后就是性价比了,哈哈。
3.ops manager是可以单独购买的还是必须购买企业版?有没有可以备份oplog的第三方工具?如果没有现成的 工具如何在oplog写满时备份oplog
答:ops manager 可以在官网下载,可以做到实例部署、监控、慢日志分析,op log备份等;mongodb dump可以备份op log 另外阿里云也提供这个功能。
4.我在分片副本集上采用writeConcern=majority, readConcern=majority设置进行数据读写时,某个写操作由于返回writeConcernException而失败,但是随后的读操作却依旧能读到该写写入的值,请问老师这是因为问题出在哪?这样的写操作应该认为它写入成功了吗?
答:要关注这个writetimeout参数,比如5s,但是复制延迟比较高,还没有及时复制到备库,但是再有一会时间,就满足了majority,那么再等一会是都可以都读到的,还有就是readConcern 比如是local的话是本地就是可以读到的。
5.Q1. 副本集 和 复制集 是两个概念 还是一个?
Q2. linux 环境下 安装的 MongoDB 的日志默认存放位置在哪儿?
Q3. 同步时在什么时候判定同步完成?
答:副本集和复制集是一个概念,replication set
op log 存放的位置是可以通过参数配置的。
system log:
path
storage:
dbpath:
使用下面的命令可以检查集群同步的状态及一致性:
rs.status
rs.PrintSlaveReplicationInfo
rs.PrintReplicationInfo
6.可以讲解一下因果一致性吗?
答:因果一致性,个人感觉这块不清楚的可以了解下事务隔离级别,参考老师的链接。
7.数据量 特别大,比如超过1T 的副本集有什么比较好的备份方案么?
答:阿里云 云盘提供快照功能实现备份,建议配置hidden节点专门进行备份运维操作。
8.请问采用三节点副本集的mongo时,会有可能出现由于副本集同步时间差的问题,造成数据从副本读取缺失?这种情况可以通过什么办法避免呢?
答:异步复制,要避免这种情况,还是要减少大批量事务,
如果对一致性要求有一定要求,可以设置合适的readconcern,writeconcern,比如都是majority可以兼顾性能和数据的一致性要求。
9.云数据库平台开发,问题1的扩充,如果是使用物理备份的话,三个节点都用的其他节点的物理备份。新建副本集时,rs.init好像会清除掉oplog,secondary和hidden节点认为自己无法进行部分同步,最后导致全量同步,这个问题请问怎么解决?
答:问题1 的回答是针对新建实例加入现有副本集的情况
10.增加了事务处理的三节点mongo,事务提交的延迟时间,节点同步的延迟时间是怎么处理的呢?
答:表示一样不太明白,节点同步延迟时间,主要看primary、secondary的负载,
事务的提交延迟如果硬要和节点的同步延迟扯上关系 我感觉就是那个writeconcern 你是majority还是其他。
11.请问夏老师从ops监控里面看到cursor timeout会经常出现,如何能定位到具体的timeout语句?
答:还是要开发人员及时关闭cursor,另外监控的话 我觉得可以从应用或者中间层测打一些标记。
12.刚刚视频;里的选举投票是什么意思,成员心跳又是什么意思?
答:高可用机制, raft这个在很多数据库如redis cluster 中都有应用,不了解的同学自学下,一劳永逸的事情
stromal 2020-12-25 231浏览量
简介: 【MongoDB训练营】第四课:分片集群的使用及原理介绍 答疑汇总
1.副本集和分片在生产环境中该如何取舍呢?有什么参考规律么?
答:副本集遇到的问题
副本集帮助我们解决了 读请求扩展,高可用等问题。那么业务场景进一步增长:
存储容量超出单机磁盘容量;活跃数据集超出单机内存容量:很多读请求需要从磁盘读取写入量超出单机IOPS上限mongodb分片集群:水平扩容的方式,支持大数据集和稿吞吐量的情形副本集升级到分片集群 ,客户端需要重启。
2.change stream的机制是什么,mongoclient在change stream是长连接还是短连接
答:change stream 进行op log的解析和读取,目测是长连接。类似oracle的ogg个人感觉。
3.分片架构比副本集在SQL聚合查询上是否有优势?
答:这个可以利用到多shard并发IO的能力,但是数据仍然要经过网络最终有mongos向外输出,如果是高IO,但是最终输出的结果比较少的话,sharding是有优势的。经过Mongos多一跳确实优势不明显。
4.现网低版本3.2的mongodb分片集群,想要升级到高版本,如何操作比较好,有什么最佳实践?
答:参考mongodb官方文档,先升级config节点,再shard节点,最后mongos节点,并结合滚动升级的方式。
5.现有2节点的sharding,数据量比较大了,单节点1T左右,加起来7万多个chunk,每天开了 0点到6点的balance,然后想着再扩容2个sharding节点,这样的话是不是只在规定的时间内balance?这样的话是不是要好几天才能均衡完?
答: 每个shard同一时间只能迁移一个chunk,可以在congfig日志中查看chunk迁移速度。一定会在规定时间内进行chunk迁移的触发,对是触发。
6.shardkey 的选择、 类型的选择 ,chunk要 大小的设置 能在稍微讲讲吗?
答:参见课程ppt,绝对是讲到了,比如基数足够大,频率足够低,单调递增的话用hash
chunk的大小建议保持默认值,太大可能有数据不均衡,太小导致过多不必要的迁移。
参见群里文档链接。
7.修改分片键的 命令中的前缀怎么理解,该命令使用上有什么限制?
答: 以当前分片键的字段作为新分片键的前缀,比如原分片键用的字段A,那么新分片键(A,B)
8.Mongo数据订阅有哪些比较好的工具?阿里云有类似的订阅服务么?
答:阿里云DTS 可以支持数据迁移、同步、订阅,change stream可以实现数据库不同级别对象的数据订阅
9.chunk和shardkey的关系?
答:sharedkey是数据打散的依据,打散后数据会被存放在chunk,不同的chunk会存放在shared中,chunk是shared对数据管理的底层逻辑单位。
10.hashed 分片默认会分成多少个chunk?是按数据量增加分裂变多吗?
答:分片空数据集合进行hash分片,默认分裂为NUM(shard)*2个chunk;chunk默认chunk 64M 随着数据的增长,会进行分裂,当两个shard数据不均衡时,会进行balancing。
11.chunk数量有上限吗? hash桶会不会有用尽的情况?
答:应该不存在这个限制
stromal 2020-12-28 137浏览量
简介: 【MongoDB训练营】第五课:ChangeStream使用及原理介绍 答疑汇总
1.shardkey唯一值+hash的 数据是不是会更好的均匀分布?
答:hash可以实现均与分布,举个例子,我们生产中会对已时间分区的日志进行二级或者混合分区,即以天|月作为一级分区,在以hash作为二级分区。
2.mongos 有默认的 hash 函数吗?是什么?还是可以由用户自定义?
答:mongodb 不可以自定义hash函数。
3.是不是只有分片才能用mongos?
答:只有分片shard集群才可以使用mongos
4.MongoDB 配置文件 能分享下么 学习参考
答:mongodb配置参数可以参考官网说明。
5.Change stream 断点续传如何解决oplog被覆盖的问题。change stream消息是推送还是基于mongoclient的拉取?使用mongoclient 时是长连接还是短链接?
答:断点续传不能解决op log被覆盖的问题,老师解释了两种op log被覆盖的可能原因:
一是各种原因导致的消费速度赶不上生产速度,
二是短时间内产生很多和我要抽取的目标不相关的日志
change stream是长连接。
6.同城异地的复制集,如何保证同步?
答:复制集保证同步 primary-secondary 通过拉取回放op log实现数据同步
change stream也可以实现这个功能,但是原理不同。
7.Change Stream 和触发器的区别是?如果有个场景,比如物流状态变化,我们怎么对接上?
答:从应用层面 change stream和触发器是一个概念,只能说是实现解决同一问题的两个思路,但是实现原理上这根本就没有相关性。
8.change stream对系统性能影响几何?
答: 对系统性能影响开销取决于你系统自身的负载如何,目前是单线程的操作,主要开销是在解析上,综合来看,影响是比较小的。
stromal 2020-12-28 91浏览量
简介: 【MongoDB训练营】第六课:事务功能使用及原理介绍 答疑汇总
1,复制集默认的事务是那种啊?之前主从arber的架构,从节点挂了后,有7-8小时都没有恢复,发现主节点也写不下去,停库也停不了,只能kill。这种情况应该怎么办
A:事务参数不填的话,readConcern默认是local,writeConcer默认是1,这样并不是保持acid的snapshot隔离,可以认为大致满足read recommited且不满足持久化,也就是说事务写的数据在ha切换后,会出现丢失
又问 “但是kill之后,再次起库的时候用了10个小时,发现之前的很多oplog 都没落盘,要回滚,这个是什么原因啊”
A;可能你的写是majority的写,因为arbiter不包含数据,所以写不进去。不建议使用arbiter,建议1个primary+ 2个secondary的架构,这样主库挂了,仍有2个节点有数据。
再问 ”但是kill之后,再次起库的时候用了10个小时,发现之前的很多oplog 都没落盘,要回滚,这个是什么原因啊“
A:majority的写,必须写到2个节点后,才能完成,所以数据都没写成功
最后 ”好的,生产还是有不少主从arbiter的架构,担心这个问题再次出现,应该怎么调整majority的写“
A:一定要用主从arbiter的架构的话,那你的写最好用w:1,也就异步同步数据,主库奔溃的话,刚写的数据可能会丢一点
2,MongoDB副本集模式下,如果复制其中一个 节点的DB目录文件到其他新的3台机器上,是否可以独立使用这3台新机器组建一个副本集,而且不需要这3台机器间再去同步数据呢,因为他们本来的数据都是一样的?
前面的时候问过这个问题,老师说的是把新搭建的节点加入原来的集群里面,我是不能加入原来的集群里,只能用拷贝的这个DB目录新建一个副本集,是否可以?
A: 可以的,要以单节点的方式启动新机器上的数据,然后重新初始化为一个新副本集,配置文件里的一些ip port目录等配置参数要同步改一下
又问:这样的话,新副本集里面的新增加的节点岂不是要从这个单节点上同步数据吗,如果数据量有几百G,不是要很久吗?
A:新副本集的第一个阶段初始化好后,你再拷贝这个新节点的数据到其它2个机器上,再组件副本集,
第一个阶段 = 第一个节点, 新副本集的第一个阶段初始化好后,你再拷贝这个新节点的数据到其它2个机器上,再组件副本集
再问:用从原来的老副本集里拷贝的DB目录数据文件去启动节点不行,是吗?为什么呢?
A:应该也可以,你三个节点都以standby启动,然后再组建副本集
3,老师,我现在如果扩容一个数据节点就是 4个节点副本集运行,过几天变更的时候再踢掉投票节点,4个节点运行会不会有问题啊
A: 4个节点不会有问题的,就是高可用的效果跟3个节点一样
又问:4个节点选举不会出现问题吧,一般不是奇数个节点吗
A: 不会有问题,偶数节点相当于一个节点的数据浪费了,所以一般是奇数节点
stromal 2020-12-28 132浏览量
简介: 【MongoDB训练营】第七课:MongoDB最佳实践 答疑汇总 【内含前6天课程答疑链接】
1.请问关于MongoDB 5分片环境,每个分片的架构是主从arbiter(交叉部署), 把其中的部分片的一个副本节点迁移到新机器上,现在每个分片加入一个数据节点,以4个节点的方式运行(主从从arbiter), 变更当天,再切换剔除其中一个节点,这样的方案可行吗?变更当天需要登录mongos更新分片信息吗?期待老师的答复
A:可以的,添加新节点之后会自动进行数据同步,待数据同步完成,将老机器上的节点通过rs.remove()移除就可以了。为分片增加节点不需要更新mongos信息,这个不涉及到分片路由信息的变动。
2.单个分片的副本集以4节点运行可以吗
A: 如果本身已经有三个数据节点了(一个primary和两个secondary),不建议再加一个arbiter,保持投票节点为奇数个,防止脑裂场景
3.mongodb和es应用场景有何区别
MongoDB的适用场景TJ老师视频中也讲到了,ES的主要场景是全文检索、搜索、时序/日志分析等,还是有很多区别的
4.mongodb的周边生态建设太缓慢,比如sharding的一致性备份之类的,好像到目前还没有特别完善的方案。您怎么看mingodb的周边生态工具建设
A: 在MongoDB周边生态工具上,阿里云提供了DMS(可视化管理工具)、DBS(数据库备份)、DAS(数据库自治)、DTS(数据迁移)等服务,有兴趣可以关注。阿里云MongoDB提供了sharding的一致性备份方案,并且支持恢复到任意时间点,这个基于开源产品的话目前应该确实并没有比较好的方案,存在一些技术难点。
5.实时数据分析,有个场景,用oracle做的,sql比较能支持复杂条件语句查询分析,但是累计下来数据量越来越大,只能做结转,现在想迁移到用mongo做,但是感觉mongodb貌似不太支持复杂条件的sql查询,有什么好的处理办法吗?谢谢老师
A:这个要结合数据模型和业务查询需求来综合看,如果主要的查询分析请求需要涉及多表数据的关联查询,不建议用,除此之外,MongoDB是能满足很多复杂查询的,这个通过MongoDB提供aggregate的各种操作符,可以实现很强大的查询分析能力。
6.在mongodb内存放图片与视频,能讲一下实际的使用情况吗?
A: 这个可能需要看一下具体的case来看
7.这么大量的数据,memory 要求是不是特别高呢
A:MongoDB的分片扩展能力很好,对于大量数据,首先是可以通过sharding集群架构来解决数据分布问题,数据分摊到多个节点/机器来存储。通常来说,MongoDB使用的WiredTiger引擎的cache size与每个shard节点的磁盘数据量是有一个比例关系的。
8.mongo只用来记录api层的业务数据,提供业务单据的详情查询,后期的报表用es或者关系型数据库做为数据源,这种场景下,mongo是否需要做分片?从mongo将业务数据转成es需要的统计数据,这段处理可以用哪些方法实现呢?
A:MongoDB是否要做分片,主要还是当前数据量已经未来业务的增长情况,如果预估数据量会比较大、数据增长较快,则优先使用分片。将数据从MongoDB同步到ES,也有很多的方案,比如mongodb-connector、ES提供的插件都可以做。
【内含前6天课程答疑汇总】
Day1 走进MongoDB
https://developer.aliyun.com/article/780279
Day2 MongoDB聚合框架
https://developer.aliyun.com/article/780474
Day3 复制集使用及原理介绍
https://developer.aliyun.com/article/780482
Day4 分片集群的使用及原理介绍
https://developer.aliyun.com/article/780552
Day5 ChangeStream使用及原理介绍
https://developer.aliyun.com/article/780590
Day6 事务功能使用及原理介绍
https://developer.aliyun.com/article/780594