django+mariadb 多租户架构方案讨论

2023-12-28 09:44:04 +08:00
leven87  leven87

公司搭建云平台需要实现多租户。搜索互联网,主要两个方案。

  1. 租户 id 区分,所有租户共用一个数据库;
  2. 按租户分库,每个租户一个数据库。

方案一最简单直接,缺点就是数据隔离性和安全性差一些,但中小应用还好。 方案二架构就会比较复杂,但是数据隔离性和安全性好。

现在的问题是考虑方案二的话,如何将各租户的数据聚合,因为租户数据都是存在不同的库里面。管理员应该能看到并管理所有租户数据,如果实时从每个库查询效率太低,应该也不是通用做法吧(这方面经验少)。想到的一个架构是,采用阿里开源的实时同步工具 canal, 将每个租户的数据同步到一个全量数据库。管理员在全量数据库去查询数据。

请教 V 友,多租户分库方案,数据如何聚合进行查询的问题,谢谢大家。

2144 次点击
所在节点   数据库  数据库
27 条回复
roundgis
roundgis
2023-12-28 09:55:42 +08:00
方案二定時做匯總就行了
Masoud2023
Masoud2023
2023-12-28 10:01:39 +08:00
能不能把需求讲明白点,做什么业务的云平台实现什么功能实现多租户?
mightybruce
mightybruce
2023-12-28 10:07:06 +08:00
你的问题其实 HTAP 类型的数据库就能满足, 不过你可能是用 mysql 吧, 你可以通过 mysql CDC 工具同步到 ES 来做分析或建立一些数仓来做分析。
kuituosi
kuituosi
2023-12-28 10:12:34 +08:00
互联网模式选 1
2b 模式且对应甲方比较少选 2
812603834
812603834
2023-12-28 10:46:09 +08:00
客户已经有了吗?如果是研发新产品方案 2 太宏大了,可以折中一点,根据租户 id 分库分表,分几个库百来张表。用 es 做数据汇总查询处理,具体的操作直接操作数据库
chenqh
chenqh
2023-12-28 11:25:29 +08:00
都用 django 了,确定是大项目吗?
flmn
flmn
2023-12-28 11:29:08 +08:00
devliu1
devliu1
2023-12-28 11:30:24 +08:00
2 一点都不复杂,1 才复杂,业务层需要的改动太多。

多租户你应该只要部分统计数据,离线计算就可以
yy77
yy77
2023-12-28 11:45:25 +08:00
还是 2 比较好,1 的话一个 bug 或者运维失误那就很难搞定了。
shyangs
shyangs
2023-12-28 11:50:37 +08:00
方案一,增加了維運搞出 P0 級事故的可能. 一個失誤影響所有租戶.
shuimugan
shuimugan
2023-12-28 12:23:50 +08:00
方案一很勇哦,先想一想灰度方案怎么做,怎么样更新不会影响全租户,租户有没有数据库私有化的需求,有没有"坏租户"数据量过大拖垮整个数据库性能的风险
DeWjjj
DeWjjj
2023-12-28 12:36:50 +08:00
这不是应该启动一个服务,定期把客户的分表全部映射到一个总表上给后台看么?
leven87
leven87
2023-12-28 13:18:29 +08:00
@roundgis @DeWjjj 还是希望实时,管理员在租户数据库的写操作,希望能实时同步到全量数据库。
leven87
leven87
2023-12-28 13:19:46 +08:00
@kuituosi 谢谢
leven87
leven87
2023-12-28 13:20:47 +08:00
@812603834 老板就随口一说,数据库要不要分库。我们以前是做私有化部署,现在要弄到公网上,所以要做多租户。
leven87
leven87
2023-12-28 13:21:36 +08:00
@chenqh 哈哈,技术栈就是 python.
leven87
leven87
2023-12-28 13:25:01 +08:00
@shyangs
@shuimugan
暂时是小系统,没到那么复杂的架构。只是老板考虑以后升级成本
sivacohan
sivacohan
2023-12-28 13:53:35 +08:00
方案二,每个用户一个 schema 。
管理员具备查看多个 schema 的权限。

主键 ID 不要用自增 ID ,可以用 snowflake 之类的分布式 ID 。这样多个 schema 相同表 union 的时候,不会出现主键冲突,排序和分页都冗余很多。

并且,如果是 ToB 业务,不同租户之间可能表结构、逻辑结构都有所区别。遇到租户级的定制需求,方案一满足起来非常困难,做到最后会发现数据库已经弱化成了存储,“实时上”自己手动实现了一个数据库。
roundgis
2023-12-28 14:13:25 +08:00
@DeWjjj 量不大可以考慮用 signal 有寫入行為時觸發同步

如果量很大就要考慮用 mq 了
0703wzq
2023-12-28 14:26:24 +08:00
我这边也是做 saas ,采用的方案二,方案二的优点很明显,业务侧不需要管租户的问题,只需要实现它的业务,数据库的切换由底层去实现。在独立部署的时候也不会遇到什么问题只开通一个租户即可。如果使用方案一,后期租户数量多将会是个灾难,对于业务侧来说,每个数据考虑租户的问题有时候也是个头疼的事情。至于汇总数据的问题无非是多做一个定期同步到上一级汇总表。

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

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

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

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

© 2021 V2EX