MariaDB 服务器的多租户目录
在我们发布时收到通知
演示文稿
背景和动机
对于托管服务提供商来说,为了降低成本,一个常见的解决方案是通过为每个客户创建一个命名的模式(schema)来让一台 MariaDB 服务器支持多个不同的客户。
然而,这存在很多限制
- 用户无法在云端拥有与本地完全相同的模式。
- 用户无法使用多个模式。
- 用户无法备份其所有数据(即使使用 mysqldump 也不行)。这是因为“mysql”模式(包含用户、存储过程等)无法复制,因为其数据在所有服务器用户之间共享。
- 用户无法访问通用日志、慢查询日志或错误日志。

解决上述所有问题并因此创建一个更好的多租户数据库的建议解决方案是为 MariaDB 添加目录支持。
通过让每个客户拥有自己的目录,他们将获得与拥有独立 MariaDB 服务器非常相似的用户体验。 客户可以创建自己的用户、自己的数据库等。
与为每个客户提供一个容器或 MariaDB 服务器(这限制了 192G 服务器大约只能支持 100 个客户,每个客户分配 1G InnoDB 缓冲区)相比,目录使得托管服务提供商能够在同一台服务器上支持 10-100 倍数量的“不那么活跃的数据库用户”。
使用目录的用户体验
- 每个用户被分配一个目录。用户可以在其 my.cnf 文件中、作为客户端参数或连接到 MariaDB 服务器时指定其目录。
- 用户可以对其所有表(包括“mysql”数据库)进行 mysqldump 备份,并将其应用到自己的本地 MariaDB 或另一个“MariaDB 目录”以复制其配置。
- 每个目录都有自己的权限系统。这使得 MariaDB 管理员可以在其目录中独立于其他目录中的用户创建用户。
- 如果用户使用的应用程序尚不支持目录,则在连接到服务器时必须将目录指定为数据库的一部分(格式为“目录.数据库”)。或者,他可以连接到与其数据库关联的端口。
- 登录后,普通用户只能看到其数据库中的对象(数据库、表、用户等)。他无法访问其他目录或更改目录。
- 如果普通用户想要更改其当前活动目录,他必须从服务器注销并重新登录。
对于最终用户来说,MariaDB 服务器将表现得像一个普通的独立服务器,但有以下区别:
- 连接到服务器时,普通用户必须指定目录。如果连接器软件不支持目录,则应在数据库连接字符串中指定目录。如果未指定目录,则假定为“def”目录。
- LOAD DATA INFILE 和 SELECT … INTO OUTFILE 可以配置为只能在目录的路径或其子目录中使用。
- SHUTDOWN 命令仅供“目录根用户”使用。
- 复制(MASTER 和 SLAVE 命令)仅供“目录根用户”使用。
- 后台任务产生的错误(如写入错误)将记录到系统错误日志中,而不是目录错误日志中。
- ‘SHOW GLOBAL STATUS’ 或 ‘SHOW CATALOG STATUS’ 将显示当前活动目录的状态数据。
- ‘SHOW SERVER STATUS’ 仅供目录根用户使用,显示整个服务器的状态。
- 服务器将通过将连接中的默认数据库扩展为包含目录的格式“目录/数据库”来处理旧应用程序。详细信息请参阅附录。
- 仅从“def.mysql”模式读取的表
- plugin(插件)
- help_* 表
- time_zone* 表
- gtid_slave_pos(复制状态)
- innodb_index_stats(InnoDB 内部)
- servers(联合表)
- transaction_registry(InnoDB 内部)
- func(用户自定义函数 UDF)
- performance_schema(性能模式)
新的“目录根用户”
“def”目录保留用于存储“目录根用户”的权限,这些用户可以访问任何目录。 这些用户是用于执行关机、升级、创建/删除目录、管理主从复制等任务的管理员用户。
只有“目录根用户”才能使用“USE CATALOG 目录名”命令切换到其他目录。
普通用户可以执行“USE CATALOG 当前目录”。 这对于执行包含此命令的 mysqldump 备份将是必需的。
新的存储布局
MariaDB 服务器可以运行在数据布局与之前完全相同的“原始模式”,或者运行在具有新数据布局的“目录模式”。
运行带有 –use-catalogs 参数的“mariadb_install_db”时,它将创建以下新的数据结构:
data_directory/
- 存储引擎系统数据文件
- 系统文件
- 复制文件
- general.log(通用日志)
- error.log(错误日志)
- def/
- mysql/
- 权限表
- catalog1/
- general.log(通用日志)
- error.log(错误日志)
- mysql/
- 权限表
- database1/
- database1 的表
- database2/
- database2 的表
- catalog2/
- general.log(通用日志)
- Error.log(错误日志)
- mysql/
- 权限表
- database1/
- database1 的表
- database2/
- database2 的表
不使用目录时的磁盘结构是
data_directory/
- 存储引擎系统数据文件
- 系统文件
- 复制文件
- general.log(通用日志)
- error.log(错误日志)
- mysql/
- 权限表
- database1/
- database1 的表
- database2/
- database2 的表
上述显示
- 有一个“mariadb”目录,用于存储可以访问所有目录、关闭服务器、创建新目录等的管理员用户。“系统根”用户在连接时使用此目录。
- 每个目录都有自己的用户、权限表、数据库、错误日志和通用日志。
如果 MariaDB 服务器检测到新的目录结构,它将自动以目录模式启动。
目录 SQL 命令
- CREATE CATALOG(创建目录)
- DROP CATALOG(删除目录)
- ALTER CATALOG(修改目录)
- SHOW CATALOGS(以及 information_schema.catalogs)
- SHOW CREATE CATALOG(显示创建目录语句)
附加信息
- 有关附加技术信息,请参阅 MariaDB 知识库中的 Catalogs Overview(目录概览)。
团队
- Vicențiu Ciorbaru – MariaDB 基金会首席开发官
- Michael Widenius – MySQL 和 MariaDB 的创始人
贡献者:
- Andrew Hutchings – MariaDB 基金会首席贡献官
- Diego Dupin – MariaDB 公司 – 连接器