本記事では、テナント内のログストリームのレプリカ数を削減する方法について説明します。
Localityの変更によるレプリカ数の削減
クラスタ内の特定のテナントのLocalityを変更することで、そのテナントのログストリームのレプリカ数を削減できます。Localityの変更方法および注意点の詳細については、Localityの変更を参照してください。
前提条件
Localityを変更する前に、変更対象のZone上の各ノードのリソース割り当て状況を確認する必要があります。Zone上のノードのリソースが不足しているため、テナントが必要とするリソースユニットを格納できない場合は、Localityの変更を行うことができません。
Zone上の各ノードのリソース割り当て状況については、テナントおよびリソース情報の表示を参照してください。
注意事項
テナントのLocalityは空にすることはできません。
テナントのLocalityが変更されると、そのテナント内のすべてのテーブルのレプリカの分散状況も変更されます。
旧バッチのテナントLocalityの変更が完了する前に、新しいバッチのテナントLocalityの変更を実行することは許可されません。
レプリカ数を削減した後、リソースを解放する場合は、対象となるテナントのリソースプールを縮小することにも注意する必要があります。
z1,z2,z3を例にとると、z3を削除する場合、以下の2つのシナリオがあります:テナントが
z3上に独立したリソースプールを持っている場合。例えば、テナントがresource_pool1とresource_pool2の2つのリソースプールを持ち、そのうちresource_pool2がz3に配置されている場合、レプリカ数を削減した後、resource_pool2をテナントのリソースプールリストから削除し、リソースプールを削除して実際にリソースを解放する必要があります。リソースプールの削除手順の詳細については、リソースプールの削除を参照してください。z3上に独立したリソースプールがない場合。例えば、テナントのリソースプールresource_pool1がz2とz3に配置されている場合、レプリカ数を削減した後、resource_pool1のzoneリストを調整してz3を削除し、実際にリソースを解放する必要があります。リソースプールのzoneリストを調整する手順の詳細については、リソースプールのプロパティの変更を参照してください。
操作手順
例:テナントmysql001のローカリティを変更し、FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3からFULL{1}@zone1, FULL{1}@zone2に変更することで、テナントのレプリカ数を削減します。
説明
ここでは、ゾーンを1つ削減する例を示していますが、実際の操作では、削減後のゾーン数が過半数の原則を満たすように注意してください。
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 | +-----------+-------------+-------------+-------------------+---------------------------------------------+テナント
mysql001は、zone1、zone2、zone3にそれぞれフル機能型レプリカを1つずつ持っていることがわかります。テナント
mysql001のローカリティを変更します。obclient>ALTER TENANT mysql001 locality="FULL{1}@zone1, FULL{1}@zone2";ローカリティ変更タスクの実行状態を確認します。
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 | 0 | 100 | 2023-01-05 19:33:46.730319 | 2023-01-05 19:33:46.920111 | 1002 | ALTER TENANT mysql001 locality='FULL{1}@zone1, FULL{1}@zone2' | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | xx.xx.xx.xx | 2882 | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+------------------------------------------------------------------------------+---------------------------------------------+----------------+-------------+JOB_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 | | 1002 | mysql001 | USER | zone1;zone2 | FULL{1}@zone1, FULL{1}@zone2 | +-----------+-------------+-------------+-------------------+---------------------------------------------+ステップ3とステップ6のクエリを比較すると、テナント
mysql001のローカリティは元のFULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3からFULL{1}@zone1, FULL{1}@zone2に変更され、テナントmysql001のレプリカ数が削減されました。
レプリカの手動削除
通常、ローカリティを変更してレプリカ数を減らすと、システムは自動的に余分なレプリカを削除します。しかし、何らかの異常によりシステムが正常に動作しない場合は、ALTER SYSTEM REMOVE REPLICA コマンドを使用して余分なログストリームレプリカを手動で削除することができます。
制限事項
システムテナント(sysテナント)はすべてのテナントのログストリームを管理できますが、ユーザーテナントは自身のログストリームのみを管理できます。
テナント内の同一ログストリームについては、レプリカ移行タスクは複数パラレル実行可能ですが、その他の災害復旧タスク(レプリカの追加、削除、レプリカタイプの変更、ログストリームの法定メンバー数の変更など)は一度に1つしか実行できません。
sysテナントは
CDB_OB_LS_REPLICA_TASKSビューを使用して実行中の災害復旧タスクがあるかどうかを確認できます。ユーザーテナントはDBA_OB_LS_REPLICA_TASKSビューを使用して実行中の災害復旧タスクがあるかどうかを確認できます。
前提条件
レプリカの削除操作を実行する前に、現在のユーザーが
ALTER SYSTEM権限を持っていることを確認してください。持っていない場合はALTER SYSTEM REMOVE REPLICAコマンドを実行できません。ビューを照会する前に、現在のユーザーが以下のビューに対する
SELECT権限を持っていることを確認してください。持っていない場合は関連情報を照会できません。DBA_OB_TENANTSDBA_OB_LS/CDB_OB_LSDBA_OB_LS_LOCATIONS/CDB_OB_LS_LOCATIONS
操作手順
現在、LocalityがF@zone1,F@zone3のtenant1テナントがあるとします。同時に、tenant1テナントのログストリーム1001はzone1、zone2、zone3にそれぞれFタイプのレプリカを1つずつ持っています。今回、手動でzone2上のレプリカを削除する必要があります。
ユーザーがクラスタに対応するテナントにログインします。
接続例は以下のとおりです:
obclient -h172.30.xxx.xxx -P2883 -uroot@tenant1#obdemo -pxxxx -Aデータベースへの接続方法の詳細については、データベース接続の概要(MySQLモード)およびデータベース接続の概要(Oracleモード)を参照してください。
操作対象のテナントのテナントIDとローカリティ情報を取得します。
システムテナント
obclient [oceanbase]> SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME='tenant1';ユーザーテナント
MySQLモードOracleモードMySQLモードでは、次のステートメントを実行します。
obclient [oceanbase]> SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM oceanbase.DBA_OB_TENANTS;Oracleモードで以下のステートメントを実行します。
obclient [SYS]> SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM SYS.DBA_OB_TENANTS;クエリ結果の例は以下のとおりです:
+-------------+-----------+------------------------------+ | TENANT_NAME | TENANT_ID | LOCALITY | +-------------+-----------+------------------------------+ | tenant1 | 1002 | FULL{1}@zone1, FULL{1}@zone3 | +-------------+-----------+------------------------------+ 1 row in setクエリ結果によると、このテナントに対応するテナントIDは
1002です。ビュー
DBA_OB_TENANTS内の各フィールドの詳細については、DBA_OB_TENANTSを参照してください。
操作対象のテナントのすべてのログストリーム情報を取得します。
システムテナント
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS WHERE TENANT_ID=1002;ビュー
CDB_OB_LS内の各フィールドの詳細については、CDB_OB_LSを参照してください。ユーザーテナント
MySQLモードOracleモードMySQLモードでは、次のステートメントを実行します。
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS;Oracleモードで以下のステートメントを実行します:
obclient [SYS]> SELECT * FROM SYS.DBA_OB_LS;クエリ結果の例は以下のとおりです:
+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+ | LS_ID | STATUS | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID | CREATE_SCN | DROP_SCN | SYNC_SCN | READABLE_SCN | FLAG | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+ | 1 | NORMAL | zone1;zone3 | 0 | 0 | NULL | NULL | 1712136316868815003 | 1712136316868815003 | | | 1001 | NORMAL | zone1;zone3 | 1001 | 1001 | 1711951923021132001 | NULL | 1712136316868815003 | 1712136316868815003 | | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+ 2 rows in setクエリ結果によると、tenant1テナントにはログストリーム1とログストリーム1001があります。
ビュー
DBA_OB_LS内の各フィールドの詳細については、DBA_OB_LSを参照してください。
以前に取得したログストリーム情報に基づいて、ログストリーム1001のレプリカの分布を確認します。
システムテナント
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE LS_ID=1001 AND TENANT_ID=1002;ビュー
CDB_OB_LS_LOCATIONS内の各フィールドの詳細については、CDB_OB_LS_LOCATIONSを参照してください。ユーザーテナント
MySQLモードOracleモードMySQLモードでは、次のステートメントを実行します。
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;Oracleモードで以下のステートメントを実行します。
obclient [SYS]> SELECT * FROM SYS.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;クエリ結果の例は以下のとおりです:
+----------------------------+----------------------------+-------+----------------+----------+----------+-------+----------+----------------------------------------------------------------------------------+----------------------+--------------+--------------+---------+ | CREATE_TIME | MODIFY_TIME | LS_ID | SVR_IP | SVR_PORT | SQL_PORT | ZONE | ROLE | MEMBER_LIST | PAXOS_REPLICA_NUMBER | REPLICA_TYPE | LEARNER_LIST | REBUILD | +----------------------------+----------------------------+-------+----------------+----------+----------+-------+----------+----------------------------------------------------------------------------------+----------------------+--------------+--------------+---------+ | 2024-04-03 17:23:06.381521 | 2024-04-03 17:23:15.934957 | 1001 | 172.xx.xxx.192 | 2882 | 2881 | zone3 | FOLLOWER | NULL | NULL | FULL | | FALSE | | 2024-04-01 14:12:08.588944 | 2024-04-03 17:23:14.904070 | 1001 | 172.xx.xxx.212 | 2882 | 2881 | zone2 | FOLLOWER | NULL | NULL | FULL | | FALSE | | 2024-04-01 14:12:08.589084 | 2024-04-03 17:23:14.080074 | 1001 | 172.xx.xxx.226 | 2882 | 2881 | zone1 | LEADER | 172.xx.xxx.192:2882:1712136186291857,172.xx.xxx.212:2882:1,172.xx.xxx.226:2882:1 | 3 | FULL | | FALSE | +----------------------------+----------------------------+-------+----------------+----------+----------+-------+----------+----------------------------------------------------------------------------------+----------------------+--------------+--------------+---------+ 3 rows in setクエリ結果によると、テナントのログストリーム1001は
172.xx.xxx.192:2882、172.xx.xxx.212:2882、172.xx.xxx.226:2882にそれぞれFタイプのレプリカを1つずつ持っています。ローカリティ情報を組み合わせると、ログストリームの172.xx.xxx.212:2882(zone2)上のレプリカを削除する必要があります。ビュー
DBA_OB_LS_LOCATIONS内の各フィールドの詳細については、DBA_OB_LS_LOCATIONSを参照してください。
レプリカを削除するコマンドを実行します。
ステートメントは以下のとおりです:
ALTER SYSTEM REMOVE REPLICA LS [=] ls_id SERVER [=] 'svr_ip:svr_port' [PAXOS_REPLICA_NUM [=] paxos_replica_num] [TENANT [=] 'tenant_name'];ステートメントの使用方法:
ls_id:削除対象のレプリカのログストリームIDを指定します。svr_ip:svr_port:削除対象のレプリカが存在するサーバーのIPアドレスとポート番号を指定します。例:172.xx.xxx.212:2882。paxos_replica_num:変更後のログストリームの法定メンバー数、つまりテナントのローカリティにおけるフル機能(F)レプリカの数を指定します。同時に、1つのログストリームのFレプリカ数は最大7個です。このパラメータの値を指定する際には、以下の条件を満たす必要があります:
変更後の
paxos_replica_numは過半数を満たす必要があります。paxos_replica_numの値は、現在のリーダーレプリカのMEMBER_LISTのメンバー数以上でなければなりません。paxos_replica_num値の変化の絶対値は1を超えてはなりません。例えば、この例では、現在のpaxos_replica_numは3であり、paxos_replica_numを2にしか変更できません。
指定された値が上記のいずれかの条件を満たさない場合、システムはエラーを報告します。この値を明示的に指定しない場合、システムは現在のデフォルトの
paxos_replica_numを使用します。tenant_name:操作対象のテナントを指定します。システムテナントは他のテナントを指定できますが、ユーザーテナントは自身のテナントのみを指定できます。操作対象のテナントを明示的に指定しない場合、デフォルトのテナント名は現在のテナントになります。このステートメントでは、all、all_user、all_metaなどを使用してすべてのテナント、ユーザーテナント、およびすべてのMetaテナントを指定することはサポートされていません。このステートメントでは一度に1つのレプリカしか削除できません。
ログストリーム1001の
172.xx.xxx.212:2882上のレプリカを削除し、削除後のPAXOS_REPLICA_NUMを2に指定する例は以下のとおりです:obclient> ALTER SYSTEM REMOVE REPLICA LS = 1001 SERVER = '172.xx.xxx.212:2882' PAXOS_REPLICA_NUM = 2;実行が成功した後、再度ログストリーム情報を照会すると、そのログストリームから1つのレプリカが削除されたことが確認できます。
システムテナント
obclient [oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE LS_ID=1001 AND TENANT_ID=1002;ユーザーテナント
MySQLモードOracleモードMySQLモードでは、次のステートメントを実行します。
obclient [oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;Oracleモードで以下のステートメントを実行します。
obclient [SYS]> SELECT * FROM SYS.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;クエリ結果の例は以下のとおりです:
+----------------------------+----------------------------+-------+----------------+----------+----------+-------+----------+------------------------------------------------------------+----------------------+--------------+--------------+---------+ | CREATE_TIME | MODIFY_TIME | LS_ID | SVR_IP | SVR_PORT | SQL_PORT | ZONE | ROLE | MEMBER_LIST | PAXOS_REPLICA_NUMBER | REPLICA_TYPE | LEARNER_LIST | REBUILD | +----------------------------+----------------------------+-------+----------------+----------+----------+-------+----------+------------------------------------------------------------+----------------------+--------------+--------------+---------+ | 2024-04-03 17:23:06.381521 | 2024-04-03 17:32:49.079886 | 1001 | 172.xx.xxx.192 | 2882 | 2881 | zone3 | FOLLOWER | NULL | NULL | FULL | | FALSE | | 2024-04-01 14:12:08.589084 | 2024-04-03 17:32:49.124409 | 1001 | 172.xx.xxx.226 | 2882 | 2881 | zone1 | LEADER | 172.xx.xxx.192:2882:1712136186291857,172.xx.xxx.226:2882:1 | 2 | FULL | | FALSE | +----------------------------+----------------------------+-------+----------------+----------+----------+-------+----------+------------------------------------------------------------+----------------------+--------------+--------------+---------+ 2 rows in setクエリ結果によると、テナントのログストリーム1001は
172.xx.xxx.192:2882と172.xx.xxx.226:2882にそれぞれFタイプのレプリカを1つずつ持っています。元々172.xx.xxx.212:2882上のレプリカは削除されました。