MariaDB Catalogs 预览版容器现已可用

我们在 MariaDB Catalogs 上取得了重大进展,虽然仍有工作要做,但我们很高兴为社区提供一种便捷的方式来试用我们的预览版本。您不再需要自己编译源代码——只需使用我们的预构建容器,现在已在我们官方的 quay.io 开发注册中心提供。

代码已在 Github 上公开发布,与官方 MariaDB Server 位于不同的仓库(直到该功能作为官方 MariaDB Server 版本的一部分发布)

文档可在 Knowledge Base(知识库)上获取。有关 Catalogs 的分步指南,请继续阅读!

🚀 如何下载

docker pull quay.io/mariadb-foundation/mariadb-devel:mariadb-catalogs-preview

此镜像基于 Ubuntu 24.04,包含手动安装的 MariaDB 包。请注意,未配置任何更新仓库——这严格来说是一个预览版本

底层的 MariaDB 版本仍为 11.0,因此可能缺少更高版本中引入的功能。

🛠️ 如何开始使用

此镜像基于我们在 Docker Hub 上的官方 Docker 镜像构建,增加了一个初始化变量:MARIADB_CATALOGS,该变量接受一个逗号分隔的 Catalog 名称列表(无空格)。

要运行此镜像,请挂载数据目录的卷并初始化您想要的 Catalogs

docker run                          \
    -v ./datadir:/var/lib/mysql     \
    -e MARIADB_CATALOGS=cat1,cat2   \
    -e MARIADB_ROOT_PASSWORD=1234   \
    --name mariadb-with-catalogs    \
    --rm                            \
    -it quay.io/mariadb-foundation/mariadb-devel:mariadb-catalogs-preview


初始化后,您的数据目录结构将如下所示

$ sudo tree -d
.
├── #rocksdb
├── cat1
│   ├── mysql
│   ├── performance_schema
│   └── sys
├── cat2
│   ├── mysql
│   ├── performance_schema
│   └── sys
└── def
    ├── mysql
    ├── performance_schema
    └── sys

每个 Catalog(例如,cat1, cat2)都有自己的 mysql, performance_schemasys 数据库。

🔌 如何连接

在此设置下,我们传统 Dockerhub 镜像提供的所有默认初始化参数将在 def Catalog 上生效。这意味着带有密码 1234 的传统 root 用户(如上例命令所示)将位于 def Catalog 中。

最简单的连接方式是通过已安装在容器中的 mariadb 客户端。这将便于进行管理操作。

docker exec -it mariadb-with-catalogs mariadb -u root --password=1234

您将看到如下形式的提示符

MariaDB [def.(none)]>

您现在已连接到 def Catalog,该 Catalog 包含所有 Catalogs 的元数据。在此处创建的用户在其他 Catalogs 中将不可见。

我们可以使用以下命令列出所有可用的 Catalogs

MariaDB [def.(none)]> show catalogs;
+---------+-----------------+
| Catalog | Comment         |
+---------+-----------------+
| cat1    |                 |
| cat2    |                 |
| def     | default catalog |
+---------+-----------------+

较新的客户端(例如容器中已有的客户端)支持一个特定的 Catalog 标志。我们可以使用它以其 root 用户的身份连接到单独的 Catalog

docker exec -it mariadb-with-catalogs mariadb --catalog cat1 -u root

对于较旧的客户端,我们可以使用数据库名称来指定 Catalog

docker exec -it mariadb-with-catalogs mariadb -u root cat1.mysql

def Catalog 中的 root 用户与其他 Catalog 的 root 用户相比具有特殊权限。它能够切换 Catalog 并在每个 Catalog 内进行操作。

MariaDB [def.(none)]> use catalog cat1;
Query OK, 0 rows affected (0.000 sec)

MariaDB [cat1.(none)]> create user foo;
Query OK, 0 rows affected (0.020 sec)

MariaDB [cat1.(none)]> select user, host from mysql.user;
+-------------+-----------+
| User        | Host      |
+-------------+-----------+
| foo         | %         |
| root        | 127.0.0.1 |
| root        | ::1       |
| mariadb.sys | localhost |
| root        | localhost |
+-------------+-----------+
5 rows in set (0.001 sec)

💾 表和存储引擎

此预览版本支持多种存储引擎,所有引擎都支持 Catalogs,包括

  • RocksDB
  • InnoDB
  • Connect
  • MyISAM
  • Aria
# Within a catalog, you can run:
CREATE DATABASE test_db;
USE test_db;

CREATE TABLE t1 (a INT) ENGINE=InnoDB;
CREATE TABLE t2 (a INT) ENGINE=RocksDB;

SHOW TABLES;

🧑‍💼 管理 Catalogs

Catalogs 主要用于 SaaS 提供商轻松创建多租户系统。这意味着 MariaDB Server 应支持相应的 SQL 命令来正确自动化此过程。

首先,初始部署通过 mariadb-install-db 脚本处理。该脚本将创建通过命令行参数 --catalogs=cat1,cat2,cat3 传入的所有 Catalogs。容器镜像在幕后也通过 MARIADB_CATALOGS 环境变量执行此操作。

随后,随着更多租户加入系统,我们需要能够创建更多 Catalogs。这通过 [CREATE | DROP] CATALOG 命令完成。让我们看看

MariaDB [def.(none)]> create catalog cat3;
Query OK, 1 row affected (0.380 sec)

MariaDB [cat1.(none)]> use catalog cat3;
Query OK, 0 rows affected (0.000 sec)

MariaDB [cat3.(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.000 sec)

您会注意到创建 Catalog 比其他命令花费更多时间。这是因为它实际上是在“引导”一个新的服务器模式。区别在于此 Catalog 默认没有创建任何用户。因此系统管理员现在还需要为 cat3 创建用户;

MariaDB [cat3.(none)]> select user, host from mysql.user;
+-------------+-----------+
| User        | Host      |
+-------------+-----------+
| mariadb.sys | localhost |
+-------------+-----------+
1 row in set (0.000 sec)

同样,我们可以删除新添加的 Catalog

MariaDB [cat3.(none)]> drop catalog cat3;
ERROR 4201 (HY000): Current catalog 'cat3' cannot be dropped
MariaDB [cat3.(none)]> use catalog cat2;
Query OK, 0 rows affected (0.000 sec)

MariaDB [cat2.(none)]> drop catalog cat3;
Query OK, 0 rows affected (0.241 sec)

注意,只要有用户连接到该 Catalog,我们就无法删除它。

📈 状态变量

Catalogs 的一个重要方面是监控服务器状态。在 MariaDB 中已经有全局和会话级别的变量,然而随着另一个层级(Catalogs)的引入,global 现在实际上指的是当前 Catalog 的状态。对于服务器范围的变量,现在有一个“server”级别的变量,而 global 现在是“catalog”级别的同义词。这保留了应用程序的向后兼容性。

并非所有状态变量都已支持,但我们可以测试一些,例如 Acl_users。我们将连接到两个不同的 Catalogs 并检查其值

MariaDB [cat1.(none)]> show global status like 'Acl_users';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Acl_users     | 5     |
+---------------+-------+
1 row in set (0.000 sec)

MariaDB [cat1.(none)]> select count(*) from mysql.user;
+----------+
| count(*) |
+----------+
|        5 |
+----------+
1 row in set (0.001 sec)

现在如果我们对之前创建了额外用户的 cat2 执行相同的操作

MariaDB [cat2.(none)]> select count(*) from mysql.user;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.000 sec)

MariaDB [cat2.(none)]> show global status like 'Acl_users';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Acl_users     | 6     |
+---------------+-------+
1 row in set (0.000 sec)

请记住,这仍然是正在开发中的代码,因此此处可能存在我们尚未妥善处理的边缘情况。

文档

虽然本文重点介绍了 MariaDB Catalogs 中的大部分可用功能,但完整的文档可在 MariaDB KnowledgeBase(知识库)上获取。

最后一点说明

Catalogs 是一个大型项目,涉及相当多的开发工作。如果没有 IONOS 等赞助商的支持以及通过 NlNet 提供的结构性资金,这个项目是不可能实现的。我们鼓励社区通过测试、错误报告以及对 Github 公共仓库的潜在 PR 来做出贡献