テナントのスケールアウトとスケールインとは、本質的にはテナントのサービス能力(コンピュート能力とストレージ容量)を向上または低下させる操作です。この操作は、単一ノードのサービス能力を垂直に向上または低下させる方法と、水平に増減させる方法の2種類があります。本記事では、Primary Zoneを変更することで、計算ノードを水平に増減させ、テナント全体のサービス能力を向上または低下させることで、テナントのスケールアウト・インを実現する方法を紹介します。
前提条件
テナントのスケーリング操作を行う前に、以下の操作が必要です:
テナント内のロードバランシングポリシーを設定します。
テナント内のロードバランシングポリシーは、テナントレベルの構成パラメータ
enable_rebalanceとenable_transferによって共同で制御されます。パラメータ
enable_rebalanceは、システムテナントではテナント間のロードバランシングを有効にするかどうかを、ユーザーテナントではテナント内のロードバランシングを有効にするかどうかを制御します。テナントのスケールアップおよびスケールダウン操作を行う際には、テナント内のロードバランシングを有効にする必要があります。テナント間のロードバランシングポリシーとテナント内のロードバランシングポリシーの詳細については、データロードバランシングのベストプラクティスを参照してください。この構成パラメータのデフォルト値はtrueで、ロードバランシングを有効にすることを示します。設定後は OBServer ノードの再起動を必要とせず、即時に反映されます。パラメータ
enable_transferは、テナント下の Transfer 機能を有効にするかどうかを制御します。デフォルト値はtrueです。設定後は OBServer ノードの再起動を必要とせず、即時に反映されます。パラメータenable_transferの値の意味は、パラメータenable_rebalanceの値に依存します:パラメータ
enable_rebalanceの値がfalseの場合、パラメータenable_transferの値がtrueであってもfalseであっても、システムは自動ロードバランシングを行いません。パラメータ
enable_rebalanceの値がtrueで、enable_transferの値がtrueの場合、テナントのスケールアップおよびスケールダウン操作を行う際、システムはパーティションの分布を自動的に調整し、ロードバランシングを実現します。パラメータ
enable_rebalanceの値がtrueで、enable_transferの値がfalseの場合、テナントのスケールアップおよびスケールダウン操作を行う際、システムは Transfer 操作を実行できず、ログストリーム移行による限られたロードバランシングしか実現できません。
具体的な設定方法は以下のとおりです:
システムテナントで指定されたテナントのロードバランシングポリシーを設定します。
システムテナントで指定されたテナントのテナント内ロードバランシングとテナント下の Transfer 機能を有効にします。
ALTER SYSTEM SET enable_rebalance = true TENANT = 'tenant_name';ALTER SYSTEM SET enable_transfer = true TENANT = 'tenant_name';上記のステートメントは、指定されたテナントの構成パラメータ
enable_rebalanceとenable_transferの値がtrueであることを示します。
システムテナントですべてのユーザーテナント(
sysテナントとメタテナントを除く)のテナント内ロードバランシングとテナント下の Transfer 機能を有効にします。```sql ALTER SYSTEM SET enable_rebalance = true TENANT = all_user; ``` ```sql ALTER SYSTEM SET enable_transfer = true TENANT = all_user; ``` または ```sql ALTER SYSTEM SET enable_rebalance = true TENANT = all; ``` ```sql ALTER SYSTEM SET enable_transfer = true TENANT = all; ``` 上記のステートメントは、すべてのユーザーテナントの構成パラメータ `enable_rebalance` と `enable_transfer` の値が `true` であることを示します。 <main id="notice" type='explain'> <h4>説明</h4> <p>OceanBaseデータベースは、V4.2.1バージョンから、<code>TENANT = all_user</code> と <code>TENANT = all</code> のセマンティクスが同じになりました。すべてのユーザーテナントに適用する必要がある場合は、<code>TENANT = all_user</code> を使用することを推奨します。今後、<code>TENANT = all</code> は廃止されます。</p> </main>ユーザーテナントで本テナントのロードバランシングポリシーを設定します。
MySQLモードOracleモードMySQLテナントで本テナントのテナント内ロードバランシングとテナント下のTransfer機能を有効にするステートメントは以下のとおりです:
ALTER SYSTEM SET enable_rebalance = true;ALTER SYSTEM SET enable_transfer = true;Oracleテナントで本テナントのテナント内ロードバランシングとテナント下のTransfer機能を有効にするステートメントは以下のとおりです:
ALTER SYSTEM SET enable_rebalance = 'true';ALTER SYSTEM SET enable_transfer = 'true';
enable_rebalanceとenable_transferの設定項目の詳細については、enable_rebalance と enable_transfer を参照してください。テナントのスケールアウト/イン操作を実行する前に、テナントのリソース計画を実行することを推奨します。これにより、より良い結果を得ることができます。
テナントのスケールアウト/インに関するリソース計画の詳細な手順については、テナントのスケールアウト/インのリソース計画 を参照してください。
プライマリゾーンの追加
rootユーザーを使用して、クラスタのsysテナントにログインします。obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -Aoceanbaseデータベースに移動します。use oceanbase;テナント
mysql001の基本情報を、TENANT_ID、PRIMARY_ZONEなどの情報で確認します。obclient> SELECT TENANT_ID, TENANT_NAME, PRIMARY_ZONE FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mysql001';クエリ結果は次のとおりです:
+-----------+-------------+--------------+ | TENANT_ID | TENANT_NAME | PRIMARY_ZONE | +-----------+-------------+--------------+ | 1004 | mysql001 | zone1;zone2 | +-----------+-------------+--------------+ 1 row in setクエリ結果から、テナント
mysql001のTENANT_IDは1004であり、PRIMARY_ZONEの第一優先順位はzone1であることがわかります。テナント
mysql001の現在のログストリームリーダーのレプリカ位置の分布情報を確認します。obclient> SELECT TENANT_ID, LS_ID, SVR_IP, SVR_PORT, ZONE, ROLE, REPLICA_TYPE FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE TENANT_ID = 1004 AND LS_ID != 1 AND ROLE = 'LEADER';クエリ結果は次のとおりです:
+-----------+-------+---------------+----------+--------+--------+--------------+ | TENANT_ID | LS_ID | SVR_IP | SVR_PORT | ZONE | ROLE | REPLICA_TYPE | +-----------+-------+---------------+----------+--------+--------+--------------+ | 1004 | 1001 | 172.xx.xxx.xx | 2882 | zone1 | LEADER | FULL | | 1004 | 1012 | 172.xx.xxx.xx | 2882 | zone1 | LEADER | FULL | +-----------+-------+---------------+----------+--------+--------+--------------+ 2 rows in setクエリ結果から、テナント
mysql001は2つのリーダーレプリカがサービスを提供しており、zone1の2台のマシンに均等に分散していることがわかります。テナント
mysql001のPRIMARY_ZONEプロパティを変更し、第一優先順位ゾーンの数を1から2に調整します。obclient> ALTER TENANT mysql001 PRIMARY_ZONE='zone1,zone2';プライマリゾーン追加タスクの実行状態を確認します。
obclient> SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE='ALTER_TENANT_PRIMARY_ZONE' AND TENANT_ID = 1004;クエリ結果は次のとおりです:
+--------+---------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+--------------------------------------------------+----------------------------------------+----------------+-------------+ | JOB_ID | JOB_TYPE | JOB_STATUS | RESULT_CODE | PROGRESS | START_TIME | MODIFY_TIME | TENANT_ID | SQL_TEXT | EXTRA_INFO | RS_SVR_IP | RS_SVR_PORT | +--------+---------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+--------------------------------------------------+----------------------------------------+----------------+-------------+ | 4 | ALTER_TENANT_PRIMARY_ZONE | SUCCESS | 0 | 100 | 2024-12-18 17:26:00.069089 | 2024-12-18 17:26:20.919021 | 1004 | ALTER TENANT mysql001 PRIMARY_ZONE='zone1,zone2' | FROM: 'zone1;zone2', TO: 'zone1,zone2' | 172.xx.xxx.xx | 2882 | +--------+---------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+--------------------------------------------------+----------------------------------------+----------------+-------------+ 1 row in setクエリ結果から、以下のフィールドに基づいて対応するタスクレコードを見つけてください:
START_TIME:タスクの開始時間。SQL_TEXT:タスクに対応するSQLステートメント。EXTRA_INFO:変更前後のプライマリゾーン情報。
対応するタスクレコードの
JOB_STATUSの値がSUCCESSの場合、プライマリゾーン追加タスクが正常に実行されたことを示します。ビュー
DBA_OB_TENANT_JOBSの詳細なフィールドの説明については、DBA_OB_TENANT_JOBSを参照してください。テナント
mysql001の基本情報を確認し、PRIMARY_ZONEプロパティの変更が成功したことを確認します。優先順位1がzone1からzone1,zone2に変更されました。obclient> SELECT PRIMARY_ZONE FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_ID = 1004;クエリ結果は次のとおりです:
+--------------+ | PRIMARY_ZONE | +--------------+ | zone1,zone2 | +--------------+ 1 row in set再度、テナント
mysql001のログストリームリーダーのレプリカ位置の分布情報を確認します。obclient> SELECT TENANT_ID, LS_ID, SVR_IP, SVR_PORT, ZONE, ROLE, REPLICA_TYPE FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE TENANT_ID = 1004 AND LS_ID != 1 AND ROLE = 'LEADER';クエリ結果は次のとおりです:
+-----------+-------+---------------+----------+-------+--------+--------------+ | TENANT_ID | LS_ID | SVR_IP | SVR_PORT | ZONE | ROLE | REPLICA_TYPE | +-----------+-------+---------------+----------+-------+--------+--------------+ | 1004 | 1001 | 172.xx.xxx.xx | 2882 | zone1 | LEADER | FULL | | 1004 | 1012 | 172.xx.xxx.xx | 2882 | zone1 | LEADER | FULL | | 1004 | 1013 | 172.xx.xxx.xx | 2882 | zone2 | LEADER | FULL | | 1004 | 1014 | 172.xx.xxx.xx | 2882 | zone2 | LEADER | FULL | +-----------+-------+---------------+----------+-------+--------+--------------+ 4 rows in setクエリ結果から、テナント
mysql001はzone1とzone2にそれぞれ2つのリーダーレプリカがあり、合計4つのリーダーレプリカがサービスを提供していることがわかります。
上記の例から、変更前はテナント mysql001 の PRIMARY_ZONE の優先順位1のゾーンの数が1であり、2つのリーダーレプリカがサービスを提供していました。変更後は、テナント mysql001 の PRIMARY_ZONE の優先順位1のゾーンの数が1から2に変更され、サービスを提供するリーダーレプリカが2から4に増加し、計算ノードが追加されたことで、テナントのスケーリングが実現されました。
プライマリゾーンの削減
rootユーザーを使用して、クラスタのsysテナントにログインします。obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -Aoceanbaseデータベースに移動します。use oceanbase;テナント
mysql001の基本情報を、TENANT_ID、PRIMARY_ZONEなどの情報とともに確認します。obclient> SELECT TENANT_ID, TENANT_NAME, PRIMARY_ZONE FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME = 'mysql001';確認結果は次のとおりです:
+-----------+-------------+--------------+ | TENANT_ID | TENANT_NAME | PRIMARY_ZONE | +-----------+-------------+--------------+ | 1004 | mysql001 | zone1,zone2 | +-----------+-------------+--------------+ 1 row in setクエリ結果から、テナント
mysql001のTENANT_IDは1004であり、PRIMARY_ZONEの第一優先順位はzone1であることがわかります。テナント
mysql001の現在のログストリームのリーダー複製の位置分布情報を確認します。obclient> SELECT TENANT_ID, LS_ID, SVR_IP, SVR_PORT, ZONE, ROLE, REPLICA_TYPE FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE TENANT_ID = 1004 AND LS_ID != 1 AND ROLE = 'LEADER';確認結果は次のとおりです:
+-----------+-------+---------------+----------+-------+--------+--------------+ | TENANT_ID | LS_ID | SVR_IP | SVR_PORT | ZONE | ROLE | REPLICA_TYPE | +-----------+-------+---------------+----------+-------+--------+--------------+ | 1004 | 1001 | 172.xx.xxx.xx | 2882 | zone1 | LEADER | FULL | | 1004 | 1012 | 172.xx.xxx.xx | 2882 | zone1 | LEADER | FULL | | 1004 | 1013 | 172.xx.xxx.xx | 2882 | zone2 | LEADER | FULL | | 1004 | 1014 | 172.xx.xxx.xx | 2882 | zone2 | LEADER | FULL | +-----------+-------+---------------+----------+-------+--------+--------------+ 4 rows in set確認結果から、テナント
mysql001は現在、4つのリーダー複製がサービスを提供しており、zone1とzone2のそれぞれの2台のマシンに均等に分散しています。テナント
mysql001のPRIMARY_ZONEプロパティを変更し、優先順位1のゾーンの数を2から1に調整します。obclient> ALTER TENANT mysql001 PRIMARY_ZONE='zone1;zone2';プライマリゾーンの削減タスクの実行状態を確認します。
obclient> SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE='ALTER_TENANT_PRIMARY_ZONE' AND TENANT_ID = 1004;確認結果は次のとおりです:
+--------+---------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+--------------------------------------------------+-----------------------------------------+----------------+-------------+ | JOB_ID | JOB_TYPE | JOB_STATUS | RESULT_CODE | PROGRESS | START_TIME | MODIFY_TIME | TENANT_ID | SQL_TEXT | EXTRA_INFO | RS_SVR_IP | RS_SVR_PORT | +--------+---------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+--------------------------------------------------+-----------------------------------------+----------------+-------------+ | 4 | ALTER_TENANT_PRIMARY_ZONE | SUCCESS | 0 | 100 | 2024-12-18 17:26:00.069089 | 2024-12-18 17:26:20.919021 | 1004 | ALTER TENANT mysql001 PRIMARY_ZONE='zone1,zone2' | FROM: 'zone1;zone2', TO: 'zone1,zone2' | 172.xx.xxx.xx | 2882 | | 5 | ALTER_TENANT_PRIMARY_ZONE | SUCCESS | 0 | 100 | 2024-12-18 17:41:44.412459 | 2024-12-18 17:41:54.965873 | 1004 | ALTER TENANT mysql001 PRIMARY_ZONE='zone1;zone2' | FROM: 'zone1,zone2', TO: 'zone1;zone2' | 172.xx.xxx.xx | 2882 | +--------+---------------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+--------------------------------------------------+-----------------------------------------+----------------+-------------+ 2 rows in set確認結果から、以下のフィールドに基づいて対応するタスクレコードを見つけてください。
START_TIME:タスクの開始時間。SQL_TEXT:タスクに対応するSQLステートメント。EXTRA_INFO:変更前後のプライマリゾーンの情報。
対応するタスクレコードの
JOB_STATUSの値がSUCCESSの場合、プライマリゾーンの削減タスクが正常に実行されたことを示します。ビュー
DBA_OB_TENANT_JOBSの詳細なフィールドの説明については、DBA_OB_TENANT_JOBSを参照してください。テナント
mysql001の基本情報を確認し、PRIMARY_ZONEプロパティの変更が成功したことを確認します。変更前はzone1,zone2でしたが、変更後はzone1;zone2に変更されました。obclient> SELECT PRIMARY_ZONE FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_ID = 1004;確認結果は次のとおりです:
+--------------+ | PRIMARY_ZONE | +--------------+ | zone1;zone2 | +--------------+ 1 row in set再び、テナント
mysql001のログストリームのリーダー複製の位置分布情報を確認します。obclient> SELECT TENANT_ID, LS_ID, SVR_IP, SVR_PORT, ZONE, ROLE, REPLICA_TYPE FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE TENANT_ID = 1004 AND LS_ID != 1 AND ROLE = 'LEADER';確認結果は次のとおりです:
+-----------+-------+---------------+----------+--------+--------+--------------+ | TENANT_ID | LS_ID | SVR_IP | SVR_PORT | ZONE | ROLE | REPLICA_TYPE | +-----------+-------+---------------+----------+--------+--------+--------------+ | 1004 | 1001 | 172.xx.xxx.xx | 2882 | zone1 | LEADER | FULL | | 1004 | 1012 | 172.xx.xxx.xx | 2882 | zone1 | LEADER | FULL | +-----------+-------+---------------+----------+--------+--------+--------------+ 2 rows in set確認結果から、テナント
mysql001は現在、zone1の2つのリーダー複製がサービスを提供しています。
上記の例から、変更前は、テナント mysql001 の PRIMARY_ZONE の優先順位1のゾーンの数が2で、4つのリーダー複製がサービスを提供していました。変更後は、テナント mysql001 の PRIMARY_ZONE の優先順位1のゾーンの数が2から1に変更され、サービスを提供するリーダー複製は4から2に変更されました。これにより、計算ノードが削減され、テナントのスケールダウンが実現されました。