クライアントの作成
項目一覧
- 使用
Mongo::Client
- ブロック構文
- データベース選択
- 接続タイプ
- スタンドアロン サーバー接続
- レプリカセット接続
- シャーディングされたクラスターの接続
- 直接接続
- ロード バランサー接続
- MongoDB Atlas 接続
- AWS Lambda から MongoDB Atlas に接続する
- SRV URI ノート
- クライアント オプション
- Ruby オプション
- URI オプション
- タイムアウト オプション
server_selection_timeout
socket_timeout
connect_timeout
max_time_ms
wtimeout
- TLS 接続
- TLS と SSL のオプション名
- TLS 接続の有効化
- クライアント TLS 証明書の指定
- 変更
SSLContext
- CA 証明書の指定
- OCSP 検証
- IPv4/IPv6 接続
- TCP キープアライブ構成
- 接続プーリング
- フォーク サーバーでの使用
- プロセス フォークの手動処理
- トラブルシューティング
- 再試行可能な読み取り
- モダンな再試行可能な読み取り
- レガシー再試行可能な読み取り
- 再試行可能な読み取りの無効化
- 再試行可能な書き込み
- モダンな再試行可能な書込み
- レガシー再試行可能な書込み
- 再試行可能な書き込みの無効化
- ログ記録
- ロガーレベルの変更
- 切り捨て
- 圧縮
- Server API Parameters
- 開発構成
- 本番構成
- 機能フラグ
使用 Mongo::Client
MongoDB 配置に接続するには、 Mongo::Client
オブジェクトを作成します。 ``Mongo::Client`` コンストラクターに、ホストとオプションのリストまたは 接続string URIを指定します。 クライアントの選択データベースのデフォルトはadmin
です。
デフォルトでは、ドライバーは配置で使用されるトポロジーを自動的に検出し、適切に接続します。
ローカル スタンドアロン MongoDB 配置に接続するには、サーバーのホストとポートを指定します。 ほとんどの場合は、接続するデータベース名も指定します。データベース名が指定されていない場合、クライアントはadmin
データベースを使用します。
Mongo::Client.new([ '127.0.0.1:27017' ], database: 'mydb') # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017/mydb")
注意
ホスト名localhost
はドライバーによって特別に扱われ、IPv4 アドレスのみに解決されます。
MongoDB Atlas に接続するには、Atlas 配置 URI を指定します。
Mongo::Client.new("mongodb+srv://username:myRealPassword@cluster0.mongodb.net/mydb?w=majority")
ドライバーはクラスター内のすべてのノードを検出し、必要に応じてノードに接続します。
ブロック構文
Mongo::Client オブジェクトを作成する別の方法は、ブロック構文を使用することです。
Mongo::Client.new(...) do |client| # work with the client end
この構文を使用してクライアントを作成すると、ブロックの実行が完了した後にクライアントは自動的に閉じられることに注意してください。
データベース選択
デフォルトでは、クライアントはadmin
データベースに接続します。
admin
データベースは、管理タスクとユーザーやロールなどの管理データの保存によく使用される MongoDB の特別なデータベースです(ただし、ユーザーとロールは他のデータベースでも定義されている場合もあります)。 シャーディングされたクラスターでは、 admin
データベースはシャード サーバーではなくコンフィギュレーションサーバーに存在します。 admin
データベースを通常の操作(アプリケーション データの保存など)に使用することも可能ですが、これは推奨されず、アプリケーションは使用するデータベースを明示的に指定する必要があります。
データベースは、 Client
の構築中に指定できます。
# Using Ruby client options: client = Mongo::Client.new(['localhost'], database: 'mydb') # Using a MongoDB URI: client = Mongo::Client.new('mongodb://localhost/mydb')
Client
インスタンスの場合、 use
メソッドを呼び出して、指定されたデータベースで構成された新しいClient
インスタンスを取得できます。
client = Mongo::Client.new(['localhost'], database: 'mydb') admin_client = client.use('admin') # Issue an administrative command admin_client.database.command(replSetGetConfig: 1).documents.first
MongoDB には他にも特殊なデータベースがあり、記載された目的でのみ使用してください。
コンフィギュレーションデータベース 。
ローカルデータベース。
接続タイプ
ドライバーはデフォルトで、接続するように指示された配置のタイプを検出し(負荷分散された配置を除く)、配置タイプに一致するように動作します。 以下のサブセクションでは、各配置タイプでドライバーがどのように動作するか、また、自動配置タイプの検出をバイパスして特定の動作を強制する方法について説明します。
配置タイプの検出は、ドライバーが接続を指示されたサーバーのいずれかから最初の応答を受け取ったときに行われることに注意してください(負荷分散モードが要求されていない限り、以下を参照してください)。 基礎となる配置が別のタイプに置き換えられた場合でも、ドライバーは検出されたトポロジーまたは構成されたトポロジーに残ります。 特に、レプリカセットを同じアドレスにあるシャーディングされたクラスターに置き換える場合は、クライアント インスタンスがシャーディングされたクラスターと通信するために(アプリケーションを再起動するなど)再作成する必要があります。
負荷分散された配置の自動検出は現在サポートされていません。 負荷分散された配置は、基礎となるタイプの配置として扱われます。これらは通常、シャーディングされたクラスターになります。 負荷分散された配置をシャーディングされたクラスターとして扱う場合、ドライバーは正しく動作しないため、配置が負荷分散されている場合は、クライアントをロード バランサーに接続するように明示的に構成する必要があります。
スタンドアロン サーバー接続
配置が単一のサーバーであり、スタンドアロン配置とも呼ばれる場合、すべての操作は指定されたサーバーに指示されます。
サーバーがシャットダウンして レプリカセット ノードに置き換えられた場合、ノードが または セカンダリになっても、ドライバーはすべての操作をそのノードに送信し続けます。
スタンドアロン接続を強制するには、以下の「直接接続」セクションを参照してください。
レプリカセット接続
レプリカセットに接続するときは、レプリカセット内の任意のノードのアドレスをドライバーに渡すのに十分です。 ノードはプライマリである必要はなく、 非表示 ノードにすることもできます。 その後、ドライバーは残りのノードを自動的に検出します。
ただし、レプリカセットの一部であるすべてのノードを指定することをお勧めします。これにより、1 つ以上のノードが使用できなくなった場合(たとえば、メンテナンスや再構成により)、ドライバーは引き続きレプリカセットに接続できます。
レプリカセット接続の例:
Mongo::Client.new([ '127.0.0.1:27017' ], database: 'mydb') Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27018' ], database: 'mydb') # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017,127.0.0.1:27018/mydb")
接続時にドライバーがレプリカセット名を検証するようにするには、 replica_set
Ruby オプションまたはreplicaSet
URI オプションを使用してドライバーを渡します。
Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27018' ], database: 'mydb', replica_set: 'myapp') # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017,127.0.0.1:27018/mydb?replicaSet=myapp")
配置がレプリカセットではない、または別のレプリカセット名を使用している場合、すべての操作は失敗します(期待されるレプリカセットがサーバーによって返されるまで)。
レプリカセット名を指定せずに、レプリカセット接続を強制することもできます。 通常、そのようなことは不要であり、非推奨です。
Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27018' ], database: 'mydb', connect: :replica_set) # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017,127.0.0.1:27018/mydb?connect=replica_set")
レプリカセットとして配置された MongoDB Atlas クラスターに接続するには、URI に接続します。
Mongo::Client.new("mongodb+srv://username:myRealPassword@cluster0.mongodb.net/test?w=majority")
SRV URI を使用する場合は、 SRV URI ノートを確認してください 。
シャーディングされたクラスターの接続
シャーディングされたクラスターの配置に接続するには、 mongos
ルーターのアドレスを指定します。
Mongo::Client.new([ '1.2.3.4:27017', '1.2.3.5:27017' ], database: 'mydb') Mongo::Client.new("mongodb://1.2.3.4:27017,1.2.3.5:27017/mydb")
レプリカセット接続とは異なり、配置内に存在するmongos
ルーターのサブセットに接続することもできます。 ドライバーは各 ルーターを監視し、利用可能なものを使用します(つまり、ドライバーは通常、障害やメンテナンスにより使用できなくなった個々のルーターを処理します)。 ルーターのリストを明示的に指定すると、ドライバーは設定されている可能性のある残りの ルーターを検出せず、接続を試行しません。
ドライバーは、認識されているルーター間で操作負荷を自動的に分散します。
シャーディングされたクラスターとして配置された MongoDB Atlas クラスターに接続するには、 URI に接続します。
Mongo::Client.new("mongodb+srv://username:myRealPassword@cluster0.mongodb.net/test?w=majority")
ドライバーが SRV URI 経由でシャーディングされたクラスターに接続すると、URI で指定されたアドレスの SRV レコードで変更を定期的にポーリングし、 mongos
ホストをサーバー リストに自動的に追加および削除します。シャーディングされたクラスターに追加および削除された。
シャーディングされたクラスター接続を強制するには、 connect: :sharded
オプションを使用します。 通常、そのようなことは不要であり、非推奨です。
Mongo::Client.new([ '127.0.0.1:27017', '127.0.0.1:27018' ], database: 'mydb', connect: :sharded) # Or using the URI syntax: Mongo::Client.new("mongodb://127.0.0.1:27017,127.0.0.1:27018/mydb?connect=sharded")
SRV URI を使用する場合は、 SRV URI ノートを確認してください 。
直接接続
配置タイプの検出を無効にして、特定のサーバー上ですべての操作を強制的に実行するには、 direct_connection
オプションを指定します。
Mongo::Client.new([ '1.2.3.4:27017' ], database: 'mydb', direct_connection: true) # Or using the URI syntax: Mongo::Client.new("mongodb://1.2.3.4:27017/mydb?directConnection=true")
あるいは、非推奨のconnect: :direct
オプションも同等です。
Mongo::Client.new([ '1.2.3.4:27017' ], database: 'mydb', connect: :direct) # Or using the URI syntax: Mongo::Client.new("mongodb://1.2.3.4:27017/mydb?connect=direct")
直接接続モードは、特定のレプリカセット ノードで操作を実行するのに最も便利ですが、基礎のサーバーのタイプ変更(例: レプリカセット ノードからmongos
ルーター、またはその逆)も許可します。
ロード バランサー接続
他の配置タイプとは異なり、ドライバーは現在、負荷分散された配置を自動的に検出しません。
ロード バランサーに接続するには、 load_balanced: true
Ruby オプションまたはloadBalanced=true
URI オプションを指定します。
Mongo::Client.new([ '1.2.3.4:27017' ], database: 'mydb', load_balanced: true) # Or using the URI syntax: Mongo::Client.new("mongodb://1.2.3.4:27017/mydb?loadBalanced=true")
これらのオプションを使用する場合、指定されたサーバーがロード バランサーでない場合、クライアントはすべての操作を失敗します(サーバーがロード バランサーになるまで)。
識別されない場合でもサーバーをロード バランサーとして扱うには、 connect: :load_balanced
Ruby オプションまたはconnect=load_balanced
URI オプションを使用します。
Mongo::Client.new([ '1.2.3.4:27017' ], database: 'mydb', load_balanced: true, connect: :load_balanced) # Or using the URI syntax: Mongo::Client.new("mongodb://1.2.3.4:27017/mydb?loadBalanced=true&connect=load_balanced")
MongoDB Atlas 接続
MongoDB上のAtlas Mongo::Client
配置に接続するには、まずクラスターの接続string とその他のクライアント オプションを使用して インスタンスを作成します。
新しいサーバー バージョンにアップグレードするときに重大な変更を回避するために、 Stable APIバージョンをクライアント オプションとして設定できます。
次のコードは、MongoDB 配置に接続するときに接続文字列と Stable API クライアント オプションを指定して、接続が成功したことを確認する方法を示しています。
require 'mongo' # Replace the placeholders with your credentials uri = "mongodb+srv://<username>:<password>@cluster0.sample.mongodb.net/?retryWrites=true&w=majority" # Set the server_api field of the options object to Stable API version 1 options = { server_api: { version: "1" } } # Create a new client and connect to the server client = Mongo::Client.new(uri, options) # Send a ping to confirm a successful connection begin admin_client = client.use('admin') result = admin_client.database.command(ping: 1).documents.first puts "Pinged your deployment. You successfully connected to MongoDB!" rescue Mongo::Error::OperationFailure => ex puts ex ensure client.close end
AWS Lambda から MongoDB Atlas に接続する
AWS Lambda から Atlas に接続する方法については、「AWS Lambda を使用した接続の管理」を参照してください。
SRV URI ノート
ドライバーがmongodb+srv プロトコルURI に接続するときは、次の点に注意してください。
SRV URI ルックアップは、クライアントが構築されるときに同期的に実行されます。 この検索が何らかの理由で失敗した場合、クライアントの構築は例外を除いて失敗します。 クライアントがホストのリストを使用して構築されると、ドライバーはクライアント オブジェクトが存在する限り、それらのホストにアクセスして監視するよう試行します。 これらのホストの 1 つが最初は解決されず、後で解決可能になった場合、ドライバーは使用可能になったときにそのようなホストへの接続を確立できます。 最初の試行で成功する必要があります。必要に応じて、後続のホスト検索はドライバーによって再試行されます。
ドライバーは、SRV レコードに対応する DNS TXT レコードで URI オプションを検索します。 これらのオプションは、URI で指定された URI オプションと Ruby オプションの順に上書きできます。
URI オプションは SRV lookup とは別の DNS クエリで取得されるため、ネットワーク接続が信頼できない環境では、SRV lookup が成功すると URI オプション クエリが失敗する可能性があります。 このような障害により、ドライバーは間違った認証ソースを使用し、認証が失敗します。 これは、認証ソースを明示的に指定することで回避できます。
Mongo::Client.new("mongodb+srv://username:myRealPassword@cluster0.mongodb.net/test?w=majority&authSource=admin") 構築された
Client
オブジェクトのトポロジーが不明またはシャーディングされたクラスターの場合、ドライバーは指定された SRV DNS レコードの変更の監視を開始し、クラスター内のサーバーのリストを自動的に更新します。 トポロジーが単一またはレプリカセットになると、更新は停止します。
クライアント オプション
Mongo::Client
のコンストラクターは、ドライバーの動作を構成する多数のオプションを受け入れます。 オプションは、オプション ハッシュで Ruby オプションとして、URI で URI オプションとして、またはその両方で提供できます。 Ruby オプションと類似の URI オプションの両方が指定されている場合は、Ruby オプションが優先されます。
Ruby オプション
注意
直接渡されるオプションは、シンボルである必要があります。
注意
特に指定されていない限り、時間を処理する Ruby オプションは秒単位で指定されます。
オプション | 説明 | タイプ | default | ||||||
---|---|---|---|---|---|---|---|---|---|
| サーバー バージョン 3.4 以上で接続を確立するときに mongod ログに出力されるアプリケーション名。 |
| なし | ||||||
| 使用する認証メカニズムを指定します。 次のいずれかになります。 |
| ユーザー認証情報が提供されていない場合、 | ||||||
| 追加の認証メカニズム プロパティを提供します。 プロパティ内のキーは、大文字と小文字を区別せずに解釈されます。 クライアントが作成されると、キーは小文字になります。 |
| GSSAPI 認証メカニズムを使用する場合、デフォルトのプロパティは | ||||||
| 認証ソースを指定します。 |
| MongoDB 2.6 以降の場合: 認証情報が提供されている場合は管理者、そうでない場合は現在のデータベース | ||||||
| 自動暗号化を設定するためのオプションの
これらのオプションの形式の詳細については、クライアント側暗号化 チュートリアルの「自動暗号化オプション」セクションを参照してください。 |
| なし | ||||||
| 試験用。 バックグラウンド スレッドでエラーが発生したときにバックトレースをログに記録するかどうか、またどのようにログに記録するかを制御します。 |
| なし | ||||||
| 使用する潜在的なコンプレッサーのリスト(優先順位順)。 ドライバーが圧縮を実装する方法の詳細については、以下を参照してください。 |
| なし | ||||||
| 非推奨。 ドライバーによって通常実行される配置トポロジーの検出を無効にし、クラスター トポロジーを特定のタイプに強制します。 有効な値は、 |
| なし | ||||||
| 例外が発生する前に、ソケット接続を確立するための待機時間(秒単位)。 このタイムアウトは SRV DNS レコード解決にも使用されます。 |
| 10 | ||||||
| 接続するデータベースの名前。 |
| 管理者 | ||||||
| 指定されたホストに直接接続し、配置トポロジーを検出しません。 |
| false | ||||||
| サーバー モニターがサーバーの状態を非同期に更新するまでの秒数。 |
| 10 | ||||||
| ドキュメントの ID を生成するカスタム オブジェクト。 #generate に応答する必要があります。 |
| なし | ||||||
| ロード バランサーへの接続を要求するかどうか。 |
| false | ||||||
| 動作対象の選択可能なサーバーと最も近いサーバーとの間の最大レイテンシを秒単位で指定します。 |
| 0.015 | ||||||
| カスタム ロガー。 |
|
| ||||||
| 接続プールが並行して確立を試みる接続の最大数。 |
| 2 | ||||||
| 接続プールによって閉じられる前に接続がアイドル状態になる最大時間(秒単位)。 警告:ロード バランサーに接続すると、ドライバーは既存の接続を使用してカーソルを反復処理し(変更ストリームを含む)、トランザクションを実行します。 このオプションでアイドル時間を設定すると、ドライバーが後続の操作に必要な接続を閉じてしまい、それらの操作が失敗する可能性があります。 |
| なし | ||||||
| 各サーバーの接続プールの最大サイズ。 このオプションを 0 に設定すると、接続プールの最大サイズ制限が削除され、任意の接続数に拡大できるようになります。 |
| 20 | ||||||
| レガシー読み取り再試行が使用される場合の読み取り再試行の最大回数。 レガシー読み取り再試行を無効にするには、 を 0 に設定します。 |
| 1 | ||||||
| レガシー書込み再試行が使用される場合の最大書込み再試行回数。 レガシー書込み再試行を無効にするには、 を 0 に設定します。 |
| 1 | ||||||
| 各サーバーの接続プール内の最小接続数。 プールにこの数の接続が含まれるまで、ドライバーはバックグラウンドで接続を確立します。 |
| 0 | ||||||
| 監視オブジェクト。 |
| なし | ||||||
| 認証するユーザーのパスワード。 |
| なし | ||||||
| サーバー バージョン 3.4 以上で接続を確立するときに mongod ログに出力されるメタデータに含めるプラットフォーム情報。 |
| なし | ||||||
| サーバーを選択するための読み込み設定(read preference)モードとタグセットを
タグセットが指定される場合、それらはハッシュの配列である必要があります。 サーバーは、タグが提供されたタグセット内の 1 つのハッシュと一致する場合、読み込み設定 (read preference) を満たす場合、読み込み設定 (read preference) を満たします。 各タグセットはハッシュである必要があり、サーバー選択に使用される前に内部的に |
|
| ||||||
| 読み取り保証 (read concern) オプションを指定します。 有効なキーは |
| なし | ||||||
| mongos での読み取りが再試行される間隔(秒単位)。 |
| 5 | ||||||
| レプリカセットに接続する場合、これはサーバーをフィルタリングするセットの名前です。 |
| なし | ||||||
| ネットワーク エラーによってシングル ステートメント書込み (write) 操作が失敗した場合、ドライバーはサーバー バージョン 3.6 以降に接続すると自動的に再試行します。 |
| true | ||||||
| クライアントは構築されるとすぐにバックグラウンドで配置の監視を開始するため、クライアントを構築し、別の ステートメントでSDAMイベントにサブスクライブすると、サブスクライブが一部の SDAM イベントを受信しない可能性があります。 クライアントのイベント サブスクライブ メカニズムが初期化された後、いずれかのサーバーがクライアントに追加される前に、 注: 手順で提供される |
| なし | ||||||
| リクエストされたサーバー API バージョン。 これは、次の許可された項目を含むハッシュです: - サーバー API バージョンは Ruby オプションとしてのみ指定でき、URI オプションとしては指定できないこと、およびデータベースおよびコレクション オブジェクトを上書きすることはできないことに注意してください。 クライアントでサーバー API バージョンが変更された場合( |
| なし | ||||||
| 例外が発生する前に、操作が実行されるよう適切なサーバーが選択されるまで待機する秒数。 |
| 30 | ||||||
| 例外が発生する前に、ソケット上で操作が実行されるまで待機する秒数。 |
| なし | ||||||
| シャーディングされたトポロジにドライバーが通信する mongos の最大数。 このオプションを 0 に設定すると、mongos の最大数はなくなります。 指定された URI が |
| 0 | ||||||
| SRV DNS クエリで使用するサービス名。 |
| mongodb | ||||||
| TLS 経由でサーバーに接続するようにクライアントに指示します。 |
| false | ||||||
| 接続のもう一方の側から渡された証明書を検証するために使用される、連結された証明機関証明書を含むファイル パス。 |
| なし | ||||||
| 接続先から渡された証明書を検証するために使用される証明機関証明書を表す OpenSSL::X509::Certificate の配列。 |
| なし | ||||||
| 接続のもう一方の側から渡された証明書を検証するために使用される、連結された証明機関証明書を含む string。 |
| なし | ||||||
| MongoDB サーバーへのアプリケーションを識別するために使用されるクライアント証明書ファイルへのパス。 ファイルには証明書の秘密キーも含まれている場合があります。その場合、秘密キーはこのオプションによって無視されます。 ファイルには、クライアント証明書から CA 証明書への証明書チェーンを構成する中間証明書も含まれる場合があります。中間証明書はドライバーによって解析され、 このオプションは、存在する場合、 |
| なし | ||||||
| MongoDB サーバーに対してアプリケーションを識別するために使用される OpenSSL::X509::Certificate 。 このオプションを介して渡すことができる証明書は 1 つだけです。 |
| なし | ||||||
| MongoDB サーバーに対してアプリケーションを識別するために使用される PEM でエンコードされた証明書を含む string。 string には証明書の秘密キーが含まれる場合もあります。その場合、秘密キーはこのオプションによって無視されます。 string には、クライアント証明書から CA 証明書への証明書チェーンを構成する中間証明書も含まれる場合があります。中間証明書はドライバーによって解析され、 このオプションは、存在する場合、 |
| なし | ||||||
| MongoDB に対する接続を識別するために使用される秘密キーファイル。 キーが証明書と同じファイルに保存されている場合でも、両方を明示的に指定する必要があることに注意してください。 このオプションが存在する場合、:ssl_key_string および :ssl_key_object の値よりも優先されます。 |
| なし | ||||||
| MongoDB に対する接続を識別するために使用される秘密キー。 |
| なし | ||||||
| 秘密キーのパスフレーズ。 |
| なし | ||||||
| MongoDB に対する接続を識別するために使用される PEM でエンコードされた秘密キーを含む string 。 このパラメーターが存在する場合、オプションの値である :ssl_key_object よりも優先されます。 |
| なし | ||||||
| ピア証明書、ホスト名、OCSP エンドポイントの検証を実行するかどうか。 |
| true | ||||||
| ピア証明書の検証を実行するかどうか。 この設定は、証明書の検証が実行されるかどうかに関して |
| true | ||||||
| ピア ホスト名の検証を実行するかどうか。 この設定は、ホスト名の検証が実行されるかどうかに関する |
| true | ||||||
| 証明書で OCSP エンドポイントが指定されている場合、証明書で指定された OCSP エンドポイントに対してサーバーが提供した証明書を検証するかどうか。 この設定は、OCSP エンドポイント検証が実行されるかどうかに関して :ssl_verify を上書きします。 |
| true | ||||||
| ログをデフォルトで 250 文字で切り捨てるかどうか。 |
| true | ||||||
| 認証するユーザーの名前。 |
| なし | ||||||
| 接続プール内の接続が利用可能になるまで待機する秒数。 |
| 10 | ||||||
| ドライバーをラップしている ODM などのライブラリに関する情報。 最初に低レベルのライブラリを指定します。 許可されたハッシュキー: :name、:version、:プラットフォーム。 例: |
| なし | ||||||
| 非推奨。 |
|
| ||||||
| 書込み保証(write concern) オプションを
|
|
| ||||||
| 圧縮を使用する場合、使用するzlib圧縮レベル。 有効なレベルについては、 Rubyのzlibモジュールを参照してください。 |
| なし |
注意
Ruby ドライバーには、証明書失効リスト(CRL)チェックは実装されていません。
URI オプション
URI オプションは Ruby の標準ではない キャメル ケース である必要があるため、次の表は URI オプションとそれに対応する Ruby オプションを示しています。
URI オプションについて詳しくは、「接続 URI リファレンス 」を参照してください。
注意
URI でミリ秒単位で設定されているオプションは、Ruby ではfloat
として表され、単位は秒です。
URI オプション | Ruby オプション |
---|---|
appName= string |
|
authMechanism= string |
認証メカニズム値は、URI オプションから Ruby オプションに次のように変換されます。
認証メカニズムに別の値が指定されている場合は、変更されずに Ruby オプションに変換され、その |
authMechanismProperties=Strings |
カンマで区切られたキーと値のペアとして指定されます。例: |
authSource= string |
|
compressors=Strings |
使用する潜在的なコンプレッサーのコンマ区切りリスト(優先順位順)。 ドライバーが圧縮を実装する方法の詳細については、以下を参照してください。 |
connect= string |
ここでは、 |
connectTimeoutMS=Integer |
Rubyな値(例: 負の値および数値以外の値)の場合、この URI オプションによって指定された無効な値は警告付きで無視されます。 |
directConnection=ブール値 |
|
fsync=ブール値 |
|
heartbeatFrequencyMS=Integer |
|
journal=ブール値 |
|
loadBalanced=ブール値 |
|
localThresholdMS=Integer |
|
maxConnecting=Integer |
|
maxIdleTimeMS=Integer |
|
maxStalenessSeconds=Integer |
maxStalenessSeconds URI オプションの値が -1 の場合、 オプションがまったく指定されていない限り、ドライバーはこれを として扱います。 それ以外の場合、オプション値が数値の場合、Ruby オプションは |
maxPoolSize=Integer |
|
minPoolSize=Integer |
|
readConcernLevel= string |
|
readPreference= string |
|
readPreferenceTags=Strings |
readPreferenceTags フィールドの各インスタンスは、カンマで区切られたキーと値のペアであり、指定された順序で : tags_sets 配列に表示されます。 たとえば、 |
レプリカセット= string |
|
retryWrites=ブール値 |
|
serverSelectionTimeoutMS=Integer |
|
socketTimeoutMS=Integer |
Rubyな値(例: 負の値および数値以外の値)の場合、この URI オプションによって指定された無効な値は警告付きで無視されます。 |
srvMaxHosts=Integer |
|
srvServiceName= string |
|
ssl=ブール値 |
|
tls=ブール値 |
|
tlsAllowInvalidCertificates=Bool |
|
tlsAllowInvalidHostnames=Bool |
|
tlsCAFile= string |
|
tlsCertificateKeyFile= string |
|
tlsCertificateKeyFile= string |
|
tlsCertificateKeyFilePassword= string |
|
tlsDisableOCSPEndpointCheck=Bool |
|
tlsInsecure=ブール値 |
tlsInsecure は |
w=Integer|String |
|
waitQueueTimeoutMS=Integer |
|
wtimeoutMS=Integer |
|
zlibCompressionLevel=Integer |
|
注意
Ruby ドライバーは、サーバーの証明書が失効したことを示す明確な署名付き応答を受信した場合にのみ接続を失敗します。 このため、ドライバーはtlsDisableCertificateRevocationCheck
URI オプションを認識しません。 このオプションが URI で指定されている場合、無視されます。
タイムアウト オプション
server_selection_timeout
操作を実行するときに、ドライバーが操作を送信するのに適したサーバーを見つけるまで待機する秒数。 デフォルトは 30 です。
値が 0 の場合、タイムアウトは発生しません。
無効な値(負の値や数値以外の値)が URI オプションを介して渡される場合、無効な入力は警告付きで無視されます。 Ruby オプションを介して無効な値がクライアントに直接渡されると、クライアントの構築はエラーで失敗します。
レプリカセットの配置では、ドライバーがプライマリの変更を透過的に処理できるように、このタイムアウトを通常のレプリカセットの選挙時間を超えるように設定する必要があります。 このタイムアウトでは、アプリケーションとデータベースを同時に起動することもできます。アプリケーションは、データベースが使用可能になるまで最大でこの時間待機します。
アプリケーション サーバーがリバースプロキシの背後にある場合、サーバー選択タイムアウトはリバースプロキシに設定されているリクエストタイムアウトよりも小さくする必要があります(たとえば、ルーティング層のタイムアウトが 30 秒に固定されている Helku での配置に適用されます)。 開発環境では、サーバーが実行されていない場合に、この値を低くして障害をより早く解決できます。
socket_timeout
通常の(非モニタリング)接続でソケットの読み取りまたは書き込みが完了するまで待機する秒数。 デフォルトでは、タイムアウトはありません。
値が 0 の場合、タイムアウトは発生しません。
無効な値(負の値や数値以外の値)が URI オプションを介して渡される場合、無効な入力は警告付きで無視されます。 Ruby オプションを介して無効な値がクライアントに直接渡されると、クライアントの構築はエラーで失敗します。
このタイムアウトは、ネットワーク レイテンシと操作期間の両方を考慮する必要があります。 たとえば、このタイムアウトを 5 秒に設定すると、 Mongo::Error::SocketTimeoutError
がサーバー上で実行されるのに 5 秒以上かかるクエリは中止されます。
デフォルトではソケット タイムアウトは設定されていませんが、オペレーティング システムの構成によっては、読み取り操作がタイムアウトする可能性があることに注意してください。 キープアライブ設定は、切断されたネットワーク接続を検出することを目的としています(実行に時間がかかるため操作を中止するものではありません)。
socket_timeout
の値を超えてドライバーによって操作がタイムアウトされた場合でも、サーバー上で操作は中止されないことに注意してください。 このため、サーバー上での実行が中止される可能性がある操作にはmax_time_ms
オプションを使用することをお勧めします。
このオプションは、接続のモニタリングには適用されません。
connect_timeout
サーバーへのソケット接続が確立されるまでの待機時間(秒単位)。 デフォルトは 10。
このタイムアウトは、接続を監視するための接続タイムアウトとソケット タイムアウトの両方にも使用されます。
mongodb+srv://
URI を使用する場合、このタイムアウトは SRV と TXT の DNS ルックアップにも使用されます。 タイムアウトは検索ごとに適用されることに注意してください。 DNS サフィックス検索リストにより、1 つの名前解決の一部として複数の検索が実行される場合があります。
wait_queue_timeout
接続プール内の接続が利用可能になるまで待機する秒数。 デフォルトは 10。
ドライバー バージョン 2.11 以降では、接続プールが接続を返す前に完全に接続を確立するようになりました。これには複数のネットワーク ラウンド トリップが必要になる場合があるため、このタイムアウトは少なくともconnect_timeout
より大きい値に設定する必要があります。
max_time_ms
特定の操作のオプションとして指定された、サーバー上での操作の実行を許可するミリ秒数です。 デフォルトでは設定されていません。
長時間実行されすぎる操作に時間がかかりすぎる場合、サーバー上で長時間実行されている操作が中断される可能性がある場合は、 socket_timeout
の代わりにこのオプションを使用することを検討してください。
wtimeout
書込み保証 (write concern) で指定されたサーバー数によって書込み (write) が確認されるまで待機するミリ秒数。 デフォルトで設定されていない場合、サーバーはデフォルトを適用するように指示します。 このオプションは、クライアントでグローバルに設定することも、 :write_concern
の下の個々の操作に渡すこともできます。
TLS 接続
TLS を使用して MongoDB 配置に接続するには、次のようにします。
Mongo::Client
で TLS 接続を有効にします。クライアント TLS 証明書を指定します。
サーバーの TLS 証明書を検証するために CA 証明書を指定します。
注意
JRuby を使用する場合、ECDSA 証明書は現在サポートされていません。
TLS と SSL のオプション名
Ruby ドライバーでサポートされているすべての MongoDB サーバー バージョン(2.6 以上)は、TLS のみを実装します。 2.6 以降のサーバーでは SSL は使用されません。
履歴上の理由により、TLS 構成に関連する Ruby オプション名では、 tls
プレフィックスではなくssl
が使用されます。 Ruby ドライバーの次のメジャー バージョン(3.0)では、Ruby オプション名にtls
プレフィックスが使用されます。
URI オプション名にはtls
プレフィックスが使用されます。ただし、非推奨でtls
URI オプションと同等のssl
URI オプションがあります。
TLS 接続の有効化
配置で TLS 接続が必要な場合は、クライアント側で TLS を明示的に要求する必要があります。現在、配置に TLS が必要かどうかの自動検出はありません。
TLS 接続をリクエストするには、 Mongo::Client
を構築するときに次のクライアント オプションを指定します。
:ssl
Ruby オプション。tls
URI オプション。ssl
URI オプション(非推奨)。
クライアント TLS 証明書の指定
デフォルトでは、MongoDB サーバーは接続クライアントの TLS 証明書の検証を試行します。そのため、クライアントは接続時に TLS 証明書を指定する必要があります。 これは、次の方法で実行できます。
:ssl_cert
/:ssl_cert_object
/:ssl_cert_string
および:ssl_key
/:ssl_key_object
/:ssl_key_string
/:ssl_key_pass_phrase
Ruby オプション。tlsCertificateKeyFile
URI オプション。
Ruby オプションを使用する場合、クライアント TLS 証明書と対応する秘密キーが個別に提供される場合があります。 たとえば、証明書がclient.crt
に保存され、秘密キーがclient.key
に保存されている場合、 Mongo::Client
は次のように構築できます。
client = Mongo::Client.new(["localhost:27017"], ssl: true, ssl_cert: 'path/to/client.crt', ssl_key: 'path/to/client.key', ssl_ca_cert: 'path/to/ca.crt', )
ssl_cert
、 ssl_cert_string
、 ssl_key
、 ssl_key_string
Ruby オプションでは、証明書とキーをそれぞれ同じファイルまたは string で提供することもできます。 証明書と秘密キーの両方を含むファイルの拡張子は、頻繁に.pem
になります。 証明書と秘密キーの両方が同じファイルまたはstringで提供されている場合は、次のように、証明書オプションとキー オプションの両方を使用する必要があります。
client = Mongo::Client.new(["localhost:27017"], ssl: true, ssl_cert: 'path/to/client.pem', ssl_key: 'path/to/client.pem', ssl_ca_cert: 'path/to/ca.crt', )
URI オプションを使用する場合は、証明書とキーを ファイルに保存し、両方を同じファイルに保存する必要があります。 使用例:
client = Mongo::Client.new( "mongodb://localhost:27017/?tls=true&tlsCertificateKeyFile=path%2fto%2fclient.pem&tlsCertificateKeyFile=path%2fto%2fca.crt")
注意
URI オプション値は適切に URI エスケープされる必要があります。 これは、パス内のスラッシュに適用されます。
変更 SSLContext
特定の暗号を有効または無効にするなど、ドライバーで TLS オプションをさらに構成することが必要な場合があります。 現在のところ、Ruby ドライバーはMongo::Client
を初期化するときにこれを行う方法を提供していません。
ただし、Ruby ドライバーはグローバルな「TLS コンテキスト フック」を設定する方法を提供します。これらは ソケットで使用されるユーザー提供のProc``s that will be invoked before any TLS socket
connection and can be used to modify the underlying ``OpenSSL::SSL::SSLContext
オブジェクトです。
TLS コンテキスト フックを設定するには、 Proc``s to the ``Mongo.tls_context_hooks
配列を追加します。 これは、Mongo::Client インスタンスを作成する前に行う必要があります。 たとえば、Rails アプリケーションでは、このコードは 初期化子に配置できます。
Mongo.tls_context_hooks.push( Proc.new { |context| context.ciphers = ["AES256-SHA"] } ) # Only the AES256-SHA cipher will be enabled from this point forward
Proc
内のすべてのMongo.tls_context_hooks
OpenSSL::SSL::SSLContext
には、単一の引数として オブジェクトが渡されます。これらのProc``s will
be executed sequentially during the creation of every ``Mongo::Socket::SSL
オブジェクトは。
Mongo.tls_context_hooks=
を呼び出すフックの配列全体を割り当てることも可能ですが、そうすると、以前に割り当てられたフックがすべて削除されます。 Array#push
Array#unshift
新しいフックを追加するには、 メソッドまたは メソッドを使用することをお勧めします。
Proc への参照をアプリケーション内の別の場所に保存し、 Array#delete_if
を使用して必要なフックを削除することで、 Mongo.tls_context_hooks
からフックを削除することもできます。
警告
TLS コンテキスト フックはグローバルであり、 Mongo::Client
のすべてのインスタンスに影響します。 アプリケーションでこれらのフックを有効にできるライブラリは、ライブラリがロードされたときにフックを自動的に有効にするのではなく、フック(アプリケーションによって呼び出される)を変更するためのメソッドを公開する必要があります。
TLS 用の MongoDB サーバーの構成の詳細については、 MongoDB マニュアルを参照してください。
中間証明書の使用
クライアント証明書とサーバー証明書の両方で証明書チェーンを使用できます。 チェーンを使用する場合は、証明機関パラメータには信頼できるルート証明書のみを含めるように設定する必要があります。中間証明書(存在する場合)は、それぞれリーフサーバーとクライアント証明書の後に連結して、サーバーまたはクライアント証明書で提供する必要があります。
:ssl_cert
と:ssl_cert_string
Ruby オプション、およびtlsCertificateKeyFile
URI オプションは、証明書チェーンをサポートします。 のインスタンスを受け取る:ssl_cert_object
Ruby オプションは、証明書チェーンをサポートしていません。OpenSSL::X509::Certificate
Ruby ドライバーは厳格な X.509 証明書検証を実行します。これには、中間証明書に次のフィールドが 両方 設定されている必要があります。
X509v3 基本制約: CA: true -- 証明書に署名可能
X509v3 キー使用: キー証明書署名 -- 証明書に署名できます
これらのフラグについて詳しくは 、この Stack Overflow の質問 を 参照してください。 。
tlsCAFile
/ ssl_ca_cert
オプションで渡されるルート CA 証明書に中間証明書を連結することはよくあります。 これにより、中間証明書は信頼できるステータスに引き上げられ、実際の CA ルートに対して検証されなくなります。 この問題の詳細については 、このフィーリング リストの記事を 参照してください。 。
CA 証明書の指定
ドライバーはデフォルトでサーバーの TLS 証明書の検証を試み、この検証が失敗した場合は接続を中止します。 デフォルトでは、ドライバーはデフォルトのシステム ルート証明書ストアを信頼アンカーとして使用します。 サーバーの証明書に署名されている CA 証明書を指定するには、次を使用します。
:ssl_ca_cert
/:ssl_ca_cert_string
/:ssl_ca_cert_object
Ruby オプションtlsCAFile
URI オプション。
これらのオプションのいずれかを指定すると、サーバーの証明書は指定された CA 証明書に対してのみ検証され、デフォルトのシステム ルート証明書ストアは使用されません。
サーバー TLS 証明書検証を実行しない(推奨はされません)には、 ssl_verify: false
Ruby オプションまたはtlsInsecure=true
URI オプションを指定します。
複数の CA 証明書の指定
:ssl_ca_cert
Ruby オプションとtlsCAFile
URI オプションは、複数の証明書を含むファイルで使用できます。 このように参照されるすべての証明書は、トラスト アンカーになります。
:ssl_ca_cert_object
オプションは証明書の配列を指定するため、証明機関として複数の証明書を追加する目的でも使用できます。
:ssl_ca_cert_string
オプションでは CA 証明書の指定が 1 つだけの指定がサポートされています。
警告
CA 証明書オプションで指定されたファイルには中間証明書を含めることはできません。 そうすると、中間証明書がルート証明書に対して検証されるのではなく、中間証明書がルート証明書のステータスに昇格します。
中間証明書を使用する必要がある場合は、クライアントまたはサーバーの TLS 証明書ファイルの一部として指定します。
OCSP 検証
サーバーによって提供された証明書に OCSP エンドポイント URI が含まれている場合、ドライバーは指定されたエンドポイントに OCSP リクエストを発行して、証明書の有効性を確認します。
OCSP エンドポイント チェックを無効にするには、クライアントの作成時に:ssl_verify_ocsp_endpoint
Ruby オプションをfalse
に設定するか、 tlsDisableOCSPEndpointCheck
URI オプションをtrue
に設定します。
注意
OCSP エンドポイント チェックは現在、JRuby で実行している場合は実行されません。JRuby は OCSP エンドポイント URI を正しく公開しないためです。
IPv4/IPv6 接続
ホスト名としてlocalhost
を使用してクライアントを構築すると、IPv4 接続のみが試行されます(つまり、 localhost
が127.0.0.1
と::1
に解決される場合、ドライバーは127.0.0.1
への接続のみを試行します)。
localhost
以外のホスト名でクライアントを構築すると、ホスト名が解決するアドレスに応じて IPv4 接続と IPv6 接続の両方が試行されます。 ドライバーは、 getaddrinfo
がアドレスを返す順序を尊重し、それらから順番に接続を試みます。 最初に成功した接続が使用されます。
ドライバーは現在、Playgrounds アルゴリズムを実装していません。
TCP キープアライブ構成
システム構成と Ruby 言語ランタイムで許可されている場合、ドライバーは TCP キープアライブを有効にし、以下にリストされている各キープアライブ パラメーターごとに、それぞれのパラメーターの値を指定された値に設定します。リストされたドライバー値:
tcp_keepalive_time
: 120 秒tcp_keepalive_intvl
: 10秒tcp_keepalive_cnt
: 9 probes
注意
JRuby 9.2.14.0 以降、 JRuby は、キープアライブ パラメーターを設定するために必要な API を実装していません。 JRuby を使用する場合、ドライバーはキープアライブ パラメーターを設定できず、システム構成が有効になります。
より低い値を使用したり、必要な API を公開していない JRuby などの環境でパラメーターを変更したりするには、 MongoDB 診断 FAQ のキープアライブ セクション で説明されているように、システム レベルでパラメーターを調整してください。 。
接続プーリング
Mongo::Client
instances have a connection pool per server that the client is connected to. プールは、アプリケーションによって発行された同時 MongoDB 操作をサポートするためのオンデマンド接続を作成します。 接続にはスレッドアフィニティはありません。
クライアント インスタンスは、サーバーの状態を監視するために、既知のサーバーごとに 1 つの追加の接続を開きます。
各接続プールのサイズはmax_pool_size
に制限されており、デフォルトは 5 です。アプリケーション内のスレッドが MongoDB で操作を開始すると、プールからその操作を送信する接続を検索しようとします。 プールに利用可能な接続がある場合は、プールから接続をチェックアウトし、その接続を操作に使用します。 使用可能な接続がなく、プールのサイズがmax_pool_size
より小さい場合は、新しい接続が作成されます。 すべての接続が使用され、プールが最大サイズに達した場合、スレッドは別のスレッドによってプールに接続が返されるまで待機します。 max_pool_size
が 0 に設定されている場合、プール内の最大接続数の制限はありません。
各プールには、サーバーに同時に接続できる接続数の制限があります。 この制限はmax_connecting
と呼ばれ、デフォルトは 2 です。現在サーバーに接続している接続数がこの制限に達した場合、プールは接続試行が成功するか失敗するのを待ってから、新しい接続の作成を試みます。 アプリケーションに多数のスレッドがある場合は、接続が確立されるまでスレッドが待機しないように、 max_connecting
を増やしてください。
接続可能になるまでスレッドが待機する秒数は構成可能です。 この設定はwait_queue_timeout
と呼ばれ、秒単位で定義されます。 このタイムアウトに達すると、 Timeout::Error
が発生します。 デフォルトは 1 秒です。
ドライバー バージョン 2.11 以降、ドライバーはmin_pool_size
設定までの接続を早期に作成します。 ドライバー バージョン 2.11 より前では、ドライバーは常にオンデマンドで接続を作成していました。 すべてのバージョンのドライバーで、接続が確立されると、プール サイズがmin_pool_size
を超えない限り、ドライバーによってプールに保持されます。
ただし、 min_pool_size
が 0 より大きい値に設定されている場合、アプリケーションがセカンダリ読み取りを実行していなくても、ドライバーはレプリカセットの配置でセカンダリへのその数の接続を確立します。 これらの接続の目的は、プライマリが変更した場合のフェイルオーバーを高速化することです。
マルチスレッド アプリケーションが開始する接続数を推定する例があります。3 ノードのレプリカセットに接続されたクライアントは、3 つの監視ソケットを開きます。 また、各サーバー上でのマルチスレッド アプリケーションの同時操作をサポートするために必要な数のソケットを開きます(最大max_pool_size
。 アプリケーションがプライマリ(デフォルト)のみを使用する場合は、プライマリ接続プールのみが大きくなり、合計接続数は最大 8(プライマリ プールの 5 接続 + 3 モニタリング接続)になります。 アプリケーションが 読み込み設定 (read preference) を使用してセカンダリをクエリすると、それらのプールも大きくなり、合計接続数は 18(5 + 5 + 5 + 3)に達します。
Mongo::Client
のデフォルト構成はほとんどのアプリケーションで動作します。
client = Mongo::Client.new(["localhost:27017"])
このクライアントはプロセスごとに1 回作成し、すべての操作で再利用します。 リクエストごとに新しいクライアントを作成することがよくあります。これは非常に非効率的であり、クライアントがそのために設計されたものではありません。
1 つのプロセス内で非常に多くの同時 MongoDB 操作をサポートするには、 max_pool_size
を増やします。
client = Mongo::Client.new(["localhost:27017"], max_pool_size: 200)
1 つのプロセス内で同じクライアントを共有する極端に多くのスレッドをサポートするには、 max_connecting
を増やします。
client = Mongo::Client.new(["localhost:27017"], max_pool_size: 200, max_connecting: 10)
接続が利用可能になるまで待機する任意の数のスレッドが、デフォルトの(1 秒)またはwait_queue_timeout
設定で待機できます。
client = Mongo::Client.new(["localhost:27017"], wait_queue_timeout: 0.5)
いずれかのスレッドによってクライアント上で#close
が呼び出されると、すべての接続が閉じられます。
client.close
上記のブロック構文を使用してクライアントを作成すると、ブロックの実行が完了した後にクライアントは自動的に閉じられることに注意してください。
フォーク サーバーでの使用
注意
Mongoid を使用するアプリケーションは、 Mongoid の 「フォークサーバーでの使用」 ドキュメントに従う必要があります。 以下のガイダンスは、Ruby ドライバーを直接使用するアプリケーションに提供されています。
Pume などのフォーク Web サーバーを使用して Web アプリケーションでmongo Rubyドライバーを使用する場合、またはアプリケーションがフォークする場合、各プロセス(親と子)には独自のクライアント接続が必要です。 その理由は以下のとおりです。
Ruby MongoDB ドライバーによって接続状態を監視するために使用されるバックグラウンド Ruby スレッドは、子プロセスに転送されません。
ネットワーク ソケットのようなファイル記述子は親プロセスと子プロセス間で共有されるため、I/O 競合が発生する可能性があります。
( 1 )について、フォーク後に子プロセスでドライバーの監視スレッドを再起動しないと、子は最初は正しく機能しているように見えても、MongoDB クラスターの状態が変化した場合には、最終的にはMongo::Error::NoServerAvailable
の例外が発生します。たとえば、ネットワーク エラーやメンテナンス イベントが原因で発生します。
( 2 )に関して、子プロセスが親のファイル記述子を再利用すると、 Errno::EPIPE: Broken pipe
やEOFError: end of file reached
などのメッセージを含むMongo::Error::SocketError
エラーが表示されます。
Ruby ドライバーをウェブ アプリケーションで使用する場合は、可能であれば、親プロセス(ワーカーがフォークされる前)にMongo::Client
インスタンスを作成せず、代わりにワーカーにクライアント インスタンスのみを作成することをお勧めします。
プロセス フォークの手動処理
特定の高度なユースケース( Pume の fork_worker オプション など) では、親プロセスと子プロセスの両方でMongo::Client
インスタンスが開かれている必要があります。この場合は、クライアントの再接続を手動で処理する必要があります。
それには、親プロセス上の既存のクライアント接続を閉じます。 これにより、子が親のファイル記述子を再利用することによって、親プロセスでネットワーク エラーとモニタリング エラーが発生するのを防ぎます。
# Immediately before fork client.close
注意
Client#close
を呼び出しても、現在実行中のデータベース操作は中断されません。 新しい操作を実行すると、クライアントは自動的に再接続されます。
次に、フォークの直後に、新しくフォークされた子プロセスでクライアントを再接続します。これにより、ドライバーの監視スレッドが再起動します。
# Immediately after fork client.reconnect
ほとんどのウェブ サーバーは、ワーカー プロセスがフォークされたときにアプリケーションがアクションを実行するために使用できるフックを提供しています。 推奨されるフックは次のとおりです。
Pume
before_fork
on_refork
の場合 では、on_worker_boot
と を使用して親プロセス内のクライアントを閉じ、 を使用して子プロセス内の再接続を行います。Unicode
before_fork
の場合 、親プロセス内のクライアントを閉じるにはafter_fork
を、子プロセス内のクライアントを再接続するには を使用します。乗用者 子プロセス内のクライアントを再接続するための 、 (Pager には事前フォークがあるようには表示されません)。
starting_worker_process
その他の例については、 Mongoid の「フォーク サーバーでの使用」ドキュメントを参照してください。
トラブルシューティング
クライアントのsummary
メソッドは、クライアントが監視しているサーバーとその状態を含むクライアントの現在の状態を返します。 いずれかのサーバーが監視されていない場合は、 NO-MONITORING
フラグで示されます。
通常に動作しているクライアントでは、次のようなサマリーが生成されます。
client.summary => "#<Client cluster=#<Cluster topology=ReplicaSetWithPrimary[localhost:14420,localhost:14421,localhost:14422,localhost:14423,name=ruby-driver-rs,v=1,e=7fffffff000000000000001f] servers=[#<Server address=localhost:14420 PRIMARY replica_set=ruby-driver-rs pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14421 SECONDARY replica_set=ruby-driver-rs pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14422 SECONDARY replica_set=ruby-driver-rs pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14423 ARBITER replica_set=ruby-driver-rs>]>>"
バックグラウンド スレッドがないクライアントでは、次のような概要が生成されます。
client.summary => "#<Client cluster=#<Cluster topology=ReplicaSetWithPrimary[localhost:14420,localhost:14421,localhost:14422,localhost:14423,name=ruby-driver-rs,v=1,e=7fffffff000000000000001f] servers=[#<Server address=localhost:14420 PRIMARY replica_set=ruby-driver-rs NO-MONITORING pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14421 SECONDARY replica_set=ruby-driver-rs NO-MONITORING pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14422 SECONDARY replica_set=ruby-driver-rs NO-MONITORING pool=#<ConnectionPool size=0 (0-5) used=0 avail=0 pending=0>>, #<Server address=localhost:14423 ARBITER replica_set=ruby-driver-rs>]>>"
再試行可能な読み取り
ドライバーは、読み取りを再試行するための 2 つのメカニズム(モダンとレガシー)を実装しています。 ドライバー バージョン 2.9.0 以降では、最新のメカニズムがデフォルトで使用され、レガシー メカニズムは非推奨です。
モダンな再試行可能な読み取り
最新のメカニズムを使用すると、ネットワークエラー、「mongos マスター」エラー、または「node がリカバリ中」エラーが発生した場合、読み取り操作は 1 回再試行されます。 次の操作がカバーされます。
Collection#findおよび関連メソッド
変更ストリーム ヘルパー: Collection#watch 、 Database#watch 、 Client#watch
列挙コマンド:クライアント#list_mongo_databases 、 Client#list_databases 、 Client#database_names 、 Database#collection_names 、 Database#collections 、 Database#list_collections 、 Collection#indexs
操作によってカーソルが返された場合、再試行できるのは最初の読み取りコマンドのみです。 カーソルに対するgetMore
操作は、ドライバー バージョン 2.9.0 以降では再試行されません。 さらに、読み取り操作が再試行されると、操作用の新しいサーバーが選択されます。これにより、最初の読み取りを受信したサーバーとは異なるサーバーに再試行が送信される可能性があります。
最新の再試行可能な読み取りの動作は、 再試行可能な読み取りの仕様 で詳細にカバーされています 。
最新の再試行可能な読み取りは、MongoDB 3.6 以降のサーバーでのみ使用できることに注意してください。 MongoDB 3.4 以前のサーバーで使用する場合、Ruby ドライバー バージョン 2.9.0 以降では、デフォルトで読み取りを再試行しません。アプリケーションは、 retry_reads: false
クライアント オプションを設定するか、 retryReads=false
URI オプションを使用して、レガシー再試行可能な読み取りを明示的にリクエストする必要があります。
レガシー再試行可能な読み取り
Ruby ドライバーのレガシー読み取り再試行動作は、 retry_reads: false
クライアント オプションを設定するか、クライアントにretryReads=false
URI オプションを渡すことで利用できます。
レガシー読み取り再試行動作を使用する場合、 max_read_retries
クライアント オプションを指定することで再試行回数を設定できます。 ドライバー バージョン 2.9.0 以降を使用する場合、レガシーの再試行可能な読み取りで再試行される操作のセットは、最新の再試行可能な読み取りの上記で説明した操作と同じになります。 古いバージョンのドライバーでは、一部の操作が再試行されなかったため、レガシー再試行可能な書き込みの動作が異なりました。
ドライバー バージョン 2.9.0 以降、レガシー読み取り再試行では、最新の再試行可能な書込みと同様に、操作の再試行前にサーバー選択が実行されます。 古いバージョンのドライバーでは、読み取りの再試行は最初の読み取りが送信されたサーバーと同じサーバーに送信されていました。
再試行可能な読み取りの無効化
すべての読み取り再試行を無効にするには、次のクライアント オプションを設定します: retry_reads: false, max_read_retries: 0
。
再試行可能な書き込み
ドライバーは書込みを再試行するための 2 つのメカニズム(モダンとレガシー)を実装しています。 ドライバー バージョン 2.9.0 以降、最新のメカニズムは、それをサポートするサーバーでデフォルトで使用され、レガシー メカニズムは非推奨となり、すべてのサーバー バージョンでデフォルトで無効になります。
コレクションに対する日次の操作で使用される次の書き込みメソッドは、書込み再試行の対象となります。
collection#insert_one
collection#update_one
collection#delete_one
collection#replace_one
collection#find_one_and_update
collection#find_one_and_replace
collection#find_one_and_delete
collection#bulk_write
(すべての単一ステートメント操作の場合、update_many
またはdelete_many
の場合ではありません)
モダンな再試行可能な書込み
最新のメカニズムでは、ドライバーが MongoDB 3.6 以降のレプリカセットまたはシャーディングされたクラスターに接続されていると、サーバーで oplog が必要なため、失敗した書き込みを 1 回再試行します。 モダン メカニズムでは、ドライバーがスタンドアロンの MongoDB サーバーまたはサーバー バージョン 3.4 以前に接続されている場合、書き込みを再試行しません。
次のエラーにより、書込みが再試行されます。
タイムアウトなどのネットワーク エラー
"not Master" エラー
「ノードはリカバリ中」エラー
書き込みを再試行する前に、ドライバーはサーバー選択を実行します。これは、最初の書き込みが送信されたサーバーが使用できなくなっている可能性があるためです。
レガシー再試行可能な書込み
クライアント オプションretry_writes: false
を設定するか、 retryWrites=false
URI オプションを使用して、最新の再試行可能な書込みメカニズムが無効になっている場合、ドライバーはレガシーの再試行可能な書込みメカニズムを利用します。 レガシー メカニズムは、最新のメカニズムと同じ操作に対して書込みを再試行します。 デフォルトでは、レガシーメカニズムは最新のメカニズムと同様に 1 回再試行します。再試行回数を変更するには、 :max_write_retries
クライアント オプションを設定します。
レガシーと最新の再試行メカニズムの違いは、レガシー メカニズムでは最新のメカニズムとは異なるエラー セットの書込みを再試行することと、ネットワーク タイムアウトが発生した場合は書込みを再試行しないことです。
再試行可能な書き込みの無効化
すべての書き込み再試行を無効にするには、次のクライアント オプションを設定します: retry_writes: false, max_write_retries: 0
。
ログ記録
デフォルトのグローバル ドライバー ロガーを使用することも、独自のグローバル ドライバー ロガーを設定することもできます。 自分の を設定するには、次の手順に従います。
Mongo::Logger.logger = other_logger
Ruby Logger のドキュメント を参照してください デフォルトのロガー API と利用可能なレベルの詳細については、 を参照してください。
ロガーレベルの変更
ロガー レベルを変更するには:
Mongo::Logger.logger.level = Logger::WARN
より詳細な制御を行うには、ロガーをクライアントに渡して、ログの記録をクライアントごとに制御できます。
my_logger = Logger.new(STDOUT) Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test', :logger => my_logger )
切り捨て
デフォルトのログでは、ログはデフォルトで 250 文字で切り捨てられます。 これをオフにするには、クライアント インスタンスに オプションを渡します。
Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test', :truncate_logs => false )
圧縮
ワイヤプロトコル圧縮を使用するには、 :compressors
Ruby オプションまたはcompressors
URI オプションのいずれかを使用して少なくとも 1 つのコンプレッサーを明示的にリクエストする必要があります。 コンプレッサーが明示的に要求されていない場合、1 つ以上のコンプレッサーに必要な依存関係がシステム上に存在しても、ドライバーは圧縮を使用しません。
ドライバーは、サーバーによってサポートされているコンプレッサーのうち、最初のコンプレッサーを選択します。 ドライバーは現在、 zstd
、 snappy
、 zlib
のコンプレッサーをサポートしています。 zstd
コンプレッサーは、他のコンプレッサーと比較して同じ CPU 消費で最も高い圧縮を生成するため推奨されます。 最大のサーバー互換性のために、3 つのコンプレッサーすべてを指定できます(たとえば、 compressors: ["zstd", "snappy", "zlib"]
。
zstd
コンプレッサーには zstd-ruby が必要です インストールするライブラリ。snappy
コンプレッサーには snappy が必要です インストールするライブラリ。zstd
またはsnappy
圧縮が要求され、それぞれのライブラリを読み込まない場合、ドライバーはMongo::Client
の作成中にエラーを発生させます。 zlib
圧縮には、 zlib
標準ライブラリ拡張機能が存在する必要があります。
さまざまなコンプレッサーのサーバー サポートは次のとおりです。
zstd
には が必要で、MongoDB 4.2 以降ではデフォルトで有効になっています。snappy
には MongoDB 3.4 以上が必要で、MongoDB 3.6 以上ではデフォルトで有効になっています。zlib
には MongoDB 3.6 以上が必要で、MongoDB 4.2 以降ではデフォルトで有効になっています。
Server API Parameters
MongoDB 5.0 以降では、アプリケーションはサーバーが特定のサーバー API バージョンに準拠しているように動作することをリクエストできます。
サーバー API パラメータは、 Client
への:server_api
オプションを介して指定できます。 これらのパラメーターは URI 経由で提供できません。
現在定義されている API バージョンは"1"
のみです。 次のようにリクエストできます。
client = Mongo::Client.new(['localhost'], server_api: {version: "1"})
MongoDB サーバーは API バージョンを string 値として定義します。 便宜上、API バージョンが整数として指定されている場合、Ruby ドライバーはそれを文字列化し、それを string としてサーバーに送信します。
client = Mongo::Client.new(['localhost'], server_api: {version: 1})
サーバーは、文字列化された整数ではない API バージョンを定義する場合があることに注意してください。 アプリケーションでは、すべての有効な API バージョンが整数として表現できることを前提としている必要はありません。
特定の API バージョンが要求されると、その API バージョンの操作は、その API バージョンで指定されたように動作します。 指定された API バージョンに含まれない操作は、API バージョンがまったく指定されていない場合と同様に動作します。 構成された API バージョンに動作が影響する操作は、コマンド引数、クエリ、集計パイプライン ステージと引数を含むコマンドです。
アプリケーションは、 :strict
オプションを設定することで、指定された API バージョンに含まれないすべての操作をサーバーが拒否することをリクエストできます。
client = Mongo::Client.new(['localhost'], server_api: {version: "1", strict: true})
たとえば、 :tailable
オプションはサーバー API バージョン 1 の一部ではないため、次のクエリは失敗します。
client = Mongo::Client.new(['localhost'], server_api: {version: "1", strict: true}) client['collection'].find({}, tailable: true) # => Mongo::Error::OperationFailure (BSON field 'FindCommand.tailable' is not allowed with apiStrict:true. (323) (on localhost:27017, modern retry, attempt 1))
アプリケーションは、 :deprecation_errors
オプションを設定することで、指定された API バージョンで非推奨のすべての操作をサーバーが拒否することを要求できます。
client = Mongo::Client.new(['localhost'], server_api: {version: "1", deprecation_errors: true})
このドキュメントの作成時点で、API バージョン"1"
に非推奨の操作はありません。
サーバー API パラメータがClient
オブジェクトで定義されている場合、それらは[ 1 ]で実行された各操作の一部としてクライアントによって送信されます。
[1] | getMore トランザクション内の コマンドと コマンドは API パラメーターを受け入れないため、ドライバーはこれらの場合、ドライバーはそれらを送信しません。 |
5.0 より前の MongoDB サーバーは API パラメーターを認識しないため、アプリケーションでそれらを構成する場合、さまざまなエラーが発生します。 Ruby ドライバーはすべての MongoDB 3.6 以降のサーバーに API パラメーターを送信しますが、API パラメーターは、アプリケーションが MongoDB 5.0 以降のサーバーと通信している場合にのみ構成する必要があります。 API パラメーターは、レガシー ワイヤプロトコルを使用する MongoDB 3.4 以前のサーバーに送信できません。アプリケーションが API パラメーターを構成し、MongoDB 3.4 以前のサーバーに接続する場合、ドライバーはすべての操作でエラーを生成します。
コマンド ヘルパーを使用すると、アプリケーションは手動で構築したコマンドをサーバーに送信できます。 クライアントがサーバー API パラメーターで構成されていない場合、コマンドヘルパーを使用して API パラメーター付きのコマンドを発行できます。
client.database.command( ping: 1, apiVersion: "1", apiStrict: false, apiDeprecationErrors: false, )
クライアントがサーバー API パラメーターで構成されている場合、コマンドヘルパーはサーバー API パラメーターでコマンドを発行するために使用されない可能性があります。 これには、クライアントと コマンド ヘルパーに提供されるサーバー API パラメーターが同一の場合が含まれます。 クライアントがサーバー API パラメーターで構築されている場合、別の API パラメーター(またはまったく)送信するには、新しいクライアントを最初から構築するか、 with
メソッドを使用して構築する必要があります。
サーバー API パラメーターは、クライアント レベルでのみ指定できます。 データベース、コレクション、セッション、トランザクション、または個々の操作レベルでは指定できません。
開発構成
ドライバーのデフォルト構成は本番環境の配置に適しています。 開発では、開発者エクスペリエンスを向上させるために一部の設定を調整することができます。
:server_selection_timeout
: MongoDB サーバーがローカルで実行され、手動で起動する場合は、これを低い値(例:1
)に設定します。 サーバー選択タイムアウトが短いと、サーバーが実行されていない場合にドライバーがすぐに失敗します。
本番構成
Ruby ドライバーを使用してアプリケーションを本番環境にデプロイする場合は、次の点を考慮してください。
ドライバー バージョン 2.11 以降では、
:min_pool_size
クライアント オプションは完全に尊重されます。ドライバーは、スタンドアロン、プライマリ、またはセカンダリとして識別される各サーバーへのその数の接続を作成します。 以前のドライバー バージョンでは、ドライバーはオンデマンドで接続を作成していました。:min_pool_size
を使用するアプリケーションでは、ドライバー バージョン 2.11 以降、すべてのサーバーへのアイドル接続数が増加し、特にレプリカセット配置のセカンダリとシャーディングされたクラスター内のノードへのアイドル接続が増加します。アプリケーションが別のウェブサーバーまたはロードバランサーによって逆プロキシされる場合、
server_selection_timeout
は通常、逆プロキシの読み取りタイムアウトよりも低い値に設定する必要があります。 たとえば、Help リクエスト タイムアウト は30 秒であり、構成不可にMongoDB を使用して Ruby アプリケーションを Helku に配置する場合は、サーバー選択タイムアウトを20 秒または15 秒に短縮することを検討してください。
機能フラグ
以下は、 mongo Rubyドライバーが提供する機能フラグのリストです。
Flag | 説明 |
---|---|
| このフラグがオフの場合、ビューで実行される集計は、コレクション内のすべてのドキュメントではなく、そのビューに含まれるドキュメントに対して実行されます。 このフラグがオンの場合、ビューフィルターは無視され、ビューのコレクション内のすべてのドキュメントに集計が適用されます。 (デフォルト: true) |
| このフラグをオフにすると、表示オプションは |
| 置換ドキュメントのルートにアトミック演算子($ で始まる演算子)が存在しないこと、および更新ドキュメントのルートにアトミック演算子のみがあることを検証します。 この機能フラグがオンになっている場合は、無効な更新ドキュメントまたは置換ドキュメントでエラーが発生し、オンでない場合は、ログに警告が出力されます。 (デフォルト: false) |
これらの機能フラグは、 Mongo
モジュールで直接設定することも、 options
メソッドを使用して設定することもできます。
Mongo.validate_update_replace = true Mongo.options = { validate_update_replace: true }