管理多租户数据库连接
Posted
技术标签:
【中文标题】管理多租户数据库连接【英文标题】:Managing Multi Tenant DB Connections 【发布时间】:2017-08-01 19:57:12 【问题描述】:我知道这个主题已经在 SO 中的许多人中讨论过,但我有一个具体问题想征求您的意见。 我提前道歉,因为这完全不是编码问题。
我是一名自学成才的开发人员,我没有接触过 CS 学位或任何类型的学位。我所知道的大部分知识都是通过网络学习的。
我正计划开发一个多租户应用程序,它使用 angular 作为前端,laravel 用于后端/api 连接和 mysql 来存储数据。
我计划为每个由 2 或 3 个字母(稍后决定)标识的租户分配一个唯一密钥,用户必须在登录时输入该密钥来识别租户。我们称它为tenantId。 此外,我正在考虑使用子域并将子域作为租户 ID 进行分离。对于这种情况,我们假设我有 tenantId。
另外,laravel 将定义 2 个连接。假设租户连接(保存单个租户数据库凭据)和主连接。
Masterconnection 持有数据库的数据库凭据,该数据库在其中一张表中保存租户密钥、数据库用户名、数据库密码、数据库名称、mysql 服务器地址。
从 mastertenant 获取 db 凭据后,laravel 将更新在 config 文件夹中的 database.php 文件中初始化的租户连接。
所以每次 API 调用,laravel 都必须连接到 master 获取租户连接的凭据,然后调用 db。
在您看来/经验这有多实用/适用?
即使数据库服务器和应用程序服务器在同一个数据中心内,这是否会造成任何延迟?
这种连接方法在多租户环境中是一种公认的连接方法吗?
此外,在每次对 laravel 的 API 调用中,我都计划通过 JWT 发送租户 ID。我不太愿意在本地存储中保存租户 ID。
可以使用任何工具(例如 firebug 或类似性质的工具)来操作本地存储吗?
我曾想过使用共享数据库并在同一个数据库中使用模式,但该应用程序旨在保存财务数据,因此我认为将它们分开是最好的。我研究了利弊,并决定为每个租户使用单独的数据库是最好的。
非常感谢您的反馈。 抱歉,如果发布在错误的堆栈站点上。 很抱歉阅读时间过长。
【问题讨论】:
【参考方案1】:您的大部分问题都是基于意见的,这有点离题。我只想添加一条评论,但它不适合。
即使数据库服务器和应用服务器在同一个数据中心内,这是否会造成任何延迟?
我认为 10~20 毫秒的延迟不会带来任何问题。确保您了解 MySQL 索引的基础知识,因为如果有一天您遇到数据库问题,重要的是不要自动假设这是租户错误。通常是坏索引。
这种连接方法在多租户环境中是一种公认的连接方法吗?
我想是的,我就是这样使用它的。唯一的区别是我的应用程序不是 Web App + API。我用刀片。
此外,在每次对 laravel 的 API 调用中,我都计划通过 JWT 发送租户 ID。我不太愿意将租户 ID 保存在本地存储中。
我不知道您的项目规格。如果每个用户可以访问多个租户,那么是的,这似乎是一个好方法。如果每个用户BelongsTo
一个
唯一的租户,那么为什么要打扰租户 ID 呢?只需从通过令牌认证的用户那里获取租户即可。
可以使用任何工具(例如 firebug 或类似性质的工具)来操作本地存储吗?
How to view or edit localStorage
【讨论】:
以上是关于管理多租户数据库连接的主要内容,如果未能解决你的问题,请参考以下文章
在多租户应用程序中动态设置 Flask-SQLAlchemy 数据库连接