テナントのスケールアウトとスケールインは、本質的にはテナントのサービス能力(計算能力およびストレージ容量を含む)を向上または低下させることです。これは、単一ノードのサービス能力を縦方向に向上または低下させることで達成することも、横方向に向上または低下させることで達成することもできます。本記事では、プライマリゾーンを変更することで計算ノードを横方向に増減し、テナント全体のサービス能力を向上または低下させることで、テナントのスケールアウトまたはスケールインを実現する方法について説明します。
前提条件
テナントのスケーリング操作を実行する前に、以下の操作を行う必要があります:
テナント内のロードバランシングポリシーを設定します。
テナント内のロードバランシングポリシーは、テナントレベルの構成パラメータ
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テナントおよびMetaテナントを除く)のテナント内ロードバランシングおよびテナント配下のTransfer機能を有効にするALTER SYSTEM SET enable_rebalance = true TENANT = all_user;ALTER SYSTEM SET enable_transfer = true TENANT = all_user;または
ALTER SYSTEM SET enable_rebalance = true TENANT = all;ALTER SYSTEM SET enable_transfer = true TENANT = all;上記のステートメントは、すべてのユーザーテナント配下の構成パラメータ
enable_rebalanceとenable_transferの値をtrueに設定することを示します。説明
OceanBaseデータベースはV4.2.1バージョン以降、
TENANT = all_userとTENANT = allの意味は同じです。適用範囲をすべてのユーザーテナントに設定する場合は、TENANT = all_userの使用を推奨します。TENANT = allは今後廃止されます。
ユーザーテナントで自身のテナントのロードバランシングポリシーを設定する
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';Primary Zone追加タスクの実行状態を確認します。
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:変更前後のPrimary Zone情報。
対応するタスクレコードの
JOB_STATUSの値がSUCCESSの場合、Primary Zoneを追加するタスクは正常に実行されたことを意味します。ビュー
DBA_OB_TENANT_JOBSの詳細なフィールド説明については、DBA_OB_TENANT_JOBSを参照してください。テナント
mysql001の基本情報をクエリし、PRIMARY_ZONEプロパティの変更が成功したことを確認します。第一優先ゾーンは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で、2つのリーダーレプリカがサービスを提供していました。変更後は、テナント mysql001 の PRIMARY_ZONE の第一優先ゾーンの数が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とzone2です。テナント
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属性を変更し、第一優先ゾーンの数を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 の第一優先ゾーン数が 2 で、4 つのリーダーレプリカがサービスを提供していました。変更後はテナント mysql001 の PRIMARY_ZONE の第一優先ゾーン数が 2 から 1 に変わり、サービスを提供するリーダーレプリカも 4 から 2 に減少し、計算ノードが削減され、テナントのスケールインが実現されました。