9 Oracle Database API for MongoDBの有効化と構成

この項では、Oracle Database API for MongoDBを有効化および構成する方法について説明します。

ORDSリリース22.3以降、Oracle REST Data Servicesでは、スタンドアロン・モードで実行する場合、MongoDBのためのOracle Database APIがサポートされています。これにより、MongoDBドライバ、フレームワークおよびツールを使用して、Oracle Databaseに対してJSONドキュメント・ストア・アプリケーションを開発できます。MongoDBのためのOracle Database APIは、MongoDBワイヤ・プロトコルを、ORDS接続プールを使用して実行されるSQL文に変換します。

図9-1 MongoDBのためのOracle Database APIのアーキテクチャ図

mongodb.pngの説明が続きます
図mongodb.pngの説明

次の点を考慮する必要があります。
  • データベースのMongoDBの概念は、Oracle Databaseのスキーマの概念にマップされています。具体的には、ORDS対応のスキーマです。たとえば、データベースfoo内のコレクションにJSONドキュメントを挿入するときは、MongoDB用APIにより、ORDS対応スキーマfoo内のコレクションにドキュメントが挿入されます。
  • MongoDBのためのAPIを使用する場合の認証および認可は、MongoDBユーザーではなく、Oracle Databaseユーザーおよびアクセス制御に依存します。MongoDBクライアントを接続する場合、接続オプションauthMechanism=PLAINおよびauthSource=$externalを使用して、MongoDBのLDAP認証メカニズムを使用してOracle Database資格証明を指定する必要があります。プロトコルはユーザー名とパスワードをプレーン・テキストとして渡すため、接続オプションtls=trueを使用してTLS/SSLを有効にする必要があります。
  • MongoDBのためのOracle APIは、MongoDBコマンドを、コレクションを支える表上の対応するSQL文にマップします。

    たとえば、emp.find({"name":"John"})などのMongoDBコマンドは、select data from emp e where e.data."name" = 'John'のようなSQL select文を使用してデータベースに対して実行されます。

  • 必要に応じて、JSONコレクションでSQLを直接実行できます。このモデルを使用すると、NoSQLドキュメント・ストアの速度、柔軟性、使いやすさを把握でき、ネイティブに格納されているJSONデータに対して分析とレポートに直接SQLを使用できます。

9.1 スタート・ガイド

