業務上のニーズに応じて、テナント内のログストリームのFフォローアップレプリカをRフォローアップレプリカに変換したり、RフォローアップレプリカをFフォローアップレプリカに変換したりできます。
注意事項
現在、RレプリカとFレプリカのみがレプリカタイプ間の相互変換をサポートしており、Cレプリカはレプリカタイプの変換をサポートしていません。
Localityを変更してレプリカタイプを変換する
例:テナントmysql001のLocalityをF@zone1,F@zone2,F@zone3からF@zone1,F@zone2,R@zone3に変更します。
rootユーザーでクラスタのsysテナントにログインします。
接続例は以下のとおりです:
obclient -h172.30.xxx.xxx -P2883 -uroot@sys#obdemo -pxxxx -Aoceanbaseデータベースに移動します。obclient>use oceanbase;変更前のLocalityを確認します。
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 | RANDOM | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1001 | META$1002 | META | zone1;zone3;zone2 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1002 | mysql001 | USER | zone1;zone3;zone2 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1003 | META$1004 | META | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1004 | oracle001 | USER | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | +-----------+-------------+-------------+-------------------+---------------------------------------------+ 5 rows in setテナント
mysql001のLocalityを変更します。obclient> ALTER TENANT mysql001 LOCALITY="F@zone1,F@zone2,R@zone3";Locality変更タスクの実行状態を確認します。
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 | 2024-04-10 11:16:46.242622 | 2024-04-10 11:16:46.242622 | 1002 | ALTER TENANT mysql001 LOCALITY="F@zone1,F@zone2,R@zone3" | FROM: 'FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3', TO: 'FULL{1}@zone1, FULL{1}@zone2, READONLY{1}@zone3' | 172.xx.xxx.192 | 2882 | +--------+-----------------------+------------+-------------+----------+----------------------------+----------------------------+-----------+-----------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------+----------------+-------------+ 1 rows in setクエリ結果によると、
JOB_STATUSがSUCCESSと表示されているため、Locality変更タスクは正常に実行されました。変更後のLocalityを確認します。
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 | RANDOM | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1001 | META$1002 | META | zone1;zone3;zone2 | FULL{1}@zone1, FULL{1}@zone2, READONLY{1}@zone3 | | 1002 | mysql001 | USER | zone1;zone3;zone2 | FULL{1}@zone1, FULL{1}@zone2, READONLY{1}@zone3 | | 1003 | META$1004 | META | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | | 1004 | oracle001 | USER | zone1;zone2;zone3 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | +-----------+-------------+-------------+-------------------+-------------------------------------------------+ 5 rows in setステップ3とステップ6のクエリを比較すると、テナント
mysql001のLocalityは元のFULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3からFULL{1}@zone1, FULL{1}@zone2, READONLY{1}@zone3に変更され、テナントmysql001のレプリカタイプの変換に成功しました。
レプリカタイプの手動変換
通常、Localityを変更することでレプリカタイプを変更する場合、システムは自動的にレプリカタイプを変換します。しかし、何らかの異常な理由によりシステムが正常に動作しない場合は、ALTER SYSTEM MODIFY REPLICA コマンドを使用して手動でレプリカタイプを変換できます。
制限事項
システムテナント(sysテナント)はすべてのテナントのログストリームに対してレプリカタイプ変換操作を実行できますが、ユーザーテナントは自身のログストリームに対してのみレプリカタイプ変換操作を実行できます。
テナント内の同一ログストリームについては、レプリカ移行タスクを複数パラレル実行できる場合を除き、他の災害復旧タスク(レプリカの追加、削除、レプリカタイプの変換、ログストリームの法定メンバー数の変更など)は一度に1つしか実行できません。
sysテナントは
CDB_OB_LS_REPLICA_TASKSビューを使用して実行中の災害復旧タスクがあるかどうかを確認できます。ユーザーテナントはDBA_OB_LS_REPLICA_TASKSビューを使用して実行中の災害復旧タスクがあるかどうかを確認できます。
前提条件
レプリカタイプ変換操作を実行する前に、現在のユーザーが
ALTER SYSTEM権限を持っていることを確認してください。持っていない場合はALTER SYSTEM MODIFY REPLICAコマンドを実行できません。ビューを照会する前に、現在のユーザーが以下のビューに対する
SELECT権限を持っていることを確認してください。持っていない場合は関連情報を照会できません。DBA_OB_TENANTSDBA_OB_LS/CDB_OB_LSDBA_OB_LS_LOCATIONS/CDB_OB_LS_LOCATIONS
操作手順
現在、tenant1というテナントがあり、そのローカリティはF@zone1,F@zone2,R@zone3であるとします。また、tenant1のログストリーム1002には、zone1とzone2にそれぞれFタイプのレプリカが1つずつあり、zone3にもFタイプのレプリカが1つあります。今回は、手動でzone3上のFレプリカをRレプリカに変換する必要があります。
ユーザーがクラスタに対応するテナントにログインします。
接続例は以下のとおりです:
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}@zone2, READONLY{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;zone2 | 0 | 0 | NULL | NULL | 1712122872503652000 | 1712122872503652000 | | | 1001 | NORMAL | zone1;zone2 | 1002 | 1001 | 1711951977207156000 | NULL | 1712122872503652000 | 1712122872503652000 | | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+ 2 rows in setクエリ結果によると、tenant1テナントにはログストリーム1とログストリーム1001があります。
ビュー
DBA_OB_LS内の各フィールドの詳細については、DBA_OB_LSを参照してください。
操作対象のテナントのログストリームのレプリカ分布を確認します。
システムテナント
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 | +---------------------+---------------------+-------+----------------+----------+----------+-------+----------+-------------------------------------------------------------------+----------------------+--------------+--------------+---------+ | 01-APR-24 02.13.04. | 01-APR-24 02.13.04. | 1001 | 172.xx.xxx.192 | 2882 | 2881 | zone3 | FOLLOWER | NULL | NULL | FULL | NULL | FALSE | | 01-APR-24 02.13.04. | 01-APR-24 02.13.04. | 1001 | 172.xx.xxx.212 | 2882 | 2881 | zone2 | FOLLOWER | NULL | NULL | FULL | NULL | FALSE | | 01-APR-24 02.13.04. | 01-APR-24 02.13.10. | 1001 | 172.xx.xxx.226 | 2882 | 2881 | zone1 | LEADER | 172.xx.xxx.192:2882:1,172.xx.xxx.212:2882:1,172.xx.xxx.226:2882:1 | 3 | FULL | NULL | FALSE | +---------------------+---------------------+-------+----------------+----------+----------+-------+----------+-------------------------------------------------------------------+----------------------+--------------+--------------+---------+ 3 rows in setクエリ結果によると、テナントのログストリーム1001は
172.xx.xxx.192:2882、172.xx.xxx.212:2882、172.xx.xxx.226:2882にそれぞれFタイプのレプリカが1つずつあります。さらに、クエリしたローカリティ情報と組み合わせると、zone3上のレプリカタイプはRタイプであるため、100.xx.xxx.192:2882上のFレプリカをRレプリカに変換する必要があります。ビュー
DBA_OB_LS_LOCATIONS内の各フィールドの詳細については、DBA_OB_LS_LOCATIONSを参照してください。
レプリカタイプ変換コマンドを実行します。
ステートメントは以下のとおりです:
ALTER SYSTEM MODIFY REPLICA LS [=] ls_id SERVER [=] 'svr_ip:svr_port' REPLICA_TYPE [=] 'replica_type' [PAXOS_REPLICA_NUM [=] paxos_replica_num] [TENANT [=] 'tenant_name'];ステートメントの使用方法:
ls_id:変換対象のレプリカタイプのログストリームIDを指定します。svr_ip:svr_port:変換対象のレプリカタイプのターゲットサーバーのIPアドレスとポート番号を指定します。例:172.xx.xxx.192:2882。replica_type:変換後のターゲットレプリカタイプを指定します。現在、以下の2種類のレプリカタイプ間の相互変換がサポートされています:フル機能レプリカ:
FULLまたはFを使用して表します。読み取り専用レプリカ:
READONLYまたはRを使用して表します。
paxos_replica_num:変更後のログストリームのパクシスメンバー数、つまりテナントローカリティ内のフル機能(F)レプリカの数を指定します。同時に、1つのログストリームのFレプリカ数は最大7個です。このパラメータの値を指定する際には、以下の点に注意する必要があります:
FレプリカをRレプリカに変換する場合、変換後はFレプリカが1つ削除されることになるため、
paxos_replica_numの値から1を引く必要があります。RレプリカをFレプリカに変換する場合、変換後はFレプリカが1つ追加されることになるため、
paxos_replica_numの値に1を加える必要があります。変更後の
paxos_replica_numは過半数を満たす必要があります。paxos_replica_numの値は、現在のリーダーレプリカのMEMBER_LISTのメンバー数以上である必要があります。sysテナントはビューCDB_OB_LS_LOCATIONSを照会することで確認できます。ユーザーテナントはビューDBA_OB_LS_LOCATIONSを照会することで確認できます。paxos_replica_numの値の変化の絶対値は1を超えてはなりません。例えば、現在のpaxos_replica_numが3の場合、paxos_replica_numは2または4にしか変更できません。
指定した値が上記のいずれかの条件を満たしていない場合、システムはエラーを報告します。この値を明示的に指定しない場合、システムは現在のデフォルトの
paxos_replica_numを使用します。例えば、この例では、paxos_replica_numのデフォルトは3です。tenant_name:操作対象のテナントを指定します。システムテナントは他のテナントを指定できますが、ユーザーテナントは自身のテナントのみを指定できます。操作対象のテナントを明示的に指定しない場合、デフォルトのテナント名は現在のテナントになります。このステートメントでは、all、all_user、all_metaなどを使用してすべてのテナント、ユーザーテナント、およびすべてのMetaテナントを指定することはサポートされていません。このステートメントでは、一度に1つのレプリカのタイプしか変更できません。
例は以下のとおりです:
obclient> ALTER SYSTEM MODIFY REPLICA LS = 1001 SERVER='172.xx.xxx.192:2882' REPLICA_TYPE='R' PAXOS_REPLICA_NUM=2;コマンドの実行が成功した後、再度ターゲットログストリームのレプリカ分布を確認します。
システムテナント
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 | +---------------------+---------------------+-------+----------------+----------+----------+-------+----------+---------------------------------------------+----------------------+--------------+-------------------------+---------+ | 01-APR-24 02.13.04. | 03-APR-24 01.52.17. | 1001 | 172.xx.xxx.192 | 2882 | 2881 | zone3 | FOLLOWER | NULL | NULL | READONLY | NULL | FALSE | | 01-APR-24 02.13.04. | 03-APR-24 01.52.18. | 1001 | 172.xx.xxx.212 | 2882 | 2881 | zone2 | FOLLOWER | NULL | NULL | FULL | NULL | FALSE | | 01-APR-24 02.13.04. | 03-APR-24 01.52.17. | 1001 | 172.xx.xxx.226 | 2882 | 2881 | zone1 | LEADER | 172.xx.xxx.212:2882:1,172.xx.xxx.226:2882:1 | 2 | FULL | 172.xx.xxx.192:2882:1:0 | FALSE | +---------------------+---------------------+-------+----------------+----------+----------+-------+----------+---------------------------------------------+----------------------+--------------+-------------------------+---------+ 3 rows in setクエリ結果から、テナントのログストリーム1001の
172.xx.xxx.192:2882上のレプリカがRタイプのレプリカに変わったことがわかります。