ログストレージサービスは、フィジカル・スタンバイ・データベースに対して高可用性と高信頼性を備えたログストレージおよび読み書き機能を提供します。ログストレージサービスは単一レプリカも複数レプリカもサポートしており、Paxosプロトコルを使用することで高可用性を実現しています。
ログストリームの動作モード
プライマリテナントとスタンバイテナントのログストレージサービスでは、2種類の異なる動作モードが使用されます:
APPENDモード
プライマリテナントではAPPENDモードを使用します。このモードでは、プライマリテナントのログストリームのリーダーがトランザクションやDDLなどの上位モジュールから書き込まれたデータを受信し、これらのデータをプライマリテナントの複数のレプリカ間でPaxosプロトコルを用いて同期および永続化します。データ同期中に障害が発生した場合、書き込まれたデータの永続化に失敗する可能性がありますが、ログストレージサービスはさまざまな失敗シナリオを自動的に処理し、高可用性を提供できます。
データ同期中、各ログにはプライマリテナント上で一意のLSN値とSCN値のペアが生成されます。ここで、LSNはストレージサービス内におけるこのログの物理的位置情報を特定するために使用され、SCNはストレージサービス内におけるこのログの時系列関係を表すために使用されます。上位サービスはSCN値を用いて複数のログストリーム間のログを順序付けることができます。
RAW_WRITEモード
スタンバイテナントではRAW_WRITEモードを使用します。このモードでは、スタンバイテナントのログストリームのリーダーは、上位モジュールから直接書き込まれるデータを拒否し、ログ転送サービスを介してプライマリテナントから同期される物理ログのみを許可します。また、これらの物理ログの内容、LSN、SCNなどの情報はすべてプライマリテナントによって生成されます。
プライマリテナントから同期された物理ログは、スタンバイテナントのログストレージサービスの複数のレプリカ間でPaxosプロトコルを用いて同期および永続化されます。
APPENDモードとRAW_WRITEモードに加えて、フェイルオーバー操作の実行中には、PREPARE_flashBACKモードとFLASHBACKモードという2つのモードも存在する場合があります。これら2つのモードはフェイルオーバー操作の中間状態です。詳細なフェイルオーバー操作の説明については、Failoverを参照してください。
プライマリテナントのログストリームの動作モードを確認する方法
管理者ユーザーでプライマリテナント、またはプライマリテナントが属するクラスタの
sysテナントにログインします。以下のコマンドを実行して、プライマリテナントの
TENANT_IDを取得します。sysテナントSELECT TENANT_ID,TENANT_NAME FROM oceanbase.DBA_OB_TENANTS;クエリ結果は次のとおりです:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1 | sys | | 1001 | META$1002 | | 1002 | mysql | | 1003 | META$1004 | | 1004 | oracle | +-----------+-------------+ 5 rows in setプライマリテナント
MySQLモード
SELECT TENANT_ID,TENANT_NAME FROM oceanbase.DBA_OB_TENANTS;クエリ結果は次のとおりです:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1002 | mysql | +-----------+-------------+ 1 row in setOracleモード
SELECT TENANT_ID,TENANT_NAME FROM SYS.DBA_OB_TENANTS;クエリ結果は次のとおりです:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1004 | oracle | +-----------+-------------+ 1 row in set
以下のコマンドを実行して、プライマリテナントのログストリームの動作モードを確認します。
MySQLモード
SELECT TENANT_ID, LS_ID, SVR_IP, SVR_PORT, ROLE, ACCESS_MODE FROM oceanbase.GV$OB_LOG_STAT WHERE TENANT_ID = 1002;Oracleモード
SELECT TENANT_ID, LS_ID, SVR_IP, SVR_PORT, ROLE, ACCESS_MODE FROM SYS.GV$OB_LOG_STAT WHERE TENANT_ID = 1004;
クエリ結果の例は次のとおりです:
注意
RAW_WRITEはログストリーム動作モードのデフォルト値であるため、プライマリテナントでは、ロードバランシングタスクを実行中の特定のシナリオにおいて、そのログストリームレプリカの
ACCESS_MODEもRAW_WRITEになります。+-----------+-------+-------------+----------+----------+-------------+ | TENANT_ID | LS_ID | SVR_IP | SVR_PORT | ROLE | ACCESS_MODE | +-----------+-------+-------------+----------+----------+-------------+ | 1002 | 1 | xx.xx.xx.xx | 17854 | LEADER | APPEND | | 1002 | 1001 | xx.xx.xx.xx | 17854 | LEADER | APPEND | | 1002 | 1 | xx.xx.xx.xx | 17858 | FOLLOWER | APPEND | | 1002 | 1001 | xx.xx.xx.xx | 17858 | FOLLOWER | APPEND | | 1002 | 1 | xx.xx.xx.xx | 17856 | FOLLOWER | APPEND | | 1002 | 1001 | xx.xx.xx.xx | 17856 | FOLLOWER | APPEND | +-----------+-------+-------------+----------+----------+-------------+ 6 rows in set
スタンバイテナントのログストリーム動作モードの確認
管理者ユーザーでスタンバイテナント、またはそのクラスタの
sysテナントにログインします。以下のコマンドを実行して、スタンバイテナントの
TENANT_IDを取得します。sysテナントSELECT TENANT_ID,TENANT_NAME FROM oceanbase.DBA_OB_TENANTS;クエリ結果は次のとおりです:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1 | sys | | 1003 | META$1002 | | 1004 | mysql | | 1005 | META$1004 | | 1006 | oracle | +-----------+-------------+ 5 rows in setスタンバイテナント
MySQLモード
SELECT TENANT_ID,TENANT_NAME FROM oceanbase.DBA_OB_TENANTS;クエリ結果は次のとおりです:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1004 | mysql | +-----------+-------------+ 1 row in setOracleモード
SELECT TENANT_ID,TENANT_NAME FROM SYS.DBA_OB_TENANTS;クエリ結果は次のとおりです:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1006 | oracle | +-----------+-------------+ 1 row in set
以下のコマンドを実行して、スタンバイテナントのログストリームの動作モードを確認します。
MySQLモード
SELECT TENANT_ID, LS_ID, SVR_IP, SVR_PORT, ROLE, ACCESS_MODE FROM oceanbase.GV$OB_LOG_STAT WHERE TENANT_ID = 1004;Oracleモード
SELECT TENANT_ID, LS_ID, SVR_IP, SVR_PORT, ROLE, ACCESS_MODE FROM SYS.GV$OB_LOG_STAT WHERE TENANT_ID = 1006;
クエリ結果の例は次のとおりです:
+-----------+-------+-------------+----------+----------+-------------+ | TENANT_ID | LS_ID | SVR_IP | SVR_PORT | ROLE | ACCESS_MODE | +-----------+-------+-------------+----------+----------+-------------+ | 1004 | 1 | xx.xx.xx.xx | 17858 | FOLLOWER | RAW_WRITE | | 1004 | 1001 | xx.xx.xx.xx | 17858 | FOLLOWER | RAW_WRITE | | 1004 | 1 | xx.xx.xx.xx | 17854 | LEADER | RAW_WRITE | | 1004 | 1001 | xx.xx.xx.xx | 17854 | LEADER | RAW_WRITE | | 1004 | 1 | xx.xx.xx.xx | 17856 | FOLLOWER | RAW_WRITE | | 1004 | 1001 | xx.xx.xx.xx | 17856 | FOLLOWER | RAW_WRITE | +-----------+-------+-------------+----------+----------+-------------+ 6 rows in set
ログストリームレプリカの役割
プライマリテナントであってもスタンバイテナントであっても、Paxosグループ内の複数のレプリカにはLEADERとFOLLOWERの2種類の役割が存在します。ビューGV$OB_LOG_STATのROLE列を照会することで、ログストリームのレプリカがLEADERかFOLLOWERかを確認できます。
プライマリテナントの場合、業務データはログストリームのリーダーノードに書き込まれ、その後すべてのフォロワーノードに同期されます。一方、スタンバイテナントの場合、ログストリームのリーダーノードは主にログ転送サービスを通じてプライマリテナントからログを同期し、同期されたログをさらにPaxosグループ内のフォロワーノードに再同期する役割を担います。
ストレージ容量の管理
プライマリテナントおよびスタンバイテナントに関わらず、ログストレージサービスはテナントごとにストレージ容量を管理します。
プライマリまたはスタンバイテナントのユニット仕様を作成する際、CREATE RESOURCE UNIT コマンドの LOG_DISK_SIZE パラメータでログディスクのストレージ容量を指定できます。作成時に LOG_DISK_SIZE を指定しなかった場合、デフォルト値はメモリ仕様の3倍となり、ログディスクの最小値は2GBです。ユニット仕様の作成手順の詳細については、テナントの作成を参照してください。
GV$OB_UNITS ビューを使用して、プライマリおよびスタンバイテナントが使用可能なログディスク容量と実際に使用されているログストレージ容量を照会できます。
管理者ユーザーとして、プライマリおよびスタンバイテナント、またはそれらのテナントが属するクラスタの
sysテナントにログインします。以下のコマンドを実行して、テナントの
TENANT_IDを取得します。sysテナントSELECT TENANT_ID,TENANT_NAME FROM oceanbase.DBA_OB_TENANTS;sysテナントのクエリ結果は次のとおりです:+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1 | sys | | 1003 | META$1002 | | 1004 | mysql | | 1005 | META$1004 | | 1006 | oracle | +-----------+-------------+ 5 rows in setプライマリまたはスタンバイテナント
MySQLモード
SELECT TENANT_ID,TENANT_NAME FROM oceanbase.DBA_OB_TENANTS;クエリ結果は次のとおりです:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1004 | mysql | +-----------+-------------+ 1 row in setOracleモード
SELECT TENANT_ID,TENANT_NAME FROM SYS.DBA_OB_TENANTS;クエリ結果は次のとおりです:
+-----------+-------------+ | TENANT_ID | TENANT_NAME | +-----------+-------------+ | 1006 | oracle | +-----------+-------------+ 1 row in set
以下のコマンドを実行して、プライマリおよびスタンバイテナントが使用できるログディスク容量と実際の使用状況を確認します。
MySQLモード
SELECT SVR_IP, SVR_PORT, TENANT_ID, LOG_DISK_SIZE, LOG_DISK_IN_USE FROM oceanbase.GV$OB_UNITS WHERE TENANT_ID = 1004;クエリ結果は次のとおりです:
+----------------+----------+-----------+---------------+-----------------+ | SVR_IP | SVR_PORT | TENANT_ID | LOG_DISK_SIZE | LOG_DISK_IN_USE | +----------------+----------+-----------+---------------+-----------------+ | xx.xx.xx.xx | 2882 | 1004 | 17394617549 | 1029179660 | | xx.xx.xx.xx | 17856 | 1004 | 17394617549 | 1029177240 | | xx.xx.xx.xx | 17858 | 1004 | 17394617549 | 1029177966 | +----------------+----------+-----------+---------------+-----------------+ 3 rows in setOracleモード
SELECT SVR_IP, SVR_PORT, TENANT_ID, LOG_DISK_SIZE, LOG_DISK_IN_USE FROM SYS.GV$OB_UNITS WHERE TENANT_ID = 1006;クエリ結果の例は次のとおりです:
+-------------+----------+-----------+---------------+-----------------+ | SVR_IP | SVR_PORT | TENANT_ID | LOG_DISK_SIZE | LOG_DISK_IN_USE | +-------------+----------+-----------+---------------+-----------------+ | xx.xx.xx.xx | 17854 | 1006 | 5798205850 | 1437200613 | | xx.xx.xx.xx | 17856 | 1006 | 5798205850 | 1437196109 | | xx.xx.xx.xx | 17858 | 1006 | 5798205850 | 1437196109 | +-------------+----------+-----------+---------------+-----------------+ 3 rows in set
さらに、プライマリおよびスタンバイテナントでは、テナントのユニット仕様を調整することでログディスク容量の拡張および縮小を実現できます。テナントユニット仕様の調整手順の詳細については、リソース仕様の調整によるテナントの拡張・縮小を参照してください。