すべてのプロダクト
Search
ドキュメントセンター

PolarDB:マルチテナント管理

最終更新日:Feb 07, 2025

PolarDB for MySQLはマルチテナントモードを提供します。 マルチテナントモードでは、複数のテナントが同じクラスター内でコンピューティングリソースとストレージリソースを共有しながら、異なるテナント間でデータの分離とリソースの分離を保証できます。 各テナントは自分のデータにのみアクセスできます。 このモードは、リソースの競合を防ぎ、安定した業務運用を保証します。

仕組み

image
説明

システムテナント、通常テナントA、および通常テナントBには、それぞれDB_1データベースとuser_1ユーザーがあります。 これらのデータベースとユーザーは同じ名前を共有しますが、それらは別個であり、互いに独立しています。

用語

テナント: テナントの概念は、データベースクラスター内のマルチテナントアーキテクチャをサポートするために導入され、クラスターとデータベースまたはユーザーレベルの間の階層層として機能します。 テナントは、システムテナント通常テナントの2種類に分類されます。

  • システムテナント: 元のモードのユーザーに対応するように設計されています。 デフォルトでは、クラスター内の既存のデータベースとユーザーはシステムテナントに属します。 システムテナントのユーザーがクラスターに接続すると、ユーザーが必要なデータベース権限を持っていれば、すべてのテナントのデータベースにアクセスできます。

  • 通常テナント: システムテナント配下に通常テナントを作成します。 通常テナント間のデータベースとユーザーは完全に分離されており、相互にアクセスできません。 正規テナントもシステムテナントのデータベースにアクセスできません。 CPUリソーススケジューリングのコンテキストでは、通常テナントはmin_cpuパラメーターの値に基づいて排他テナント共有テナントに分類されます。

    • Exclusive tenant: min_cpuパラメーターの値が0より大きい。 システムは、排他的テナントが常にmin_cpuパラメータの値以上のCPUリソースを持つことを保証します。

    • 共有テナント: min_cpuパラメーターの値は0です。

    min_cpuパラメーターの値を変更して、テナントタイプを排他共有の間で変更できます。

リソース設定: テナントが使用できるリソースを定義します。 この概念は、テナント間のリソースの分離と割り当てを管理するために導入されます。 分離とスケジューリングにはCPUリソースのみがサポートされています。

前提条件

マルチテナントモードを有効にするには、クラスターが次の要件を満たす必要があります。

データベースエンジンパラメーターはMySQL 8.0.2以降に設定されています。 Database EditionパラメーターはEnterprise Editionに設定されています。 EditionパラメーターはCluster Editionに設定されています。 クラスター内のノードの仕様は同じです。

説明

マルチテナントモードはカナリアリリースです。 この機能を使用する場合は、DingTalkグループ59535005981に参加してテクニカルサポートを取得できます。 機能を有効にした後、機能を有効にするにはクラスターを再起動する必要があります。

注意事項

  • マルチテナントモードでbinlogを使用してデータを同期することはできません。

  • マルチテナントモードでは、ユーザー権限を部分的に取り消すことはできません。

クイックスタート

  1. クラスターでスタンドアロンマルチテナントモードを有効にします。

    説明

    マルチテナントモードはカナリアリリースです。 この機能を使用する場合は、DingTalkグループ59535005981に参加してテクニカルサポートを取得できます。 機能を有効にした後、機能を有効にするにはクラスターを再起動する必要があります。

  2. 特権アカウントを使用してクラスターに接続します。

  3. リソース設定r1およびr2を作成します。

    CREATE resource_config r1 min_cpu 1 max_cpu 2;
    CREATE resource_config r2 min_cpu 1 max_cpu 4;
    説明
    • クラスターのノード仕様に基づいて、min_cpuパラメーターとmax_cpuパラメーターを設定します。

    • 各テナントのmin_cpuパラメーターの値が、クラスターノード仕様のcpuコア数マイナス1を超えないようにします。 システムテナント用にCPUコアを1つ以上確保する必要があります。 そうしないと、テナントがリソース設定にバインドされない可能性があります。

  4. テナントtn1およびtn2を作成します。 テナントを作成するときは、上記のリソース設定のいずれかをテナントにバインドします。

    CREATE tenant tn1 resource_config r1;
    CREATE tenant tn2 resource_config r2;
    説明

    すべてのテナントのリソース設定のmin_cpuパラメーターの値の合計が、クラスターノード仕様のcpuコア数マイナス1を超えないようにします。

  5. ユーザーu1u2、およびデータベースdb1db2を作成します。

    -- Create user u1 in tenant tn1.
    CREATE USER 'u1@tn1' IDENTIFIED BY 'password';
    
    -- Create database db1 in tenant tn1.
    CREATE DATABASE `db1@tn1`;
    
    -- Create user u2 in tenant tn2.
    CREATE USER 'u2@tn2' IDENTIFIED BY 'password';
    
    -- Create database db2 in tenant tn2.
    CREATE DATABASE `db2@tn2`;
    説明

    特権アカウントを使用してユーザーとデータベースを作成する場合は、ユーザー名またはデータベース名に @ tenant nameサフィックスを追加する必要があります。

  6. ユーザーu1u2に権限を付与します。

    -- Grant permissions on tenant tn1 to user u1. 
    GRANT ALL PRIVILEGES ON `%@tn1`.* TO 'u1@tn1'@'%' WITH GRANT OPTION;
    
    -- Grant permissions on tenant tn2 to user u2. 
    GRANT ALL PRIVILEGES ON `%@tn2`.* TO 'u1@tn2'@'%' WITH GRANT OPTION;
  7. ユーザーu1 @ tn1u2 @ tn2を使用して、テナントtn1とtn2間のデータとリソースの分離を確認できます。

  8. (オプション) 作成したテナント、ユーザー、およびデータベースを表示します。

    • テナント: 特権アカウントを使用してクラスターに接続し、SELECTステートメントを実行してテナントに関する情報を表示します。 例:

      SELECT * FROM mysql.tenants;
    • ユーザー: PolarDBコンソールにログインします。 [クラスター] ページでクラスターを見つけます。 クラスターの [設定と管理] > [アカウント] ページに移動し、作成したユーザーに関する情報を表示します。

      • @ 記号の後にテナント名が追加されていないアカウント名は、システムテナントのユーザーです。

      • @ 記号の後に追加されたテナント名を含むアカウント名は、対応するテナントのユーザーです。

    • データベース: PolarDBコンソールにログインします。 [クラスター] ページでクラスターを見つけます。 クラスターの [設定と管理] > [データベース] ページに移動し、データベースに関する情報を表示します。

      • @ 記号の後にテナント名が付加されていないデータベース名は、システムテナントのデータベースです。

      • @ 記号の後に追加されたテナント名を含むデータベース名は、対応するテナントのデータベースです。

機能

スタンドアロンマルチテナントモードの有効化

説明

マルチテナントモードはカナリアリリースです。 この機能を使用する場合は、DingTalkグループ59535005981に参加してテクニカルサポートを取得できます。 機能を有効にした後、機能を有効にするにはクラスターを再起動する必要があります。

データ分離の有効化

データ分離機能を有効にするには、enable_multi_tenantパラメーターをONに設定します。

リソース分離の有効化

リソース分離機能を有効にするには、まずデータ分離機能を有効にします。 enable_multi_tenantthread_pool_multi_tenant_enabled、およびthread_pool_enabledパラメーターをONに設定します。 thread_pool_sizeパラメーターの値がクラスターノード仕様のCPUコア数と一致していることを確認します。

  • ノード仕様の表示

    PolarDBコンソールのクラスターの [基本情報] ページに移動します。 [データベースノード] セクションでは、クラスターのノード仕様を確認できます。

    image

  • パラメーターの設定

    • enable_multi_tenantおよびthread_pool_multi_tenant_enabledパラメーター: テクニカルサポートに連絡して、パラメーターをONに設定します。

    • thread_pool_enabledおよびthread_pool_sizeパラメーター: PolarDBコンソールにログインします。 [クラスター] ページでクラスターを見つけます。 [設定と管理] > [パラメーター] ページに移動してパラメーターを変更します。 詳細については、「クラスターとノードパラメーターの設定」をご参照ください。

リソースの管理

スタンドアロンマルチテナントモードのPolarDB for MySQLクラスターは、CPUリソースの分離のみをサポートします。 リソース設定を作成するときは、min_cpuパラメーターとmax_cpuパラメーターを使用して、設定のCPUリソース制限を指定します。 テナントがリソース構成にバインドされている場合、リソース構成はテナントのユーザー接続が使用できるCPUリソースを制限します。

リソース設定の作成

特権アカウントを使用してクラスターに接続し、CREATEステートメントを実行してリソース構成を作成します。

構文

CREATE resource_config <resource_config_name> min_cpu <min_cpu> max_cpu <min_cpu>;

CREATE resource_config r1 min_cpu 0 max_cpu 1;
CREATE resource_config r2 min_cpu 1 max_cpu 4;
説明
  • クラスターのノード仕様に基づいて、min_cpuパラメーターとmax_cpuパラメーターを設定します。

  • リソース設定を作成するとき、システムはリソース設定をクラスターノードの仕様と照合しません。 このチェックは、テナントがリソース構成にバインドされている場合にのみ発生します。

  • 各テナントのmin_cpuパラメーターの値が、クラスターノード仕様のcpuコア数マイナス1を超えないようにします。 システムテナント用にCPUコアを1つ以上確保する必要があります。 そうしないと、テナントがリソース設定にバインドされない可能性があります。

  • システムテナントのユーザーが使用できるリソースは、[合計CPUリソース] から [排他テナントに割り当てられたCPUリソース] です。

リソース設定の表示

特権アカウントを使用してクラスターに接続し、SELECTステートメントを実行してリソース構成に関する情報を表示します。

SELECT * FROM mysql.tenant_resource_config;
+----------------------+-------------------------+-------------------------+
| resource_config_name | resource_config_min_cpu | resource_config_max_cpu |
+----------------------+-------------------------+-------------------------+
| r1                   |                       0 |                       1 |
| r2                   |                       1 |                       4 |
+----------------------+-------------------------+-------------------------+

リソース設定の変更

特権アカウントを使用してクラスターに接続し、ALTERステートメントを実行してリソース構成を変更します。

構文

ALTER resource_config <resource_config_name> min_cpu <min_cpu> max_cpu <min_cpu>;

ALTER resource_config r2 min_cpu 1 max_cpu 2;
説明
  • テナントが使用しているリソース構成を更新することはできません。

  • クラスターのノード仕様に基づいて、min_cpuパラメーターとmax_cpuパラメーターを設定します。

  • リソース設定を作成するとき、システムはリソース設定をクラスターノードの仕様と照合しません。 このチェックは、テナントがリソース構成にバインドされている場合にのみ発生します。

  • 各テナントのmin_cpuパラメーターの値が、クラスターノード仕様のcpuコア数マイナス1を超えないようにします。 システムテナント用にCPUコアを1つ以上確保する必要があります。 そうしないと、テナントがリソース設定にバインドされない可能性があります。

  • システムテナントのユーザーが使用できるリソースは、[合計CPUリソース] から [排他テナントに割り当てられたCPUリソース] です。

リソース設定の削除

特権アカウントを使用してクラスターに接続し、DROPステートメントを実行してリソース構成を削除します。

構文

DROP resource_config <resource_config_name>;

DROP resource_config r1;
説明

テナントが使用しているリソース构成を削除することはできません。

テナントの管理

テナントは、システムテナントと通常テナントの2種類に分類されます。 システムテナントは、元のモードのユーザーに対応するように設計されており、管理操作を必要とせず、関与しません。 ここでは、通常のテナントを管理する方法について説明します。

テナントの作成

特権アカウントを使用してクラスターに接続し、CREATEステートメントを実行してテナントを作成します。

構文

CREATE tenant <tenant_name> resource_config <resource_config_name>;

CREATE tenant tn1 resource_config r1;
説明
  • テナント名の長さは最大10文字で、大文字、小文字、数字、およびアンダースコア (_) を使用できます。

  • すべてのテナントのリソース設定のmin_cpuパラメーターの値の合計が、クラスターノード仕様のcpuコア数マイナス1を超えないようにします。

テナントの表示

特権アカウントを使用してクラスターに接続し、SELECTステートメントを実行してテナントに関する情報を表示します。

SELECT * FROM mysql.tenants;
+-------------+----------------------+
| tenant_name | resource_config_name |
+-------------+----------------------+
| tn1         | r1                   |
+-------------+----------------------+

テナントの変更

特権アカウントを使用してクラスターに接続し、ALTERステートメントを実行してテナントの情報を変更します。

構文

ALTER tenant <tenant_name> resource_config <resource_config_name>;

ALTER tenant tn1 resource_config r2;
説明
  • テナント名の長さは最大10文字で、大文字、小文字、数字、およびアンダースコア (_) を使用できます。

  • すべてのテナントのリソース設定のmin_cpuパラメーターの値の合計が、クラスターノード仕様のcpuコア数マイナス1を超えないようにします。

テナントの削除

特権アカウントを使用してクラスターに接続し、DROPステートメントを実行してテナントを削除します。

構文

DROP tenant <tenant_name>;

DROP tenant tn1;
説明
  • テナントを削除する前に、テナントのデータベースが削除されていることを確認してください。 それ以外の場合、テナントは削除できません。

  • テナントを削除すると、テナントのすべてのユーザーが自動的に削除されます。 テナントを削除するときは注意が必要です。

ユーザーの管理

ユーザーは、システムテナントのユーザーと通常のテナントのユーザーの2つのタイプに分けられます。 システムテナントのユーザーは、元のモードのユーザーです。 システムテナントのユーザーの管理方法については、「アカウント管理」をご参照ください。 ここでは、通常テナントのユーザーを管理する方法について説明します。

対応する管理操作は、システムテナントまたは通常テナントで実行できます。

説明
  • システムテナントでユーザーを作成または削除するには、'User name @ tenant name' 形式でユーザーを指定する必要があります。

  • スタンドアロンのマルチテナントモードでは、ユーザー名の長さは最大20文字で、大文字、小文字、数字、およびアンダースコア (_) のみを使用できます。

  • テナントに次のユーザーを作成することはできません。

    • レプリケーター

    • root

    • mysql.infoスキーマ

    • mysql.session

    • mysql.sys

    • オーロラ

    • aliyun_root

  • テナントのユーザーは、__recycle_bin__mysqlperformance_schema、またはsysデータベースに対する権限を持つことはできません。

システムテナント

システムテナントの特権アカウントを使用して、通常テナントのユーザーを作成および削除できます。

ユーザーの作成

特権アカウントを使用してクラスターに接続し、CREATEステートメントを実行して通常のテナントにユーザーを作成します。

構文

CREATE USER <user_name>@<tenant_name> [IDENTIFIED BY <password>];

-- without a password
CREATE USER 'u1@tn1';
-- with a password
CREATE USER 'u1@tn1' IDENTIFIED BY 'password';

ユーザーの削除

特権アカウントを使用してクラスターに接続し、DROPステートメントを実行してユーザーを通常のテナントから削除します。

構文

DROP USER <user_name>@<tenant_name>;

DROP USER 'u1@tn1';

ユーザーに権限を付与する

特権アカウントを使用してクラスターに接続し、通常のテナントのユーザーに権限を付与します。

  • テナントの権限をユーザーに付与します。 テナントの権限をユーザーに付与すると、ユーザーはテナントのすべてのデータベースにアクセスできます。

    例: テナントtn1の権限をユーザーu1に付与します。

    GRANT ALL PRIVILEGES ON `%@tn1`.* to 'u1@tn1'@'%' WITH GRANT OPTION;
  • CREATE USER権限を付与します。 ユーザーにCREATE USER権限を付与すると、そのユーザーは現在のテナントに他のユーザーを作成できます。

    例: ユーザーu1CREATE USER権限を付与します。

    GRANT CREATE USER ON *.* TO 'u1@tn1'@'%';
  • ユーザーの権限を表示します。

    例: ユーザーu1の権限を表示します。

    SHOW GRANTS FOR 'u1@tn1';
    +---------------------------------------------------------------------+
    | Grants for u1@tn1@%                                                 |
    +---------------------------------------------------------------------+
    | GRANT CREATE USER ON *.* TO `u1@tn1`@`%`                            |
    | GRANT ALL PRIVILEGES ON `%@tn1`.* TO `u1@tn1`@`%` WITH GRANT OPTION |
    +---------------------------------------------------------------------+

通常テナント

同じテナントの別のユーザーを使用して、通常のテナントのユーザーを作成および削除できます。 この操作を実行する前に、ログオンしているユーザーにCREATE user権限があることを確認してください。 権限を付与する方法については、このトピックの「ユーザーの管理 > システムテナント > ユーザーへの権限付与」をご参照ください。

ユーザーの作成

テナントのユーザーを使用してクラスターに接続し、CREATEステートメントを実行してテナントにユーザーを作成します。 テナントでユーザーを作成する方法については、このトピックの「Manager users > システムテナント > create a user」をご参照ください。

構文

CREATE USER <user_name> [IDENTIFIED BY <password>];

-- without password
CREATE USER 'u2';
-- with a password
CREATE USER 'u2' IDENTIFIED BY 'password';

ユーザーの削除

テナントのユーザーを使用してクラスターに接続し、DROPステートメントを実行してテナントからユーザーを削除します。

構文

DROP USER <user_name>;

DROP USER 'u2';

ユーザーに権限を付与する

テナントのユーザーを使用してクラスターに接続し、現在のテナントの別のユーザーに権限を付与します。

  • 現在のテナントのユーザーにグローバル権限を付与します。

    構文

    GRANT SELECT ON *.* TO <user_name>

    GRANT SELECT ON *.* TO 'u2';
  • 現在のテナントのユーザーにデータベース権限を付与します。

    構文

    GRANT SELECT ON <database_name>.* TO <user_name>

    GRANT SELECT ON db.* TO 'u2';
説明
  • マルチテナントモードでは、データベース固有の権限とグローバル権限を同時に付与することはできません。 マルチテナントモードで上記の権限を同時に付与すると、権限が正しく識別されない場合があります。 グローバル権限またはデータベース固有の権限の1種類のみを付与することを推奨します。

  • ユーザーの権限を表示する方法については、このトピックの「システムテナント > ユーザーへの権限の付与」をご参照ください。

データベースへの接続

クライアントを使用してデータベースに接続する場合、username @ tenant name形式でユーザーを指定する必要があります。 接続が確立された後、ユーザーはテナントのリソース制限の対象となります。

構文

mysql -h <host> -P <port> -u <user_name>@<tenant_name> -p

mysql -h pc... -P 3306 -u u1@tn1 -p
Enter password: 

データベースの管理

データベースは、システムテナントのデータベースと通常テナントのデータベースに分かれています。 システムテナントのデータベースは、元のモードのデータベースです。 システムテナントのデータベースの管理方法については、「データベース管理」をご参照ください。 ここでは、通常テナントのデータベースを管理する方法について説明します。

対応する管理操作は、システムテナントまたは通常テナントで実行できます。

説明
  • システムテナントにデータベースを作成または削除するには、'Database name @ tenant name' 形式でデータベースを指定します。

  • スタンドアロンのマルチテナントモードでは、データベース名の長さは最大50文字で、大文字、小文字、数字、およびアンダースコア (_) のみを使用できます。

  • テナントに次のデータベースを作成することはできません。

    • information_schema

    • performance_schema

    • mysql

    • sys

    • __recycle_bin__

    • query_rewrite

  • dbms_ccldbms_outlndbms_consensusなどのデータベースをテナントに作成した場合、テナントのユーザーはデータベース内の組み込みストアドプロシージャを呼び出すことができません。 この場合、CALL dbms_admin.show_native_procedure(); ステートメントを使用して、データベース内のすべての組み込みストアドプロシージャを表示できます。

  • テナント内のデータベースの名前が組み込みストアドプロシージャのschema_nameと同じ場合、データベースの組み込みストアドプロシージャを呼び出すことはできません。

システムテナント

システムテナントの通常テナントからデータベースを作成または削除するには、特権アカウントを使用してクラスターに接続します。

データベースの作成

特権アカウントを使用してクラスターに接続し、CREATEステートメントを実行して通常のテナントにデータベースを作成します。

構文

CREATE DATABASE <database_name>@<tenant_name>;

CREATE DATABASE `db1@tn1`;

データベースの削除

特権アカウントを使用してクラスターに接続し、DROPステートメントを実行して通常のテナントからデータベースを削除します。

構文

DROP DATABASE <database_name>@<tenant_name>;

DROP DATABASE `db1@tn1`;

通常テナント

同じテナントのユーザーを使用して、通常のテナント内でデータベースを作成および削除できます。 この操作を実行する前に、ログオンしているユーザーにグローバル権限があることを確認してください。 ユーザーにグローバル権限を付与する方法については、このトピックの「マネージャーユーザー > システムテナント > ユーザーへの権限付与」をご参照ください。

データベースの作成

テナントのユーザーを使用してクラスターに接続し、CREATEステートメントを実行して現在のテナントのデータベースを作成します。 テナントでユーザーを作成する方法については、このトピックの「Manager users > システムテナント > create a user」をご参照ください。

構文

CREATE DATABASE <database_name>;

CREATE DATABASE `db2`;

データベースの削除

テナントのユーザーを使用してクラスターに接続し、DROPステートメントを実行して現在のテナントからデータベースを削除します。

構文

DROP DATABASE <database_name>;

DROP DATABASE `db2`;

スレッドグループとテナント間のバインディング関係の表示

  1. 特権アカウントを使用してクラスターに接続し、次のSQL文を実行して、スレッドグループとテナント間のバインディング関係を表示します。

    SELECT * FROM information_schema.thread_pool_status;
  2. サンプル出力:

    マルチテナントリソースの分離が有効になっている場合、TENANT_NAME列には、スレッドグループを排他的に使用するテナントが表示されます。 スレッドグループのTENANT_NAME列が空の場合、スレッドグループは複数のテナントで共有されます。

    TENANT_NAME: スレッドグループを排他的に使用するテナントの名前。

    +----+--------------+---------------------+----------------------+-------------------+----------------+-------------+
    | ID | THREAD_COUNT | ACTIVE_THREAD_COUNT | WAITING_THREAD_COUNT | DUMP_THREAD_COUNT |      ...       | TENANT_NAME |
    +----+--------------+---------------------+----------------------+-------------------+----------------+-------------+
    |  0 |            2 |                   0 |                    0 |                 0 |      ...       |             |
    |  1 |            2 |                   1 |                    0 |                 0 |      ...       | tn1         |
    |  2 |            4 |                   0 |                    0 |                 1 |      ...       |             |
    |  3 |            2 |                   0 |                    0 |                 0 |      ...       |             |
    |  4 |            3 |                   0 |                    0 |                 1 |      ...       |             |
    +----+--------------+---------------------+----------------------+-------------------+----------------+-------------+

監査ログの表示

マルチテナントモードでは、監査ログは各操作に関係するデータベースとユーザーを記録します。

たとえば、データベースdb3に対してテナントt2のユーザーu1によって実行されたSQLクエリが監査ログに記録されます。 データベース列はdb3 @ t2として表示され、user列はu1 @ t2として表示されます。