跳至主要內容
MongoDB 替换方案之PostgreSQL

MongoDB 替换方案之PostgreSQL

MongoDB 宣布其开源许可证从 GNU AGPLv3 切换到 Server Side Public License (SSPL), SSPL 明确要求托管 MongoDB 实例的云计算公司要么获取商业许可证要么向社区开源其服务代码。导致了一些商业公司为了规避风险,弃用MongoDB转而投入其它NoSQL方案。本文主要调研PostgreSQL替换MongoDB方案。

关于MongoDB V3版本证书

MongoDB 宣布其开源许可证从 GNU AGPLv3 切换到 Server Side Public License (SSPL)。新许可证将适用于新版本的 MongoDB Community Server 以及打过补丁的旧版本。AGPLv3 和 SSPL 在自由使用、自由修改和重新分发代码上没有区别。


gavin-james大约 10 分钟NoSQL MongoDBNoSQL MongoDB
Mongo进阶 - 性能:查询聚合优化

Mongo进阶 - 性能:查询聚合优化

在MongoDB中通过查询聚合语句分析定位慢查询/聚合分析。

问题描述

执行BI服务的接口, 发现返回一天的记录需要10s左右,这明显是有问题: img

问题分析

定位慢查询

为了定位查询,需要查看当前mongo profile的级别, profile的级别有0|1|2,分别代表意思: 0代表关闭,1代表记录慢命令,2代表全部


gavin-james大约 10 分钟NoSQL MongoDBNoSQL MongoDB
Mongo进阶 - 系统设计:模式构建

Mongo进阶 - 系统设计:模式构建

MongoDB使用文档数据模型具有内在的灵活性,允许数据模型支持你的应用程序需求, 灵活性也可能导致模式比它们应有样子的更复杂。这涉及到如何在MongoDB中设计数据库模式(schema),有一个严峻的现实,大多数性能问题都可以追溯到糟糕的模式设计。

前言

当涉及MongoDB时,一个经常被问到的问题是“我如何在MongoDB中为我的应用程序构造模式(schema)?”老实说,这要看情况而定。你的应用程序读操作比写操作多吗?从数据库中读取时需要将哪些数据放在一起?有哪些性能因素需要考虑?文档有多大?它们今后会变成多大?你预计数据会如何增长和扩展?


gavin-james大约 50 分钟NoSQL MongoDBNoSQL MongoDB
Mongo进阶 - DB核心:备份恢复

Mongo进阶 - DB核心:备份恢复

mongoexport/mongoimport导入/导出的是JSON格式,而mongodump/mongorestore导入/导出的是BSON格式

MongoDB的备份恢复

mongoexport/mongoimport导入/导出的是JSON格式,而mongodump/mongorestore导入/导出的是BSON格式。

JSON可读性强但体积较大,BSON则是二进制文件,体积小但对人类几乎没有可读性。


gavin-james大约 1 分钟NoSQL MongoDBNoSQL MongoDB
Mongo进阶 - DB核心:分片Sharding

Mongo进阶 - DB核心:分片Sharding

分片(sharding)是MongoDB通过水平扩展将数据集分布在不同的服务器上来提高自己的存储容量和吞吐量。和MySQL分区方案相比,MongoDB的最大区别在于它几乎能自动完成所有事情,只要告诉MongoDB要分配数据,它就能自动维护数据在不同服务器之间的均衡。

为什么要引入分片

高数据量和吞吐量的数据库应用会对单机的性能造成较大压力, 大的查询量会将单机的CPU耗尽, 大的数据量对单机的存储压力较大, 最终会耗尽系统的内存而将压力转移到磁盘IO上。


gavin-james大约 8 分钟NoSQL MongoDBNoSQL MongoDB
Mongo进阶 - DB核心:复制集

Mongo进阶 - DB核心:复制集

在实际的生产环境中,我们需要考虑数据冗余和高可靠性,即通过在不同的机器上保存副本来保证数据的不会因为单点损坏而丢失;能够随时应对数据丢失、机器损坏带来的风险。MongoDB的复制集就是用来解决这个问题的,一组复制集就是一组mongod实例掌管同一个数据集,实例可以在不同的机器上面。实例中包含一个主导,接受客户端所有的写入操作,其他都是副本实例,从主服务器上获得数据并保持同步。

为什么要引入复制集?

保证数据在生产部署时的冗余和可靠性,通过在不同的机器上保存副本来保证数据的不会因为单点损坏而丢失。能够随时应对数据丢失、机器损坏带来的风险。换一句话来说,还能提高读取能力,用户的读取服务器和写入服务器在不同的地方,而且,由不同的服务器为不同的用户提供服务,提高整个系统的负载。


gavin-james大约 17 分钟NoSQL MongoDBNoSQL MongoDB
Mongo进阶 - WT引擎:缓存机制

Mongo进阶 - WT引擎:缓存机制

WT 在设计 LRU Cache 时采用分段扫描标记和 hazard pointer 的淘汰机制,在 WT 内部称这种机制叫 eviction Cache 或者 WT Cache,其设计目标是充分利用现代计算机超大内存容量来提高事务读写并发。

为什么会需要理解eviction cache

从mongoDB 3.0版本引入WiredTiger存储引擎(以下称为WT)以来,一直有同学反应在高速写入数据时WT引擎会间歇性写挂起,有时候写延迟达到了几十秒,这确实是个严重的问题。引起这类问题的关键在于WT的LRU cache的设计模型,WT在设计LRU cache时采用分段扫描标记和hazardpointer的淘汰机制,在WT内部称这种机制叫eviction cache或者WT cache,其设计目标是充分利用现代计算机超大内存容量来提高事务读写并发。在高速不间断写时内存操作是非常快的,但是内存中的数据最终必须写入到磁盘上,将页数据(page)由内存中写入磁盘上是需要写入时间,必定会和应用程序的高速不间断写产生竞争,这在任何数据库存储引擎都是无法避免的,只是由于WT利用大内存和写无锁的特性,让这种不平衡现象更加显著。下图是一位网名叫chszs同学对mongoDB 3.0和3.2版本测试高速写遇到的hang现象.


gavin-james大约 20 分钟NoSQL MongoDBNoSQL MongoDB
Mongo进阶 - WT引擎:事务实现

Mongo进阶 - WT引擎:事务实现

在本文中,我们主要针对WT引擎的事务来展开分析,来看看它的事务是如何实现的。

理解本文需要有哪些基础

以下是基础,可以参考本网张其它文章。

  • 什么是事务?
  • 什么是ACID?
  • 什么是MVCC?
  • 什么是事务快照?
  • 什么是redo log?

WT的事务构造

知道了基本的事务概念和ACID后,来看看WT引擎是怎么来实现事务和ACID的。要了解实现先要知道它的事务的构造和使用相关的技术,WT在实现事务的时使用主要是使用了三个技术:snapshot(事务快照)MVCC (多版本并发控制)redo log(重做日志),为了实现这三个技术,它还定义了一个基于这三个技术的事务对象和全局事务管理器。事务对象描述如下


gavin-james大约 22 分钟NoSQL MongoDBNoSQL MongoDB