使用LeanCloud替换MongoDB

目录

在 Wordpress 迁移到 Hugo 中寻找评论解决方案时,发现 valine 使用的云存储平台 LeanCloud 提供的数据模型与 MongoDB 类似,并且提供的免费资源(日操作低于30000次)足够个人博客等小型网站使用。

单位业务监控的外网服务器 nmp-web 搭建在我自己购买的阿里云服务器上,使用 MongoDB 和 Redis 存储数据。因为 MongoDB占用的资源较多,云服务器只有1G内存,MongoDB 经常因查询而崩溃。保存到 MongoDB 中的数据访问量很少,LeanCloud 的开发版完全可以满足需求。所以,已经使用 LeanCloud 替换 MongoDB,降低云服务器的负载,同时也是对 Serverless 的一种尝试。

数据模型

LeanCloud 的存储后台大量采用了 MongoDB 这种文档数据库来存储结构化数据。

MongoDB 的数据结构可以直接保存到 LeanCloud 中,与 MongoDB 不同的是,LeanCloud 的一个 Class 中的数据必须有相同的格式。

nmp-web 接收的 json 数据是来自 pymongo 的 BSON 转成的字典对象,具有相同的结构,可以保存到 LeanCloud 的一个 Class 中。

存储

为了检索方便,将其中的 timestamp 数据重新解析成 LeanCloud 可以识别的 datetime 格式。

def save_blob(blob: dict) -> None:
    b = Blob()
    blob['timestamp'] = datetime.datetime.strptime(blob['timestamp'], "%Y-%m-%dT%H:%M:%S")
    b.set(blob)
    b.save()

检索

检索也非常方便,例如按照 ticket_id 检索某个数据。

def get_blob(ticket_id: int) -> Blob or None:
    query = leancloud.Query(Blob)
    query.equal_to('ticket_id', ticket_id)
    query_list = query.find()
    if len(query_list) == 0:
        return None
    return query_list[0]

局限

LeanCloud 对单个对象 AVObject(即 MongoDB 中的文档)限制不能超过 128 KM,远远低于 MongoDB。因此,过大的对象只能采用文件 AVFile 的方式保存到 LeanCloud 中。

AVFile 文件的保存和下载不同于对象,每日只有免费的 500MB HTTP 流量,不适合替换项目保存在 Redis 中定时更新的数据。这部分数据或许该寻找另外的存储方式与 AVObject 相结合。