22.3.16での変更点

Oracle NoSQL Databaseリース22.3.16 Enterprise Editionでは次の変更が行われました。

新機能

  1. SQL問合せに関数索引付けを実装しました。この機能を使用すると、索引は、索引パスを介して1つ以上の関数の値を索引付けすることもできます。索引付けできる関数は、組込み関数のサブセットです。具体的には、次の関数に索引付けできます:

    modification_time、expiration_time、expiration_time_millis、row_storage_size、year, month、day、hour、minute、second、millisecond、microsecond、nanosecond、week、length、replace、reverse、substring、trim、ltrim、rtrim、lower、upper。

    たとえば、次の索引は、Users表の行に最新の変更時間で索引付けします:
    create index idx_modtime on Users (modification_time())

    別の例として、次の索引は、アドレスの開始日の年によってUsers表のユーザーに索引付けします:

    create index idx_year on Users (substring(address.startDate as string, 0, 4))

    前述の定義では、address列(JSON型)のstartDateフィールドがSTRING型であることが宣言されています。さらに、これらの日付文字列はYYYY-MM-DD書式であると想定しています。したがって、substring関数を使用して、日付のYYYY部分を抽出してこれを索引キーとして使用します。

    [KVSTORE-1129]

  2. ローテーションされたログ・ファイルの圧縮のサポートが追加されました。圧縮は現在デフォルトで無効になっています。

    ログ・ファイルの圧縮を有効にするには、新しいserviceLogFileCompressionストレージ・ノード・パラメータをtrueに設定します。関連付けられたストレージ・ノード・エージェントを再起動して、新しいファイルの新しい設定を有効にし、既存のファイルを圧縮します。

    圧縮されたログ・ファイルにより、同じディスク領域に保存するロギング出力が大幅に増加します。その結果、ロギング出力は長期間保持できるため、古い問題のデバッグにより多くの出力が使用可能になります。ログ・ファイルには多くの冗長性があるため、標準のgzipアルゴリズムで圧縮することは非常に有効です。この実装では、圧縮率について保守的な仮定が行われ、非圧縮ファイルと比較して、デフォルトで約5倍多くのデータを格納できます。

    圧縮を有効にすると、adminLogFileLimitおよびserviceLogFileLimitパラメータの意味が、予想される圧縮率を考慮するように調整されます。つまり、ログ・ファイルは指定されたサイズよりも大きくなる可能性があります。デフォルトの最大ファイル数では、実際のサイズ制限は、指定されたサイズより約5倍大きくなります。

    圧縮パラメータの値が変更された場合、ログ・ファイルのサイズが一時的にリクエストされた制限を超えることがあります。

    圧縮は、ストアの結合デバッグ・ログ、統計ファイルおよびパフォーマンス・ファイルのローテーションされたコピーに加え、すべてのサービス(RN、アービタ、管理およびSN)のサービス・デバッグ・ログ・ファイルに適用されます。ブートストラップ・デバッグ・ログ・ファイル、GCログ・ファイル、JEデバッグ・ログ・ファイルおよびJE統計ファイルは、現在圧縮されていません。

    圧縮済ローテーションされたログ・ファイルの名前は、接尾辞.gzで変更され、ファイル名が標準のログ・ローテーション番号ではなく作成時間を使用するように変更されます。たとえば、標準のローテーション・ログ・ファイルrg1-rn1_1.logは、rg1-rn1_20220720-201902.log.gzのような名前のファイルに圧縮された後に名前が変更されます。日付部分は、ファイルが2022-07-20 20:19:02 UTCに作成されたことを意味します。ローテーションされた複数のログ・ファイルが同じ秒内に作成される場合、一意の接尾辞がファイル名の日付部分に追加されます。たとえば:
    rg1-rn1_20220720-201902-1.log.gz

    圧縮ログ・ファイルを操作する場合は、標準のログ・ディレクトリで余分なディスク領域を使用しないように、gzcatまたはzgrepコマンドを使用するか、ファイルを別のディレクトリに解凍することを検討してください。手動で圧縮解除されたファイルは自動的に削除されません。

    [KVSTORE-879]

  3. デバッグ・ログを使用してストア障害の診断を容易にすることを目的としたいくつかの改善を加えました。
    • すべてのサービス(レプリケーション・ノード、管理、アービタ、ストレージ・ノード・エージェント)は、ロギング・メッセージにテキスト「LIFECYCLE」を含むログ・エントリを使用して、ステータス変更を一貫してログに記録するようになりました。エントリは、クラッシュ後にサービスがいつ開始するかも識別します。
    • 「LIFECYCLE」というテキストが含まれるように、レプリケーション・ノードと管理レプリケーションの状態変更のログ・エントリが更新され、読みやすくするために形式が若干変更されました。
    • サービスは、サービスの起動時と、ログ・ファイルのローテーション後に新しいサービス・ログ・ファイルが起動されるたびに、ソフトウェアのバージョン情報を記録するようになりました。

      [KVSTORE-1417]

  4. 全文検索を有効にするためにElasticsearchクラスタをストアに登録するには、ストアでJava 11以降が実行されている必要があります。以前のJavaバージョンでストアが実行されているときに、管理CLI plan register-esコマンドを使用してElasticsearchクラスタを登録すると、次のようなメッセージで失敗します:
    kv-> plan register-es -clustername fts -host ftshost -port 20000
    oracle.kv.impl.admin.IllegalCommandException:Can not register ES Cluster, as it requires Java 11 or later, but running Java version 1.8.0_351

    ストアのノードが異なるJavaバージョンを実行している場合、その一部のみがJava 11以降である場合、planコマンドは失敗しない可能性がありますが、全文検索は正常に機能しません。

    [KVSTORE-1503]

