MongoDB学习整理
MongoDB学习整理
[TOC]
想解决什么问题?目标是什么?
有一些场景下不需要强一致性,而是需要:
- 更强的可用性。
- 更好的可扩展性,一台机器不够,需要大量的机器扩展。
mongodb作为文档数据库在解决这个问题。
-
它将数据以document为单位存储,每个document是一个json格式的数据;
-
document组成collection,代表着一类数据。其中collection没有强schema定义,可以存储结构不完全一样的数据,又应用层来处理结构不一致。
有什么优势和劣势?
优势
-
高可用
-
高可扩展
-
没有schema,schema改动不需要dba支持,足够灵活
劣势
- 缺少强一致性。(最新的版本已经支持Trancation,这一条还满足吗?)
- 如果数据的使用场景比较灵活,可能按照document的方式存储在某些场景下会放大读写,影响性能。这时候更建议使用关系型数据库。
有哪些场景?
- Aggregate模型(开发中的领域模型,代表着要处理的某种问题,和实际业务相关,比如管理用户可能会定义一个User结构的模型)比较确定,这种情况下存储在mongodb的document更直接简单,避免了关系型数据库的table和实际的模型的转换。
- 为了扩展以支持海量数据,关系型数据库的扩展比较复杂,需要应用层做更多的工作。
- 对ACID没有强要求,希望在一致性/可用性/持久性上做调优,比如牺牲一定的一致性获得更强的可用性。
核心组成是什么?
-
mongod
-
router
-
config server
底层有哪些关键实现?
分片是怎么做的?
- range sharding, 基于索引创建,数据会根据数据范围被自动路由到不同的分片。
- hash sharding,基于hash索引创建,根据hash值路由到不同的分片。
- zone sharding,管理员自定义zone以及zone在哪些机器,再定义规则‘哪些数据路由到哪些zone’
有哪些类似技术,对比它们。
TODO
实践(不保证是最佳实践)
分片怎么做?
对saas系统来说,数据都是以organization为单位,所以可以根据organizationId来做sharding。
备份和恢复怎么做?
pbm is used to backup and restore, the data is stored in s3.