次のステップを実行して、MongoDBのためのOracle Database APIの使用を開始します。
  1. ORDSをインストールおよび構成します:

    コマンド・プロンプトから、次のコマンドを使用してORDSをインストールおよび構成します。

    ノート:

    • Autonomous Databaseに対してORDSをインストールする場合は、コマンドORDS install adbを使用します。
    • Oracle API for MongoDBは、非CDBデータベース内かPDB内のインストールの場合のみサポートされています。
    1. ORDSを非CDBデータベースまたはPDBにスタンドアロン・モードでインストールします。

      ノート:

      Oracle API for MongoDBは、非CDBデータベース内かPDB内のインストールの場合のみサポートされています。
      ords install
    2. デフォルトでは、Oracle API for MongoDBは有効になっていません。このAPIを有効にするには、構成に次の内容を含めます:
      ords config set mongo.enabled true
    3. ORDSを起動します
      ords serve

    MongoDB APIが有効になっている場合は、ORDSの起動時に通知が表示され、その接続文字列が取得されます。

    MongoDBのためのOracle APIが有効になっていることを示すログ:
    ORDS serveコマンドを使用してORDSを起動すると、ログに次のようなメッセージが表示され、MongoDBのためのOracle APIが有効かどうかが確認されます。
    Disabling document root because the specified folder does not exist: ./config/global/doc_root
    2022-08-17T15:23:04.043Z INFO        Oracle API for MongoDB listening on port: 27017
    2022-08-17T15:23:04.050Z INFO        The Oracle API for MongoDB connection string is:
    mongodb://[{user}:{password}@]localhost:27017/{user}?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true
    
  2. ORDS対応ユーザーを作成します:
    サーバーを実行したままにして、SQLclからORDS対応ユーザーを作成します。
    create user foo identified by "<Password>";    
    grant soda_app, create session, create table, create view, create sequence, create procedure, create job, unlimited tablespace to foo;    
    connect foo/<Password>   
    exec ords.enable_schema;
  3. MongoDBシェルを使用してORDSに接続します:

    ORDSでは、デフォルトで、セキュアな通信のために自己署名証明書が使用されます。Mongo APIでは自己署名証明書は許可されていないため、MongoツールまたはドライバでMongo APIに直接接続することはできません。

    代替方法を次に示します:
    • TLSオプションの無効化は、機密データを扱わないローカル環境のためにのみ用意されています。TLSを無効にするには、ORDSを起動する前に次のコマンドを呼び出す必要があります:
      ords config set mongo.tls false
      ords serve

      ノート:

      Mongo API接続文字列が、mongo.tlsが有効になっていないことを反映するように変更されます。たとえば、...ssl=false...のようになります。
    • mongoツールとドライバを使用して、有効な署名付き証明書を必要とするTLSの要件を明示的に無効にします。

      設定は、ツールやAPIによって異なります。たとえば、mongoshには--tlsAllowInvalidCertificatesコマンドライン引数がありますが、mongoimportには--tlsInsecureコマンドライン引数があります。
    • 有効な署名付き証明書を取得するように、プロパティstandalone.https.certおよびstandalone.https.cert.keyを構成します。

    有効な署名付き証明書なしでmongoshを使用する例:

     mongosh  --tlsAllowInvalidCertificates 'mongodb://foo:<Password>@localhost:27017/foo?authMechanism=PLAIN&authSource=$external&tls=
    true&retryWrites=false&loadBalanced=true'foo> db.createCollection('emp');
        { ok: 1 }
        foo> db.emp.insertOne({"name":"Blake","job": "Intern","salary":30000});
        ...
        foo> db.emp.insertOne({"name":"Smith","job": "Programmer","salary": 60000,"email" : "smith@oracle.com"});
        ...
        foo> db.emp.insertOne({"name":"Miller","job": "Programmer","salary": 70000});
        ...
        foo> db.emp.find({"name":"Miller"});
        [
          {
            _id: ObjectId("6320bfc40dd73b60ef5641b9"),
            name: 'Miller',
            job: 'Programmer',
            salary: 70000
          }
        ]
     
     
        foo> db.emp.updateOne({"name":"Miller"}, {$set: {"email":"miller@oracle.com"}})
        {
          acknowledged: true,
          insertedId: null,
          matchedCount: 1,
          modifiedCount: 1,
          upsertedCount: 0
        }
  4. MongoDBクライアントから挿入されたデータには、SQLからアクセスできます。
    SQL> select json_serialize(e.data)
         from emp e;
     
    JSON_SERIALIZE(E.DATA)
    --------------------------------------------------------------------------------
    {"_id":"6320bfa30dd73b60ef5641b7","name":"Blake","job":"Intern","salary":30000}
    {"_id":"6320bfb30dd73b60ef5641b8","name":"Smith","job":"Programmer","salary":60000,"email":"smith@oracle.com"}
    {"_id":"6320bfc40dd73b60ef5641b9","name":"Miller","job":"Programmer","salary":70000,"email":"miller@oracle.com"}
     
    SQL> select e.data."name".string() n,
               e.data."job".string() j
         from emp e
         where e.data."email".string() = 'miller@oracle.com';
     
    N                    J
    -------------------- -----------------------
    Miller               Programmer

9.2 要件

この項では、クライアントおよびデータベースの要件をリストします。

MongoDB APIでは、Oracle Databaseバージョン21c以降およびAutonomous Oracle Database 19c以降(Serverless、DedicatedおよびCloud@Customer)がサポートされています。通常、MongoDBのためのOracle APIでは、loadBalanced接続オプションをサポートするMongoDBツールとドライバがサポートされています。

9.3 MongoDBの構成可能な設定

この項では、global/settings.xmlにあるグローバル構成に格納されているMongoDB APIをサポートするための編集可能な構成設定を示します。

ノート:

Oracle REST Data Servicesコマンドライン・インタフェースを使用して構成ファイルを編集することをお薦めします。

表9-1 Mongo APIをサポートするための構成設定

キー 説明
mongo.enabled

(必須プロパティ)

ブール値 MongoDBのためのAPIを有効にすることを指定します。デフォルト値はfalseです。

MongoDB用APIを有効にするには、値をtrueに設定します。

mongo.tls ブール値 暗号化されたセキュアな通信のためにそのAPIでTLSを必要とするかどうかを指定します。デフォルト値はtrue
mongo.access.log パス MongoDBアクセス・ログのAPIを格納するフォルダへのパスを指定します。パスが指定されていない場合、アクセスは生成されません。
mongo.host 文字列 リスニングを行う特定のネットワーク・インタフェースを識別するためのホスト名またはIPアドレスのカンマ区切りのリストを指定します。デフォルトは0.0.0.0です。
mongo.port 整数 MongoDBのためのAPIリスニング・ポートを指定します。デフォルト値は27017です。
mongo.idle.timeout 期間 接続の最大アイドル時間をミリ秒単位で指定します。デフォルト値は30mです
mongo.op.timeout 期間 データベース操作の最大時間をミリ秒単位で指定します。デフォルト値は10mです。

