ビジネスニーズに応じて、テナント内のログストリームの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(root@sys)[(none)]> use oceanbase;変更前のLocalityを確認します。
obclient(root@sys)[oceanbase]> 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(root@sys)[oceanbase]> ALTER TENANT mysql001 LOCALITY="F@zone1,F@zone2,R@zone3";Locality変更タスクの実行状態を確認します。
obclient(root@sys)[oceanbase]> 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(root@sys)[oceanbase]> 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回につき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 にそれぞれ1つのFタイプのレプリカを持ち、zone3 にも1つのFタイプのレプリカを持っています。今回は、手動で zone3 上のFレプリカをRレプリカに変換する必要があります。
クラスタに対応するテナントにユーザーがログインします。
接続例は以下のとおりです:
obclient -h172.30.xxx.xxx -P2883 -uroot@tenant1#obdemo -pxxxx -Aデータベースへの接続操作の詳細については、データベース接続の概要(MySQLモード)およびデータベース接続の概要(Oracleモード)を参照してください。
操作対象のテナントIDとローカリティ情報を取得します。
システムテナント
obclient(root@sys)[oceanbase]> SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM oceanbase.DBA_OB_TENANTS WHERE TENANT_NAME='tenant1';ユーザーテナント
MySQLモードOracleモードMySQLモードで以下のステートメントを実行します:
obclient(root@tenant1)[oceanbase]> SELECT TENANT_NAME,TENANT_ID,LOCALITY FROM oceanbase.DBA_OB_TENANTS;Oracleモードで以下のステートメントを実行します:
obclient(SYS@tenant1)[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(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS WHERE TENANT_ID=1002;ビュー
CDB_OB_LSの各フィールドの詳細については、CDB_OB_LSを参照してください。ユーザーテナント
MySQLモードOracleモードMySQLモードで以下のステートメントを実行します:
obclient(root@tenant1)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS;Oracleモードで以下のステートメントを実行します:
obclient(SYS@tenant1)[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 | UNIT_LIST | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+----------------+ | 1 | NORMAL | zone1;zone2 | 0 | 0 | NULL | NULL | 1712122872503652000 | 1712122872503652000 | | | | 1001 | NORMAL | zone1;zone2 | 1002 | 1001 | 1711951977207156000 | NULL | 1712122872503652000 | 1712122872503652000 | | 1001,1002,1003 | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+----------------+ 2 rows in setクエリ結果から、tenant1 テナントには1号ログストリームと1001号ログストリームがあることがわかります。
ビュー
DBA_OB_LSの各フィールドの詳細については、DBA_OB_LSを参照してください。
操作対象テナントのログストリームのレプリカ分布を確認します。
システムテナント
obclient(root@sys)[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(root@tenant1)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;Oracleモードで以下のステートメントを実行します:
obclient(SYS@tenant1)[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回につき1つのレプリカタイプしか変更できません。
例:
obclient> ALTER SYSTEM MODIFY REPLICA LS = 1001 SERVER='172.xx.xxx.192:2882' REPLICA_TYPE='R' PAXOS_REPLICA_NUM=2;コマンドが正常に実行された後、再度ターゲットログストリームのレプリカ分布を確認します。
システムテナント
obclient(root@sys)[oceanbase]> SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE LS_ID=1001 AND TENANT_ID=1002;ユーザーテナント
MySQLモードOracleモードMySQLモードで以下のステートメントを実行します:
obclient(root@tenant1)[oceanbase]> SELECT * FROM oceanbase.DBA_OB_LS_LOCATIONS WHERE LS_ID=1001;Oracleモードで以下のステートメントを実行します:
obclient(SYS@tenant1)[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タイプのレプリカに変わったことがわかります。