在云上开上万个小型独立数据库有什么便宜的方案?

2020-12-30 03:42:04 +08:00
 felixin

我们的情况是这样子的,我们有一个 sass 平台,用户是面向公众,但是会打算邀请一些外部开发者来我们的平台编写系统的插件,然后插件销售会与作者分成。插件基本上会调用平台提供的一些通用能力,然后会允许插件存储和查询它自己生成的数据。

现在问题来了,我们假设平台普通用户有 1000 人,每个普通用户购买了 10 个插件,那么我们就需要为每个用户每个插件创建一个单独的数据库来存放数据,因为用户和插件之间的数据是需要隔离的。

我们不可能真的购买这么多的云数据库,也买不起,目前考虑了这个方案:

在平台 api 层面把数据存储和读取做成接口,作为平台的能力直接提供给插件调用,这样就避免掉创建新数据库的问题。这个方案唯一的问题就是使得插件放弃了数据库丰富的 sql 语句功能,限制了插件的发挥,所以只能算作次选方案。

预估每个用户每个插件产生的数据量不会超过 100mb 。最好的方案还是希望云能支持这样一种单实例多租户隔离的数据库服务,但是没有找到这样的服务提供商。

先谢谢大家了。

5514 次点击
所在节点    数据库
56 条回复
caola
2020-12-30 09:44:42 +08:00
sqlite +1
cccp2020
2020-12-30 10:07:53 +08:00
买两台按量付费的服务器,然后对比一下两种方案产生的费用呢
doublleft
2020-12-30 10:15:35 +08:00
是啊 改造成租户模式,共享一个大池子
star7th
2020-12-30 10:22:48 +08:00
自己买服务器,自建数据库。起一个实例即可,然后一个用户一个数据库给他们用。
yzbythesea
2020-12-30 10:25:10 +08:00
插件开发者自己用 data account 存数据啊,不需要你们维护。你们给权限,让他们插件运行的时候,可以从你们的 compute account 查询 他们自己的 data account 数据就可以了。
GM
2020-12-30 11:34:07 +08:00
自己装 mysql 或者 pgsql,然后每个用户一个独立 db,非常简单。
no1xsyzy
2020-12-30 12:04:22 +08:00
sqlite 最明显的弊端是并发低(文件加锁多进程操作必须串行),但你这个场景看上去确实不存在并发
不过,为什么要 SQL ?大部分插件基本上一个 kv 最多一个 json 就能解决了。
实在需要真的数据库的,你可以允许插件编写者使用自己的数据库,开 OAuth2 之类的进行用户鉴权。
(以上均参考 Trello,可以看下 dump 整个看板的 API,就一个 json 包含所有插件信息)
lekai63
2020-12-30 12:14:00 +08:00
Postgresql 使用 schema
如果要 NoSQL 的话,试试 Postgres 的插件咯
felixin
2020-12-30 12:29:56 +08:00
谢谢大家的建议,总结下提出来的方案:

sqlite:优点单进程最简单,缺点是有并发性能上的问题,一个连接写入数据的时候别的连接无法读取数据。这样可能需要有个 sqlite 管理进程自己实现备份管理,读写分流等。搜索了有个开源的 rqlite 可能能满足需求,需要再研究一下。

用规范规定开发者必须遵守租户隔离用户数据:优点是把负担转移到开发者上,缺点是还是需要每个插件单独创建数据库(或者每个开发者),如果测试不完备的话可能会出现同一个插件下不同最终用户数据被混淆。然后如果数据库部署在开发者这边,开发者还多了承担数据库维护的责任。

用 tenant id 单库解析 sql 限定租户:优点是架构简单,缺点是实现复杂,可能无法保证真数据隔离。sql 是图灵完备语言,很难分析全部情况。

自建数据库实例,用数据库自带的分库(或者 pg 的 schema )管理机制:优点是数据库本身不出 bug 的话,数据是真正隔离开的。目前还没有想到太大的缺点,可能需要自己管理一套数据库工具,不能采用云厂商提供的数据库服务,算是一个缺点。

控制 docker, k8s 等自动创建数据库容器:优点缺点和上一条应该一样,还有一个可能的缺点就是资源占用有点大。

修改需求,不要允许开发者使用数据库,用简单存储 kv 等代替:这个方案其实就是只提供有限功能的 Api,我们一开始也是考虑的这个方案,确实值得仔细考虑一下,有提到的 trello 我们得参考下是怎么设计的。优点是完全消解了这个问题,我们推测的缺点可能无法支持聚合等数据库操作,插件比较难给出统计信息等数据,不过这个问题可能可以好好设计一套符合需求的接口来规避。

再次感谢!
opengps
2020-12-30 12:30:47 +08:00
既然你是云端服务,每个用户一个独立库的意义在哪?同一个库的权限隔离也能满足功能,是有什么硬指标要求的吗?
felixin
2020-12-30 12:39:07 +08:00
大家如果知道有类似功能的 sass 平台希望能告知名字,我们可以参考下插件接入设计方式
CODEWEA
2020-12-30 12:46:28 +08:00
一个用户根据唯一 id 分配数据库就行了,做好权限分配就行了
musi
2020-12-30 12:52:40 +08:00
要不参考下微信小程序的云开发?不过他们的是 mongoDB
felixin
2020-12-30 13:30:44 +08:00
@musi mongodb 确实不错,就是不知道微信是怎么做权限隔离的


@opengps 主要是为了隔离不同用户的数据,插件之间由于是不同的开发者,也希望互相不要有影响,同一个库的权限隔离必须要开发者遵守一定规范才能做到,如果我们允许任意开发者来上传插件,这样就不太安全了
littlewing
2020-12-30 13:34:26 +08:00
mysql 可以给用户授权
jinsongzhao
2020-12-30 13:38:48 +08:00
数据库都支持隔离, 开不同账号, 如果客户一定要用超级管理员才放心, 那应该是专业用户了, 那真没招, 只能 sqlite 了. 总之开多个数据库服务肯定不行.
kwklover
2020-12-30 14:20:01 +08:00
sqlite 或单机版的 NOSQL 都可以的,当然这些数据库的并发与事务性肯定不如关系型数据库。但是小的用户其实对并发和故障率要求并不高。
可以这样设计:
每个插件用一个单机版 NOSQL 做数据存储,使用的时候全部 LOAD 入内存,完全没有并发问题了,不过可能存在稳定性问题,所以需要把插件的数据设计成一个可序列化的对象存储到 mysql 中某个表当做备份,一个插件,一条记录即可。
liuxu
2020-12-30 14:22:09 +08:00
多 DB 多用户隔离
40EaE5uJO3Xt1VVa
2020-12-30 16:01:56 +08:00
一定要在云上嘛,我现在都用 frp 把部分吃 CPU 的部分业务放到办公室租的三个刀片机上,用 frp 做内网穿透出去,延迟也就是多个二三十 ms
DoctorCat
2020-12-30 16:20:47 +08:00
@yanzhiling2001 这种属于自建机房的方案,如果保障 SLA 和响应速度,那成本其实也不低的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/740171

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX