このセクションでは、いくつかの典型的なシナリオを通じて、日常業務におけるテーブルグループの重み均衡の応用を紹介します。
シナリオ1:同一データベース内で新規作成されるテーブルの自動集約
シナリオの概要
業務上、一連のユーザーテーブルを新規作成する必要があり、これらのテーブルをデータベース単位で管理し、データベース内の分散読み書きを回避する必要があります。
手順
まず、新規作成するデータベース内のユーザーテーブルの自動集約スイッチを有効にします(パラメータenable_database_sharding_noneの値をTrueに設定)。その後、データベースとテーブルを個別に作成します。具体的な操作は以下のとおりです:
MySQLモードのテナント管理者がデータベースに接続します。
接続例は以下のとおりです。データベースへの接続時は、実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -Aテナントレベルの構成パラメータ
enable_database_sharding_noneの値をTrueに設定します。obclient(root@mysql001)[(none)]> ALTER SYSTEM SET enable_database_sharding_none = True;必要に応じて、複数のデータベースを作成します。
各データベースの作成が成功すると、デフォルトで新しい
Sharding = 'NONE'のテーブルグループがバインドされます。データベースの作成手順の詳細については、データベースの作成を参照してください。
データベースごとにユーザーテーブルをバッチで新規作成すると、同一データベース内のユーザーテーブルは自動的に1つのログストリームにバインドされます。
シナリオ2:複数のデータベースにまたがる新規テーブルの集約
シナリオの概要
業務上、一連のユーザーテーブルを新規作成する必要があり、これらのテーブルは別のデータベースA内のユーザーテーブルと密接に関連しています(仮定として、データベースAは作成時に既にSharding = 'NONE'のテーブルグループにバインドされている)。現在、新規作成されたテーブルをデータベースA内のユーザーテーブルと集約し、複数のデータベース間の分散読み書きを回避する必要があります。
手順
データベースBを作成し、データベースAと同じSharding = 'NONE'のテーブルグループにバインドした後、新規テーブルを作成します。具体的な操作は以下のとおりです:
MySQLモードのテナント管理者がデータベースに接続します。
接続例は以下のとおりです。データベースへの接続時は、実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -AデータベースAがバインドされているテーブルグループ情報を取得します。
obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_DATABASES WHERE DATABASE_NAME = 'databse_name';以下のステートメントを使用して新しいデータベースBを作成し、そのテーブルグループをデータベースAがバインドされているテーブルグループに指定します。
CREATE DATABASE databae_name DEFAULT tablegroup = tablegroup_name;CREATE DATABASEステートメントの詳細な説明と例については、CREATE DATABASEを参照してください。新しく作成したDatabase B内にユーザーテーブルを作成すると、そのユーザーテーブルはDatabase Aのユーザーテーブルと自動的に同じログストリームにバインドされます。
シナリオ3:複数のデータベースの再集約
シナリオの概要
ユーザーテーブルの作成は完了しましたが、関連する複数のデータベースにまたがるユーザーテーブルを再集約し、複数のデータベース間での分散読み書きを回避する必要があります。
手順
MySQLモードのテナント管理者がデータベースに接続します。
接続例は以下の通りですが、データベースへの接続時は実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -A以下のステートメントを使用して、
Sharding = 'NONE'のテーブルグループを作成します。CREATE TABLEGROUP tablegroup_name Sharding = 'NONE';以下のステートメントを使用して、複数のデータベースを新しく作成したテーブルグループにバインドします。
ALTER DATABASE database_name tablegroup [=] tablegroup_name;ALTER DATABASEステートメントの詳細な説明と例については、ALTER DATABASEを参照してください。パーティションの均等化を手動でトリガーします。
obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.TRIGGER_PARTITION_BALANCE();パーティションの均等化を手動でトリガーする詳細な操作については、パーティションの均等化を手動でトリガーするを参照してください。
パーティションの均等化タスクが完了するのを待つと、複数のデータベースにまたがるユーザーテーブルの集約が完了します。
パーティションの均等化プロセス中は、ビューを使用して均等化タスクの進捗状況を確認できます。ステートメントは以下の通りです:
obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_BALANCE_JOBS WHERE JOB_TYPE = 'PARTITION_BALANCE';パーティションの均等化タスクの進捗状況を確認する詳細な操作については、バックグラウンドのパーティション均等化タスクを確認するを参照してください。
シナリオ4:ホットスポットテーブルグループの専有化
シナリオの概要
新規データベースのユーザーテーブルの自動集約スイッチ(構成パラメータ enable_database_sharding_none の値を True に設定)を有効にした後、データベースを作成するたびに、デフォルトで Sharding = 'NONE' のテーブルグループが作成されます(この方法で作成されたテーブルグループの重みはデフォルトで 1 です)。現在、ビジネスニーズに基づき、ホットスポットテーブルグループをログストリームで専有化したいと考えています。
手順
現在のテナントには、9つのSharding = 'NONE' テーブルグループTG_DB_1 ~ TG_DB_9が存在します。そのうち、TG_DB_1は複数のデータベースのユーザーテーブルを集約しているためホットスポットとなっており、単独で1つのログストリームを専有することを希望しています。
現在、これらのテーブルグループの重み分布は以下のとおりです。
大きな重み(100% × Sharding = 'NONE' のテーブルグループの総数)を設定することで、ホットスポットテーブルグループ TG_DB_1 の重みを設定し、専有化を実現できます。具体的な操作手順は以下のとおりです:
MySQLモードのテナント管理者がデータベースに接続します。
接続例は以下のとおりですが、データベースへの接続時は実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -Aテナント内の重み付けされた
Sharding = 'NONE'テーブルグループの総数を確認します。obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_OBJECT_BALANCE_WEIGHT;ホットスポットテーブルグループに重みを設定します。
クエリで得られた重み付けされた
Sharding = 'NONE'テーブルグループの総数が9である場合、ホットスポットテーブルグループの重みを9に設定するステートメントは以下のとおりです:obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.SET_TABLEGROUP_BALANCE_WEIGHT(9,'TG_DB_1');手動でパーティションの均衡をトリガーします。
obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.TRIGGER_PARTITION_BALANCE();手動でパーティションの均衡をトリガーする詳細な操作については、手動でパーティションの均衡をトリガーするを参照してください。
パーティションの均衡タスクが完了するのを待つと、複数のデータベースにまたがるユーザーテーブルの集約が完了します。
パーティションの均衡処理中は、ビューを使用して均衡タスクの進捗状況を確認できます。ステートメントは以下のとおりです:
obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_BALANCE_JOBS WHERE JOB_TYPE = 'PARTITION_BALANCE';パーティションの均衡タスクの進捗状況を確認する詳細な操作については、バックグラウンドのパーティション均衡タスクを確認するを参照してください。
均衡が完了すると、これらのテーブルグループの重み分布は以下のとおりになります:
シナリオ5:テーブルグループの重みによる分散
シナリオの概要
新規データベース作成時のユーザーテーブルの自動集約スイッチを有効にした場合(パラメータ enable_database_sharding_none の値が True の場合)、各データベース作成時にデフォルトで Sharding = 'NONE' のテーブルグループが作成されます(この方法で作成されるテーブルグループの重みはデフォルトで 1 です)。現在、業務上のニーズに基づき、ユーザーテーブルが多い、またはデータ量が大きい、あるいはアクセストラフィックが高いテーブルグループを分散させたいと考えています。
手順
現在のテナントには9つの Sharding = 'NONE' テーブルグループ TG_DB_1 ~ TG_DB_9 があります。そのうち、TG_DB_1、TG_DB_2、TG_DB_4 の各テーブルグループにはデータ量が多いテーブルが含まれていますが、それぞれが単独でログストリームを専有するほどではありません。
現在、これらのテーブルグループの重み分布は以下のとおりです。
重み(50% × Sharding = 'NONE' のテーブルグループの総数)に応じて、TG_DB_1、TG_DB_2、TG_DB_4 の各テーブルグループの重みを設定できます。具体的な操作手順は以下のとおりです:
MySQLテナントのテナント管理者がデータベースに接続します。
接続例は以下のとおりですが、データベースへの接続時は実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -Aテナント内の重み付き
Sharding = 'NONE'テーブルグループの総数を確認します。obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_OBJECT_BALANCE_WEIGHT;テーブルグループ
TG_DB_1、TG_DB_2、TG_DB_4に重みを設定します。重み付き
Sharding = 'NONE'テーブルグループの総数が9であると仮定すると、各テーブルグループTG_DB_1、TG_DB_2、TG_DB_4に重み4(50% × 9の結果を切り捨てたもの)を設定するステートメントは以下のとおりです:obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.SET_TABLEGROUP_BALANCE_WEIGHT(4,'TG_DB_1');obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.SET_TABLEGROUP_BALANCE_WEIGHT(4,'TG_DB_2');obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.SET_TABLEGROUP_BALANCE_WEIGHT(4,'TG_DB_4');パーティションの均等化を手動でトリガーします。
obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.TRIGGER_PARTITION_BALANCE();パーティションの均等化を手動でトリガーする詳細な操作については、パーティションの均等化を手動でトリガーするを参照してください。
パーティションの均等化タスクが完了するのを待つと、複数のデータベースにまたがるユーザーテーブルの集約が完了します。
パーティションの均等化プロセス中は、ビューを使用して均等化タスクの進捗状況を確認できます。ステートメントは以下のとおりです:
obclient(root@mysql001)[(none)]> SELECT * FROM oceanbase.DBA_OB_BALANCE_JOBS WHERE JOB_TYPE = 'PARTITION_BALANCE';パーティションの均等化タスクの進捗状況を確認する詳細な操作については、バックグラウンドのパーティション均等化タスクを確認するを参照してください。
均等化が完了すると、これらのテーブルグループの重み分布は次のとおりになります:
シナリオ6:SHARDING = 'NONE' かつ SCOPE = 'ZONE' のテーブルグループの重みの適用
シナリオの説明
業務上、あるゾーンにユーザーテーブルを集約し、ゾーンをまたいだ分散読み書きを回避する必要がある場合、これらのユーザーテーブルを SHARDING = NONE + SCOPE = ZONE のテーブルグループに追加できます。複数の SHARDING = NONE + SCOPE = ZONE テーブルグループを設定し、異なるテーブルグループ間のアクセストラフィックに大きな差がある場合は、テーブルグループレベルの重みを設定できます。
手順
ユーザーテーブルが既に作成されている状態で、テーブルグループのプロパティを変更し、SHARDING = NONE + SCOPE = ZONE テーブルグループを設定する必要がある場合、以下の手順を参考にしてください:
MySQLモードのテナントのテナント管理者がデータベースに接続します。
接続例は以下のとおりです。データベースへの接続時は、実際の環境に準じてください。
obclient -h10.xx.xx.xx -P2883 -uroot@mysql_tenant#obdemo -p***** -Aテナントレベルの構成パラメータ
enable_transferの値をFalseに設定し、Transfer機能を無効にします。obclient(root@mysql001)[(none)]> ALTER SYSTEM SET enable_transfer = False;各ユーザーテーブルグループに対して、
SHARDING = 'NONE'+SCOPE = 'ZONE'のテーブルグループを作成し、対応するテーブルをテーブルグループに追加します。テーブルグループを作成し、テーブルをテーブルグループに追加するサンプルステートメントは以下のとおりです:
obclient(root@mysql001)[test]> CREATE TABLEGROUP TG_DB_1 SHARDING = 'NONE', SCOPE = 'ZONE';obclient(root@mysql001)[test]> ALTER TABLEGROUP TG_DB_1 ADD tbl1,tbl2;テーブルグループの作成とテーブルの追加の詳細な操作については、テーブルグループの作成およびテーブルのテーブルグループへの追加を参照してください。
ホットスポットテーブルグループに重みを設定します。
ステートメントの例は以下のとおりです:
obclient(root@mysql001)[test]> CALL DBMS_BALANCE.SET_TABLEGROUP_BALANCE_WEIGHT(10,'TG_DB_1');テーブルグループの重み設定の詳細な操作については、テーブルグループの重み設定を参照してください。
各ホットスポットテーブルグループに対して、分散させるゾーンを選択し、ホットスポットテーブルグループ内で
table_idが最小のテーブルがターゲットゾーン上に配置されるようにします。これは、Transfer Partitionを手動で実行してパーティションリーダーをターゲットゾーンに調整することで実現できます。ゾーンの選択基準は以下のとおりです:各ホットスポットテーブルグループが選択するゾーンはそれぞれ異なり、ホットスポットが同一ゾーンに集中するのを避けます。
ホットスポットテーブルグループ内の大多数のテーブルが既にターゲットゾーン上にあるため、パーティションリーダーを同一ゾーンに揃えるために必要なTransferのパーティション数を削減します。
(オプション)その他の非ホットスポットテーブルグループについて、グループ内で
table_idが最小のテーブルを調整し、グループ内の大多数のテーブルと同じゾーン内に保ちます。テナントレベルの構成パラメータ
enable_transferの値をTrueに設定し、Transfer機能を再有効化します。obclient(root@mysql001)[(none)]> ALTER SYSTEM SET enable_transfer = True;手動で1ラウンドのパーティション均衡をトリガーします。
obclient(root@mysql001)[(none)]> CALL DBMS_BALANCE.TRIGGER_PARTITION_BALANCE();パーティション均衡を手動でトリガーする詳細な操作については、手動でパーティション均衡をトリガーするを参照してください。
実行が成功すると、各テーブルグループ内のパーティションは、まず
table_idが最小のテーブルと自動的に整列され、その後ゾーン間での重み、数、ディスクの均衡が行われます。