バグとパフォーマンスの修正

  1. 非常に大きな表の場合、表データのコピーが失敗する原因となる、複数リージョン表の初期化のバグが修正されました。

    [KVSTORE-1595]

  2. まれに、ストリームAPIが誤ったチェックポイントからのストリーミングを再開し、一部のストリーム操作が失われる可能性があるというバグを修正しました。

    [KVSTORE-1630]

  3. リモート・リージョン内の表が削除され、ローカル・リージョンのレプリケーション・ノードの再起動とほぼ同時に再作成された場合に、複数リージョン表がリモート・リージョンからの変更を欠落する可能性があるバグを修正しました。

    [KVSTORE-1649]

  4. 構成の検証管理CLIコマンドの出力形式を更新し、警告メッセージ「Storage directory on rgX-rnY is running low ...」を変更して、使用された領域の量の表示から使用可能な領域の量の表示に変更しました。新しい警告メッセージの形式は、メイン出力のavailableStorageSizeエントリと一致し、ノードが領域不足になるまでの使用可能な領域の量を正しく反映します。

    [KVSTORE-399]

  5. 管理CLIコマンドshow zones [-zn <id> | -znname <name>] -jsonにSNに関する情報が含まれない原因となったバグを修正しました。

    [KVSTORE-570]

  6. 無効なゾーン名が指定されている場合の障害メッセージの問題をよりよく説明するように、管理CLI plan deploy-sn -zn <zone-name>コマンドを変更しました。

    [KVSTORE-565]

  7. バージョンで指定されたシャードがレプリケーション・ノードで使用可能なシャードと一致しなかった場合に、マルチシャード・ストアで実行されたConsistency.Versionを使用した読取り操作によってレプリケーション・ノードが再起動される可能性がある問題を修正しました。この状況は、アプリケーションが別の主キーの更新要求によって返されたConsistency.Versionを使用して読取り要求を実行した場合、または読取り中のレコードが拡張度操作によって移行された場合に発生する可能性があります。この問題は、マルチシャード・ストアでConsistency.Versionを使用して、KVStore.storeIteratorTableAPI.tableIteratorなどの複数キー操作を実行する場合にも発生する可能性があります。

    このバグにより、次のようなスタック・トレースが生成されます:

    2022-09-01 18:13:37.187 UTC SEVERE [rg2-rn1] Process exiting
    java.lang.IllegalArgumentException: Replication environment mismatch. The UUID associated with the commit token is: 8c18cf27-b4fe-4795-8028-f1181ab6cdfc but this replica environment has the UUID: 79e879c7-bd33-4b73-a53c-eba0664c674b
            at com.sleepycat.je.rep.CommitPointConsistencyPolicy.ensureConsistency(CommitPointConsistencyPolicy.java:151)
            at com.sleepycat.je.rep.txn.ReadonlyTxn.checkConsistency(ReadonlyTxn.java:189)
            at com.sleepycat.je.rep.txn.ReadonlyTxn.txnBeginHook(ReadonlyTxn.java:156)
            at com.sleepycat.je.txn.Txn.<init>(Txn.java:353)
            at com.sleepycat.je.txn.Txn.<init>(Txn.java:303)
            at com.sleepycat.je.rep.txn.ReadonlyTxn.<init>(ReadonlyTxn.java:65)
            at com.sleepycat.je.rep.impl.RepImpl.createRepUserTxn(RepImpl.java:1225)
            at com.sleepycat.je.txn.Txn.createUserTxn(Txn.java:393)
            at com.sleepycat.je.txn.TxnManager.txnBegin(TxnManager.java:178)
            at com.sleepycat.je.dbi.EnvironmentImpl.txnBegin(EnvironmentImpl.java:2379)
            at com.sleepycat.je.Environment.beginTransactionInternal(Environment.java:1459)
            at com.sleepycat.je.Environment.beginTransaction(Environment.java:1350)
            at oracle.kv.impl.api.RequestHandlerImpl.executeInternal(RequestHandlerImpl.java:902)
            ...

    [KVSTORE-1635]

  8. SQL INSERT文を使用してNUMBER型のフィールドの値を-324未満の指数を持つ数値に設定すると、フィールドの値が0に設定されるバグが修正されました。

    [KVSTORE-1631]

  9. ゼロで除算しようとしてjava.lang.ArithmeticExceptionを生成したために、マスター・リバランスを実行するストレージ・ノード・エージェントのスレッドが失敗する原因となるバグが修正されました。問題が発生した後、SNAを再起動するまで、SNAはマスターをシャード間で均等に分散するために必要な操作を実行しません。

    このバグにより、次のようなログ・エントリが生成されます:

    2022-07-27 08:00:18.659 UTC SEVERE [sn5] MasterRebalanceThread thread exiting due to exception.
    java.lang.ArithmeticException: / by zero
            at oracle.kv.impl.sna.masterBalance.RebalanceThread.getLeaseAdjustedMD(RebalanceThread.java:858)
            at oracle.kv.impl.sna.masterBalance.RebalanceThread.needsRebalancing(RebalanceThread.java:242)
            at oracle.kv.impl.sna.masterBalance.RebalanceThread.run(RebalanceThread.java:329)
    2022-07-27 08:00:18.660 UTC INFO [sn5] Master balance manager shutdown
    2022-07-27 08:00:18.661 UTC INFO [sn5] MasterRebalanceThread thread exited.

    [KVSTORE-1603]

  10. まれにレプリケーション・ノードが再起動される可能性がある問題を修正しました。この問題は22.1リリースで導入された可能性があり、次のようなログ・エントリが生成される可能性があります:
    2022-09-19 17:23:26.934 UTC SEVERE [rg3-rn1] JE: Replica unexpected exception
    com.sleepycat.je.EnvironmentFailureException: (JE 22.3.5)
    rg3-rn1(1):/block1/opc/workspace/arbiter-stress/kv/workdir/scratch/kvroot/mystore/sn5/disk1/rg3-rn1/env
    java.lang.IllegalStateException: update of local topology failed from commit
    trigger UNEXPECTED_EXCEPTION_FATAL: Unexpected internal Exception, unable to
    continue. Environment is invalid and must be closed. Problem seen replaying
    entry Commit/22 vlsn=7795150 isReplicated="1"
    com.sleepycat.je.EnvironmentFailureException: (JE 22.3.5)
    rg3-rn1(1):/block1/opc/workspace/arbiter-stress/kv/workdir/scratch/kvroot/mystore/sn5/disk1/rg3-rn1/env
    java.lang.IllegalStateException: update of local topology failed from commit
    trigger UNEXPECTED_EXCEPTION_FATAL: Unexpected internal Exception, unable to
    continue. Environment is invalid and must be closed. Problem seen replaying
    entry Commit/22 vlsn=7795150 isReplicated="1"
    	at com.sleepycat.je.EnvironmentFailureException.unexpectedException(EnvironmentFailureException.java:402)
    	at com.sleepycat.je.dbi.TriggerManager.runTriggers(TriggerManager.java:347)
    	at com.sleepycat.je.dbi.TriggerManager.runCommitTriggers(TriggerManager.java:231)
    	at com.sleepycat.je.txn.Txn.commit(Txn.java:809)
    	at com.sleepycat.je.rep.txn.ReplayTxn.commit(ReplayTxn.java:299)
    	at com.sleepycat.je.rep.impl.node.Replay.replayEntry(Replay.java:766)
    	at com.sleepycat.je.rep.impl.node.Replica$ReplayThread.run(Replica.java:1356)
    Caused by: java.lang.IllegalStateException: update of local topology failed
    from commit trigger
    	at oracle.kv.impl.rep.migration.MigrationManager$CompletionTrigger.commit(MigrationManager.java:2039)
    	at com.sleepycat.je.dbi.TriggerManager$7.run(TriggerManager.java:237)
    	at com.sleepycat.je.dbi.TriggerManager.runTriggers(TriggerManager.java:343)
    	... 5 more

    [KVSTORE-1657]

  11. 拡張度操作の一部として別のシャードに移行されたエントリに対して実行された要求が、新しいシャードで自動的に再試行されるのではなく、FaultExceptionで失敗する可能性がある問題を修正しました。スローされた例外の例:
    oracle.kv.FaultException: Partition: PARTITION-185 not present at RepNode
    rg2-rn3, topology seq#: 383 (22.2.6) on [2022-06-08 05:07:28.351 UTC]
    Fault class name: oracle.kv.impl.rep.IncorrectRoutingException
    Resource id is: rg2-rn1
    Remote stack trace: oracle.kv.FaultException: Partition: PARTITION-185 not
    present at RepNode rg2-rn3, topology seq#: 383 (22.2.6) on [2022-06-08
    05:07:28.351 UTC]
    Fault class name: oracle.kv.impl.rep.IncorrectRoutingException
    Resource id is: rg3-rn2
    	at oracle.kv.impl.fault.ServiceFaultHandler.getThrowException(ServiceFaultHandler.java:175)
    	at oracle.kv.impl.fault.ServiceFaultHandler.getThrowException(ServiceFaultHandler.java:156)
    	at oracle.kv.impl.fault.ProcessFaultHandler.rethrow(ProcessFaultHandler.java:231)
    	at oracle.kv.impl.fault.ProcessFaultHandler.execute(ProcessFaultHandler.java:149)
    	at oracle.kv.impl.api.RequestHandlerImpl.execute(RequestHandlerImpl.java:584)
    	at oracle.kv.impl.api.RequestHandlerImpl.lambda$executeAsyncRequest$4(RequestHandlerImpl.java:674)
    	at oracle.kv.impl.async.FutureUtils$CheckedSupplier.get(FutureUtils.java:560)
    	at oracle.kv.impl.async.AsyncVersionedRemoteDialogResponder.withThreadDialogContext(AsyncVersionedRemoteDialogResponder.java:312)
    	at oracle.kv.impl.api.RequestHandlerImpl.executeAsyncRequest(RequestHandlerImpl.java:673)
    	at oracle.kv.impl.api.RequestHandlerImpl.lambda$execute$1(RequestHandlerImpl.java:622)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    	at java.lang.Thread.run(Thread.java:833)

    [KVSTORE-1537]

  12. 配列を含む索引問合せが誤った結果を返す可能性があるバグを修正しました。

    [KVSTORE-1643]

  13. Antビルド・スクリプトは、Community Editionの構築に機能しなくなりました。この変更は以前に言及されていませんが、21.2リリースで有効になります。