9.4

この項では、ords config setコマンドを使用してMongoDB設定を現在の作業ディレクトリ(CWD) global/settings.xmlに格納する例をいくつか示します。また、global/settings.xmlファイルのMongoDBリスナー設定の例も示します。

ords config setコマンドの使用例

  • ords config set mongo.enabled true
  • ords config set mongo.host example.com
  • ords config set mongo.port 27017
  • ords config set mongo.idle.timeout 40m
  • ords config set mongo.op.timeout 15m

global/settings.xmlのMongoリスナー設定の例

<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>Saved on Wed Jun 15 01:33:58 UTC 2022</comment>
<entry key="debug.printDebugToScreen">true</entry>
. . .
<entry key="mongo.host">example.com</entry>
<entry key="mongo.idle.timeout">40m</entry>
<entry key="mongo.enabled">true</entry>
<entry key="mongo.op.timeout">15m</entry>
<entry key="mongo.port">27016</entry>
. . .
</properties>

ords config getコマンドの使用例

  • ords config get mongo.enabled

    true

  • ords config get mongo.port

    27016

ords serveコマンドの使用

ords serveコマンドを使用して、スタンドアロン・モードで実行します。

ノート:

MongoDBのためのOracle APIを有効にするには、serveコマンドを実行する前に、mongo.enabledプロパティをtrueに設定する必要があります

9.5 接続プールへのアクセス

Oracle REST Data Servicesでは、複数のデータベースに接続する機能がサポートされています。installコマンドを使用して、複数の名前付きプールを定義できます。プールを追加すると、ORDS構成ディレクトリ内の./databasesの下に、対応するディレクトリが作成されます。Oracle REST Data Servicesの初期インストールでは、通常、defaultという名前のデフォルトのデータベース接続プールが追加されます。

デフォルトでは、MongoDB APIに接続すると、すべてのデータベース・リクエストがデフォルトの接続プールに送信されます。オプションで、ホスト名ファイルを使用して、MongoDB APIリクエストを他の接続プールにルーティングできます。たとえば、mydb1という名前のデータベース・プールの構成ディレクトリがords_config/databases/mydb1にあるとします。

ノート:

mongo.tlsキーが無効になっている場合、複数のプールは使用できません。デフォルト・プールのみがサポートされています。

次のように、2つのホスト名を含むホスト名ファイルords_config/databases/mydb1/hostnamesを作成する場合:


www.example.com
example.com
次の接続文字列は、default接続プールではなくmydb1接続プールにルーティングされます。
"mongodb://www.example.com:27017/scott?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true"
 
"mongodb://example.com:27017/scott?authMechanism=PLAIN&authSource=$external&ssl=true&retryWrites=false&loadBalanced=true"

9.6 MongoDB APIアクセスのロギング

この項では、MongoDB APIへのリクエストのロギングを有効にする方法について説明します。

デフォルトでは、MongoDB APIへのリクエストはログに記録されません。MongoDB APIへのロギング・アクセスを有効にするには、構成プロパティmongo.access.logをディレクトリ・パスに設定する必要があります。ディレクトリ・パスが絶対パスでない場合、ORDS構成ディレクトリ(<ords config>)に対して相対的に解決されます。ディレクトリが存在しない場合、ORDSは起動時にディレクトリを作成します。ORDSは、MongoDB APIにアクセスするたびに、このディレクトリ内にアクセス・ログ・ファイル・エントリを追加します。

例:

ords config set mongo.access.log mongologs

このコマンドは、<ords config>/mongologs/フォルダ下のアクセス・ログ・ファイルに書き込みます。

9.7 高パフォーマンスの実現

この項では、高パフォーマンスの実現に役立つ設定について説明します。

より高いパフォーマンスまたはスループットが必要な環境では、一部のORDS接続プール・パラメータを構成およびチューニングする必要があります。

スループットを向上させるには、次の設定と値が役立ちます。これらのパラメータの最適なチューニングは、アプリケーションの要件によって異なります。

ords config set jdbc.MaxConnectionReuseCount 5000
ords config set jdbc.MaxConnectionReuseTime 900
ords config set jdbc.SecondsToTrustIdleConnection 1
ords config set jdbc.InitialLimit 100
ords config set jdbc.MaxLimit 100

説明:

  • MaxConnectionReuseTime: 接続が特定の回数流用された後に、接続を適切に閉じて接続プールから削除できるようにします。
  • SecondsToTrustIdleConnection: 最近使用したか、最近テストしたデータベース接続を信頼するための秒数を設定し、接続チェックアウト中の検証テストをスキップします。
  • InitialLimitおよびMaxLimits: 指定した接続プールの接続プール・サイズをUCPで設定します。