本記事では、テナント内のログストリームのレプリカ数を増やす方法について説明します。
Localityを変更してレプリカを増やす
クラスタ内の特定のテナントのLocalityを変更することで、そのテナントのログストリームのレプリカ数を増やすことができます。Localityの変更方法および注意点の詳細については、Localityの変更を参照してください。
前提条件
レプリカを追加する前に、まずターゲットゾーン上にテナントのリソースプールが存在するかどうかを確認する必要があります。存在しない場合は、既存のリソースプールのゾーンリストを調整するか、テナント用に新しいリソースプールを追加する必要があります。新しいリソースプールを追加する場合、そのリソースプールのユニット数はテナントが既に持っているリソースプールと一致している必要があります。リソースプールの調整または新規追加の詳細な操作については、リソースプールのプロパティの変更またはリソースプールの作成を参照してください。
同時に、変更対象のゾーン上の各ノードのリソース割り当て状況も確認する必要があります。ゾーン上のノードのリソースが不足しているため、テナントが必要とするリソースユニットを格納できない場合、ローカリティの変更は実行できません。
ゾーン上の各ノードのリソース割り当て状況については、テナントおよびリソース情報の表示を参照してください。
注意事項
テナントのローカリティは空にすることはできません。
テナントのローカリティが変更されると、そのテナントのすべてのテーブルのレプリカの配置も変更されます。
前のラウンドのテナントローカリティの変更が完了する前に、次のラウンドのテナントローカリティの変更を実行することは許可されません。
ローカリティの変更では一度に一つのアクションしか実行できません。例えば、Zone3をZone4に直接置き換えることはできません。まずZone4を追加し、その後Zone3を削除する必要があります。
ローカリティを変更する際は、Primary Zoneへの影響に注意する必要があります。Primary Zoneの調整を事前に行うことを推奨します。
例:
Zone3を削減する必要がある場合、Zone3が第一優先順位のPrimary Zoneに属している場合、ローカリティの調整プロセスはテナントの読み書きサービスに影響を与えます。
Zone4を追加する際、Primary ZoneがRANDOMの場合、その後Zone4も読み書きサービスを提供します。
操作手順
例:テナントmysql001のローカリティを変更し、FULL{1}@zone1, FULL{1}@zone2からFULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3に変更することで、zone3に新たなレプリカを追加します。
説明
ここでは、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 | FULL{1}@zone1, FULL{1}@zone2 | | 1002 | mysql001 | USER | zone1;zone2 | FULL{1}@zone1, FULL{1}@zone2 | +-----------+-------------+-------------+-------------------+---------------------------------------------+テナント
mysql001は、それぞれzone1とzone2にフル機能レプリカを1つずつ持っていることがわかります。テナント
mysql001のローカリティを変更します。obclient>ALTER TENANT mysql001 locality="FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3";ローカリティ変更タスクの実行状態を確認します。
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}@zone1, FULL{1}@zone2 | xx.xx.xx.237 | 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, FULL{1}@zone3 | | 1002 | mysql001 | USER | zone1;zone2 | FULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3 | +-----------+-------------+-------------+-------------------+---------------------------------------------+ステップ3とステップ6のクエリを比較すると、テナント
mysql001のローカリティは元のFULL{1}@zone1, FULL{1}@zone2からFULL{1}@zone1, FULL{1}@zone2, FULL{1}@zone3に変更されており、テナントmysql001はzone1、zone2、zone3にそれぞれフル機能レプリカを1つずつ持っています。
レプリカを追加すると、テナントのローカリティとテナントのプライマリゾーンが一致しなくなります。追加したゾーンがリーダーレプリカの切り替えに参加する場合は、プライマリゾーンを変更する必要があります。プライマリゾーンの変更手順については、プライマリゾーンの調整を参照してください。追加したゾーンがリーダーレプリカの切り替えに参加しない場合は、プライマリゾーンを変更する必要はありません。
レプリカの手動追加
Localityを変更してレプリカを増やす場合、通常はシステムが自動的に不足しているレプリカを補います。しかし、何らかの異常な理由によりシステムが正常に動作しない場合、ALTER SYSTEM ADD REPLICA コマンドを使用して不足しているログストリームのレプリカを手動で追加することができます。
制限事項
システムテナント(sysテナント)はすべてのテナントのログストリームに対してレプリカの追加操作を実行できますが、ユーザーテナントは自身のログストリームに対してのみレプリカの追加操作を実行できます。
テナントの同一ログストリームについて、レプリカ移行タスクは複数パラレル実行可能ですが、その他の災害復旧タスク(レプリカの追加、削除、変換、ログストリームの法定メンバー数の変更など)は一度に1つしか実行できません。
sysテナントは
CDB_OB_LS_REPLICA_TASKSビューを使用して実行中の災害復旧タスクがあるかどうかを確認できます。ユーザーテナントはDBA_OB_LS_REPLICA_TASKSビューを使用して実行中の災害復旧タスクがあるかどうかを確認できます。
前提条件
レプリカの追加操作を実行する前に、現在のユーザーが
ALTER SYSTEM権限を持っていることを確認してください。持っていない場合はALTER SYSTEM ADD REPLICAコマンドを実行できません。ビューを照会する前に、現在のユーザーが以下のビューに対する
SELECT権限を持っていることを確認してください。持っていない場合は関連情報を照会できません。DBA_OB_TENANTSDBA_OB_LS/CDB_OB_LSGV$OB_UNITSDBA_OB_LS_LOCATIONS/CDB_OB_LS_LOCATIONS
レプリカの追加操作を実行する前に、ターゲットサーバー上にユーザーが利用可能なリソース、すなわちUnitが存在し、そのUnit上に該当ログストリームのレプリカが存在しないことを確認してください。
操作手順
現在、Tenant1というテナントがあり、そのローカリティはF@zone1,F@zone2,F@zone3であるとします。また、Tenant1のログストリーム1001には、zone1とzone3にそれぞれFタイプのレプリカが1つずつあり、zone2にはレプリカがありません。今回、手動でzone2にFタイプのレプリカを追加する必要があります。
ユーザーがクラスタに対応するテナントにログインします。
接続例は以下のとおりです:
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, 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;zone2 | 0 | 0 | NULL | NULL | 1712137184525565000 | 1712137184525565000 | | | 1001 | NORMAL | zone1;zone3;zone2 | 1001 | 1001 | 1711951923021132001 | NULL | 1712137184292359002 | 1712137184292359002 | | +-------+--------+-------------------+---------------+-------------+---------------------+----------+---------------------+---------------------+------+ 2 rows in setクエリ結果によると、Tenant1にはログストリーム1とログストリーム1001があります。
ビュー
DBA_OB_LSの各フィールドの詳細については、DBA_OB_LSを参照してください。
操作対象のテナントのユニットリソースを取得します。
システムテナント
obclient [oceanbase]> SELECT * FROM oceanbase.GV$OB_UNITS WHERE TENANT_ID=1002;ユーザーテナント
MySQLモードOracleモードMySQLモードでは、次のステートメントを実行します。
obclient [oceanbase]> SELECT * FROM oceanbase.GV$OB_UNITS;Oracleモードで以下のステートメントを実行します。
obclient [SYS]> SELECT * FROM SYS.GV$OB_UNITS;クエリ結果の例は以下のとおりです:
+----------------+----------+---------+-----------+-------+-----------+----------------+---------+---------+-------------+---------------------+---------------------+-------------+---------------+-----------------+------------------+--------+----------------------------+ | SVR_IP | SVR_PORT | UNIT_ID | TENANT_ID | ZONE | ZONE_TYPE | REGION | MAX_CPU | MIN_CPU | MEMORY_SIZE | MAX_IOPS | MIN_IOPS | IOPS_WEIGHT | LOG_DISK_SIZE | LOG_DISK_IN_USE | DATA_DISK_IN_USE | STATUS | CREATE_TIME | +----------------+----------+---------+-----------+-------+-----------+----------------+---------+---------+-------------+---------------------+---------------------+-------------+---------------+-----------------+------------------+--------+----------------------------+ | 172.xx.xxx.226 | 2882 | 1001 | 1002 | zone1 | ReadWrite | default_region | 2 | 2 | 4294967296 | 9223372036854775807 | 9223372036854775807 | 2 | 14495514624 | 665975868 | 17629184 | NORMAL | 2024-04-01 14:11:32.208968 | | 172.xx.xxx.212 | 2882 | 1002 | 1002 | zone2 | ReadWrite | default_region | 2 | 2 | 4294967296 | 9223372036854775807 | 9223372036854775807 | 2 | 14495514624 | 373696561 | 19714048 | NORMAL | 2024-04-01 14:11:32.209358 | | 172.xx.xxx.192 | 2882 | 1003 | 1002 | zone3 | ReadWrite | default_region | 2 | 2 | 4294967296 | 9223372036854775807 | 9223372036854775807 | 2 | 14495514624 | 263322684 | 19726336 | NORMAL | 2024-04-01 14:11:32.209473 | +----------------+----------+---------+-----------+-------+-----------+----------------+---------+---------+-------------+---------------------+---------------------+-------------+---------------+-----------------+------------------+--------+----------------------------+ 3 rows in setクエリ結果によると、現在のテナントは
172.xx.xxx.226:2882、172.xx.xxx.212:2882、172.xx.xxx.192:2882の3台のサーバーで利用可能なユニットリソースを持っています。ビュー
GV$OB_UNITSの各フィールドの詳細については、GV$OB_UNITSを参照してください。
以前に取得したテナントのログストリーム情報に基づいて、ログストリーム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: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.226:2882、172.xx.xxx.212:2882、172.xx.xxx.192:2882の3台のサーバーで利用可能なユニットリソースを持っており、172.xx.xxx.212:2882にはこのログストリームのレプリカがありません。そのため、172.xx.xxx.212:2882のマシンにテナントのログストリーム1001にFタイプのレプリカを追加する必要があります。ビュー
DBA_OB_LS_LOCATIONSの各フィールドの詳細については、DBA_OB_LS_LOCATIONSを参照してください。
レプリカ追加コマンドを実行します。
SQL文は以下のとおりです:
ALTER SYSTEM ADD REPLICA LS [=] ls_id SERVER [=] 'svr_ip:svr_port' REPLICA_TYPE [=] 'replica_type' [DATA_SOURCE [=] 'data_source'] [PAXOS_REPLICA_NUM [=] paxos_replica_num] [TENANT [=] 'tenant_name'];文の使用方法:
ls_id:追加するレプリカのログストリームIDを指定します。svr_ip:svr_port:追加するレプリカのターゲットサーバーのIPアドレスとポート番号を指定します。例:172.xx.xxx.212:2882。replica_type:追加するレプリカのタイプを指定します。現在、以下のレプリカタイプがサポートされています:フル機能レプリカ:
FULLまたはFを使用して表します。読み取り専用レプリカ:
READONLYまたはRを使用して表します。カラムストアレプリカ:
COLUMNSTOREまたはCを使用して表します。
data_source:追加するレプリカのデータソースアドレスを指定します。例:172.xx.xxx.192:2882。指定されたデータソースが利用不可能な場合、システムはエラーを報告します。
この値を明示的に指定しない場合、システムは利用可能なデータソースを自動的に選択します。
paxos_replica_num:変更後のログストリームの法定メンバー数、つまりテナントローカリティ内のフル機能(F)レプリカの数を指定します。同時に、1つのログストリームのFレプリカ数は最大7個です。このパラメータの値を指定する際には、以下の条件を満たす必要があります:
変更後の
paxos_replica_numは過半数を満たす必要があります。paxos_replica_numの値は、現在のリーダーレプリカのMEMBER_LISTのメンバー数以上である必要があります。paxos_replica_numの値の絶対値は1を超えてはなりません。例えば、この例では現在のpaxos_replica_numは2なので、paxos_replica_numを3に変更できるだけです。
指定された値が上記のいずれかの条件を満たしていない場合、システムはエラーを報告します。この値を明示的に指定しない場合、システムは現在のデフォルトの
paxos_replica_numを使用します。tenant_name:操作対象のテナントを指定します。システムテナントは他のテナントを指定できますが、ユーザーテナントは自身のテナントしか指定できません。操作対象のテナントを明示的に指定しない場合、デフォルトのテナント名は現在のテナントになります。このステートメントでは、all、all_user、all_metaなどを使用してすべてのテナント、ユーザーテナント、およびすべてのMetaテナントを指定することはサポートされていません。このステートメントでは一度に1つのレプリカしか追加できません。複数のレプリカを追加する必要がある場合は、このステートメントを複数回実行する必要があります。
例は以下のとおりです:
obclient> ALTER SYSTEM ADD REPLICA LS= 1001 SERVER='172.xx.xxx.212:2882' REPLICA_TYPE='F' DATA_SOURCE='172.xx.xxx.192:2882' PAXOS_REPLICA_NUM=3;再度ログストリーム情報を照会すると、このログストリームにFレプリカが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:48:08.982791 | 1001 | 172.xx.xxx.192 | 2882 | 2881 | zone3 | FOLLOWER | NULL | NULL | FULL | | FALSE | | 2024-04-03 17:48:05.812041 | 2024-04-03 17:48:09.985574 | 1001 | 172.xx.xxx.212 | 2882 | 2881 | zone2 | FOLLOWER | NULL | NULL | FULL | | FALSE | | 2024-04-01 14:12:08.589084 | 2024-04-03 17:48:09.030020 | 1001 | 172.xx.xxx.226 | 2882 | 2881 | zone1 | LEADER | 172.xx.xxx.192:2882:1712136186291857,172.xx.xxx.212:2882:1712137685774460,172.xx.xxx.226:2882:1 | 3 | FULL | | FALSE | +----------------------------+----------------------------+-------+----------------+----------+----------+-------+----------+-------------------------------------------------------------------------------------------------+----------------------+--------------+--------------+---------+ 3 rows in set