本記事では、クラスタ内の特定のテナントのローカリティを変更することで、そのテナント配下のログストリームのレプリカ分布を調整する方法について説明します。
ローカリティの変更手順および注意点の詳細については、ローカリティの変更を参照してください。
前提条件
ローカリティを変更する前に、変更対象のゾーン上の各ノードのリソース割り当て状況を確認する必要があります。ゾーン上のノードのリソースが不足しており、テナントが必要とするリソースユニットを配置できない場合は、ローカリティの変更を実行できません。
ゾーン上の各ノードのリソース割り当て状況については、テナントとリソース情報の確認を参照してください。
注意点
テナントのローカリティは空にすることはできません。
テナントのローカリティが変更されると、そのテナント配下のすべてのテーブルのレプリカ分布も変更されます。
前回のテナントローカリティの変更が完了する前に、新たなテナントローカリティの変更を実行することはできません。
ローカリティの変更では一度に1つの操作のみを実行できます。例えば、Zone3をZone4に直接置き換えることはできません。まずZone4を追加し、その後Zone3を削除する手順を踏む必要があります。
レプリカの追加により、テナントのローカリティがテナントのプライマリゾーンと一致しなくなる場合があります。追加したゾーンがプライマリゾーン切り替えに関与する場合はプライマリゾーンを変更する必要があります。追加したゾーンがプライマリゾーン切り替えに関与しない場合は、プライマリゾーンを変更する必要はありません。
手順
例:テナントmysql001のローカリティをFULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3からFULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone4に変更します。
rootユーザーでクラスタのsysテナントにログインします。
obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -Aoceanbaseデータベースに入ります。obclient>use oceanbase;テナント
mysql001の変更前のローカリティを確認します。obclient> SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS;クエリ結果は次のとおりです:
+-----------+-------------+-------------+-------------------+---------------------------------------------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE | LOCALITY | +-----------+-------------+-------------+-------------------+---------------------------------------------+ | 1 | sys | SYS | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1001 | META$1002 | META | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1002 | mysql001 | USER | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | +-----------+-------------+-------------+-------------------+---------------------------------------------+ 3 rows in setテナント
mysql001がゾーン1、ゾーン2、ゾーン3にそれぞれフル機能レプリカを1つずつ持っていることが確認できます。テナント
mysql001のローカリティを変更し、ゾーン4にレプリカを追加します。obclient>ALTER TENANT mysql001 locality="FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3, FULL{1}@zone4";ローカリティ変更タスクの実行状態を確認します。
obclient>SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE = 'ALTER_TENANT_LOCALITY';クエリ結果は次のとおりです:
+--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+---------------------------------------------------------------------------------------------+---------------------------------------------+----------------+-------------+ | 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 | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+---------------------------------------------------------------------------------------------+---------------------------------------------+----------------+-------------+ | 1 | ALTER_TENANT_LOCALITY | SUCCESS | NULL | 0 | 2023-01-05 19:38:38.416011 | 2023-01-05 19:38:38.416011 | 1002 | ALTER TENANT mysql001 locality='FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3, FULL{1}@zone4' | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | xx.xx.xx.237 | 2882 | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+---------------------------------------------------------------------------------------------+---------------------------------------------+----------------+-------------+ 1 row in setJOB_STATUSがSUCCESSの場合、ローカリティ変更タスクは正常に実行されたことを示します。テナント
mysql001のローカリティを変更し、ゾーン3のレプリカを削除します。obclient>ALTER TENANT mysql001 locality="FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone4";ローカリティ変更タスクの実行状態を確認します。
obclient>SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE JOB_TYPE = 'ALTER_TENANT_LOCALITY';クエリ結果は次のとおりです:
+--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------------+------------------------------------------------------------+----------------+-------------+ | 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 | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------------+------------------------------------------------------------+----------------+-------------+ | 1 | ALTER_TENANT_LOCALITY | SUCCESS | NULL | 0 | 2023-01-05 19:38:38.416011 | 2023-01-05 19:38:38.416011 | 1002 | ALTER TENANT mysql001 locality='FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone4' | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3, FULL{1}@zone4 | xx.xx.xx.237 | 2882 | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------------+------------------------------------------------------------+----------------+-------------+ 1 row in setJOB_STATUSがSUCCESSの場合、ローカリティ変更タスクは正常に実行されたことを示します。テナント
mysql001の変更後のローカリティを確認します。obclient> SELECT TENANT_ID,TENANT_NAME,TENANT_TYPE,PRIMARY_ZONE,LOCALITY FROM oceanbase.DBA_OB_TENANTS;クエリ結果は次のとおりです:
+-----------+-------------+-------------+-------------------+---------------------------------------------+ | TENANT_ID | TENANT_NAME | TENANT_TYPE | PRIMARY_ZONE | LOCALITY | +-----------+-------------+-------------+-------------------+---------------------------------------------+ | 1 | sys | SYS | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1001 | META$1002 | META | zone1;zone2 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone4 | | 1002 | mysql001 | USER | zone1;zone2 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone4 | +-----------+-------------+-------------+-------------------+---------------------------------------------+ 3 rows in setステップ3とステップ8のクエリ結果を比較すると、テナント
mysql001のローカリティは元のFULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3からFULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone4に変更され、テナントmysql001はゾーン1、ゾーン2、ゾーン4にそれぞれフル機能レプリカを1つずつ持っています。
ステップ4の実行後、レプリカを追加すると、テナントのローカリティがプライマリゾーンと一致しなくなります。追加したゾーンがプライマリレプリカ切り替えに参加する場合は、プライマリゾーンを変更する必要があります。プライマリゾーンの変更操作については、プライマリゾーンの調整を参照してください。追加したゾーンがプライマリレプリカ切り替えに参加しない場合は、プライマリゾーンを変更する必要はありません。