张春成
2023/03/10阅读:19主题:默认主题
习惯数据库之MongoDB
习惯数据库之MongoDB
本文记录了使用 MongoDB 实现日常信息汇总的程序样例,和我对数据库的一些碎碎念。
数据库:以应用场景为例
假设你要假装管理多台服务器,那么你肯定有兴趣知道它们随时的运行状态。当然,Linux 服务器具有强大的日志功能,但这些日志显然提供了过分充足的内容,我们往往只关注诸如 uptime,free 等简单信息。因此我们仅需要处理这些信息即可。这里有两种做法,一种是定时登陆它们并查看运行状态;另一种是设置定时任务,用来获取运行状态并将它们保存起来。
说是保存,但保存是个很抽象的东西,因为你可以通过各种各样的方式去实现它。先说结论,实现保存最经济和快速的方法就是使用数据库。能够这样声称是出现两方面考虑,首先是在存储端,你可以想象这样一个场景,你通过某种操作获取了一条信息,我们姑且将它称为文档(document)。你要做的是尽可能快速地将它记录下来。抄在纸上是一种办法,而计算机里没有纸,就需要将个文档写入到一个文件里。
这时就面临一个风险,即要确定待写入的文件是否是可写的?如果它正在被其他程序使用,即正在有程序向文件内写入,则它不可写;如果它正在被其他程序读取,则写入它的过程可能破坏读取它末端信息的程序。这很麻烦,但可以通过给文件加锁的方法来解决,如果文件无法使用,则程序应该等待一段时间后再试图写入,程序将不断反复这个过程直到成功写入完毕。
现在假设我们写入的操作已经成功了,就迎来了另一个问题,那就是如何读取它?准确地说是如何从可能包含目标信息的文件中找到我们的目标信息。因为这里涉及的信息可能是几 K 的小文件,也可能是几 G 的大文件。你可以想象在一座图书馆的中找到含有 “One of the recent Wordle solutions was unusually obscure, but it came from the original answer key.” 这句话的所有书籍。这句话没有任何特殊含义,是我在网上随便找的,但这体现了从大文件中寻找信息的随机性和难度。
因此,我们将视角转向数据库,不考虑具体的实现方式,它应该是什么东西呢?或者说,它应该具有什么功能,才能算是好用呢?我们不妨罗列一下
-
它提供简单的写入方法,你可以在任何时候向它发送数据,它会将数据记录下来; -
它提供简单的检索方法,你可以在任何时候向它发送请求,它会将查询结果返回给你; -
它应该自动维护存储数据的文件,并为这些文件提供必要的备份和优化功能。
总而言之一句话,它是个能够随时接入的,高性能的,安全的智能“大文件”。
数据库的前后端思维
如果我们进一步地将第 3 条功能委托给提供数据库软件的优秀程序员们,我们无条件地信任他们为数据库提供必要的备份和优化功能。于是只需要关注前两条功能,即数据的写入和检索,那么就自然而然地形成了前后端分离的思维方式。
-
首先,在所谓后端,我们可以利用服务器强大的计算能力和 7 x 24 的优良工作态度,让它日夜不休地为我们提供计算服务,并将这些大数据记录在数据库中。 -
之后,在所谓前端,我们配合 WEB 应用的方式向用户提供 UI,根据指令从数据库中检索这些信息,并形成相应的图表反馈。
此时,我们的所谓业务逻辑就是后端负责计算,前端负责呈现,而数据库处于两端之间。而对于快速开发的需求而言,MongoDB 是个不错的选择,它的语法不那么 SQL,而更像是 Javascript。这里没有褒贬,但编程时能用一种语言的语法逻辑贯彻始终,肯定是一件美事。
// https://www.mongodb.com/docs/manual/reference/method/db.collection.find
db.collection.find(query, projection, options)
// https://www.mongodb.com/docs/manual/reference/method/db.collection.aggregate
db.collection.aggregate(pipeline, options)
// https://www.mongodb.com/docs/manual/reference/method/db.collection.insertMany
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
MongoDB: The Developer Data Platform
我使用以上的前后端逻辑构建了服务器的监控工具,它可以在相当长的时间尺度上监控服务器的运行状态(后端),并且能够满足实时查询的要求(前端)。本文的开源代码可见我的 Github 页面
https://github.com/listenzcc/server-monitor

附录:MongoDB 数据库的特性
高性能:MongoDB 被设计为可扩展的,高性能的数据库。 灵活的数据模型:MongoDB 支持动态的模式,字段的值可以包含其他文档和数组。 易于扩展:MongoDB 的分布式架构使它易于扩展。 复制和高可用性:MongoDB 提供了复制和高可用性功能。 易于使用:MongoDB 设计为开发人员友好型数据库。
MongoDB 是一个非关系型数据库,也就是 NoSQL 数据库,NoSQL 数据库的优点:
易扩展:NoSQL 数据库是水平扩展的,只需要简单的增加新的机器就可以扩展存储容量以及处理能力。 大数据量高性能:NoSQL 数据库都具有很高的读写性能。 灵活的数据模型:NoSQL 数据库不需要事先为要存储的数据指定字段和数据类型。随时可以存储自定义类型的数据。 成本较低:NoSQL 数据库的性能可以在低价的普通机器集群上得到保证,不需要特高性能的专业数据库服务器。
作者介绍