ログストレージサービスは、物理スタンバイデータベースに高可用性および高信頼性のログストレージと読み書き機能を提供します。このサービスはシングルレプリカもマルチレプリカもサポートしており、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かを確認できます。
プライマリテナントでは、業務データはログストリームのLeaderノードに書き込まれた後、すべてのFollowerノードに同期されます。一方、スタンバイテナントでは、ログストリームのLeaderノードは主にログ転送サービスを通じてプライマリテナントからログを同期し、同期されたログをPaxosグループ内のFollowerノードに再同期する役割を担います。
ストレージ容量の管理
プライマリテナントでもスタンバイテナントでも、ログストレージサービスはテナントごとにストレージ容量を管理します。
プライマリまたはスタンバイテナントのユニット構成を作成する際、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
さらに、プライマリテナントとスタンバイテナントでは、テナントのユニット構成を調整することでログディスクストレージ容量の拡張と縮小を実現できます。テナントユニット構成の調整手順の詳細については、リソース構成の調整によるテナントの拡張・縮小を参照してください。