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

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

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

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

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

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

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

先谢谢大家了。

5392 次点击
所在节点    数据库
56 条回复
msg7086
2020-12-30 04:28:13 +08:00
用 docker 跑?
binux
2020-12-30 04:31:27 +08:00
sqlite
webshe11
2020-12-30 04:33:13 +08:00
sqlite 行吗
ETiV
2020-12-30 04:58:50 +08:00
一个账号绑定一个 db 不行吗
账号只能看到自己的 db
dayeye2006199
2020-12-30 06:27:06 +08:00
gateway + sqlite
或者一个数据库作为一个容器,跑在 serveless 容器调度平台上(如果不想自己管理 k8s 的话),例如阿里的 ECI
lihongming
2020-12-30 08:29:58 +08:00
完美解决方案是做个数据服务,让用户间接使用数据库。云数据库很多就是这样的,你用起来没什么区别,但实际上并不是直接操作的数据库。

不过就你这个情况,可能任何方案都不如租个服务器自己管理数据库便宜,成本只与总存储和总负载有关,开几万个都行
DivineRapierH
2020-12-30 08:47:12 +08:00
Postgresql 使用 schema 来隔离行不行?
lichao
2020-12-30 08:49:40 +08:00
架构上不合理;考虑修改架构,在一个数据库里完成这些功能。数据隔离并不是必须得单独数据库
zjsxwc
2020-12-30 08:52:56 +08:00
每个用户一个 sqlite 文件
ffkjjj
2020-12-30 08:54:44 +08:00
为什么要为每个用户每个插件单独创建一个数据库?
mostkia
2020-12-30 08:55:21 +08:00
大量小型数据库,还是用云跑,门槛最低的就是 sqlite 了,挺好的,该有的都有,性能也不差的。各种语言兼容性也挺好
ghostsf
2020-12-30 09:07:40 +08:00
多用户多 db 就行了
whileFalse
2020-12-30 09:07:54 +08:00
好好重新设计下架构吧。一个插件一个数据库,想什么呢。
yutian2211
2020-12-30 09:16:41 +08:00
单实例多租户隔离的数据库服务
------------------------------------
这个不能用数据库权限来实现么?
用户 db 里面,一个 plugin 库,每个 plugin 有自己的表前缀,比如 plugin_xxx_config 这种

另外一种:如果可以暴露用户 id 的话,可以做一个单独的 plugin db,与用户 db 隔离。结合上面所说的,就可以完成数据隔离了。
xuanbg
2020-12-30 09:20:02 +08:00
楼主你要给每个插件每个用户一个数据库实例???想啥呢,🍑是好吃的吗?

不过一个插件一个库是可以的,只要每个数据库用户对应一个库就行。然后表里面加一个 tenant_id 字段隔离用户,这个是必须的,插件按平台的规则设计数据结构,差不多就 ok 了。
zqjnew
2020-12-30 09:20:18 +08:00
可以让客户提供数据库服务,
还可以,解析 sql 语句后,拦截,让用户的表名访问 加上用户插件标识的后缀,即每个用户不同的表,平台拦截对表的访问
codehz
2020-12-30 09:28:57 +08:00
(全整合在一起岂不是容易一死全死?
解析用户 sql 语句也很不靠谱,基本上这样搞到最后为了安全都是变成填空模式)
解决就单独开 SQLite 吧(这样只要提供文件系统隔离就好了
xuanbg
2020-12-30 09:31:21 +08:00
就是这个结构:一个插件应用对应一个库
https://images.i-facture.com/20211230092825.jpg
reed2020
2020-12-30 09:39:40 +08:00
让我想到用的一个工具软件了,他们的似乎和你的需求很相似。ut ?
ackoly
2020-12-30 09:39:46 +08:00
我们公司也是做 saas 产品,用的是 mysql,每个实例创建几百个数据库。最多 1 个 8C16G 的实例创建 500 多个库,数据库大概是 1T 空间。

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

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

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

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

© 2021 V2EX