Overview
このガイドでは、書込み保証 (write concern)、読み取り保証 (read concern)、および読み込み設定 (read preference)オプションを構成して、 C++ドライバーがレプリカセットに対して読み取りおよび書込み操作を実行する方法を変更する方法を学習できます。
読み取り設定と書込み設定の優先順位
次のレベルで、書込み保証、読み取り保証、読み込み設定(read preference)のオプションを設定できます。
トランザクション
Database
コレクション
このリストは、オプション設定の優先順位の増加順も示しています。例、データベースに読み取り保証 (read concern)を設定すると、トランザクションから継承された読み取り保証 (read concern)設定が上書きされます。
読み取り操作と書込み操作の設定
読み込み設定( read preference ) を設定することで、ドライバーが読み取り操作をルーティングする方法を制御できます。 また、読み取り保証 ( read concern ) と書込み保証 ( write concern ) を設定して、ドライバーがレプリカセットでの読み取りおよび書込み (write) 操作の確認を待機する方法のオプションも制御できます。
読み取りおよび書込みの設定とそのオプションの詳細については、 MongoDB Serverマニュアルの次のガイドを参照してください。
デフォルトの読み取りおよび書込み設定の詳細については、 MongoDB Serverマニュアルの「 デフォルトのMongoDB読み取り保証/書込み保証 」を参照してください。
トランザクション構成
start_session()トランザクションはmongocxx::options::transaction セッション 内で実行されます。これは、順番に実行されるよう関連付けられた読み取り操作または書込み操作のグループです。トランザクションに使用するセッションを取得するには、 メソッドを使用します。次に、 オブジェクトをセッションのwith_transaction() メソッドに渡します。この例では、トランザクションの 読み込み設定(読み込み設定 (read preference)、読み取り保証 (read concern)、書込み保証 (write concern)を設定する方法を示しています。
Tip
セッションの詳細については、 MongoDB Serverマニュアルの「 サーバー セッション 」を参照してください。
この例では、次の設定を構成しています。
k_primary読み込み設定 (read preference): 読み取り操作は、 プライマリレプリカセットメンバーからデータを取得します。k_majority読み取り保証 (read concern) : 読み取り操作は、レプリカセットノードの過半数に書き込まれたインスタンスの最新データを返します。k_acknowledged書込み保証 (write concern)) : プライマリレプリカセットノードは書込み (write)操作を確認する必要があります。
auto session = client.start_session(); mongocxx::options::transaction txn_opts; { mongocxx::read_preference rp; mongocxx::read_concern rc; mongocxx::write_concern wc; rp.mode(mongocxx::read_preference::read_mode::k_primary); rc.acknowledge_level(mongocxx::read_concern::level::k_majority); wc.acknowledge_level(mongocxx::write_concern::level::k_acknowledged); txn_opts.read_preference(rp); txn_opts.read_concern(rc); txn_opts.write_concern(wc); } session.with_transaction([&](mongocxx::client_session*) { // Specify transaction operations here }, txn_opts);
データベース構成
この例では、データベースの次の読み取り設定を構成する方法を示します。
k_secondary読み込み設定 (read preference): 読み取り操作は、 セカンダリレプリカセットメンバーからのみデータを取得します。k_majority読み取り保証 (read concern) : 読み取り操作は、レプリカセットノードの過半数に書き込まれたインスタンスの最新データを返します。
auto db = client["test_database"]; mongocxx::read_preference rp; mongocxx::read_concern rc; rp.mode(mongocxx::read_preference::read_mode::k_secondary); rc.acknowledge_level(mongocxx::read_concern::level::k_majority); db.read_preference(rp); db.read_concern(rc);
コレクション構成
この例では、コレクションに対して次の読み取り保証と書込み保証 (write concern)保証を指定する方法を示しています。
k_local読み取り保証 (read concern) : 読み取り操作はインスタンスの最新データを返します。このデータがレプリカセットのノードの過半数に書き込まれたことを保証するものではありません。k_acknowledged書込み保証 (write concern)) : プライマリレプリカセットノードは書込み (write)操作を確認する必要があります。
auto coll = client["test_database"]["test_collection"]; mongocxx::read_concern rc; mongocxx::write_concern wc; rc.acknowledge_level(mongocxx::read_concern::level::k_local); wc.acknowledge_level(mongocxx::write_concern::level::k_acknowledged); coll.read_concern(rc); coll.write_concern(wc);
タグセット
MongoDB Serverでは、選択した任意の基準に従ってレプリカセット メンバーにキーと値のタグを適用できます。次に、それらのタグを使用して、1 つ以上のノードを 読み取り操作の対象にすることができます。
デフォルトでは 、 C++ドライバーは、読み取り元ノードを選択するときに タグを無視します。 C++ドライバーに特定のタグを優先するように指定するには、mongocxx::read_preferenceオブジェクトを作成し、その tags() ノード関数を呼び出します。 希望するタグを配列引数として tags() に渡します。
次のコード例では、tags() 関数に渡されるタグセットは、 C++ドライバーに対して、ニューヨークデータセンター("dc": "ny")からの読み取りを優先し、サンフランシスコデータセンター("dc": "sf")にフォールバックするように指示します。
auto tag_set_ny = make_document(kvp("dc", "ny")); auto tag_set_sf = make_document(kvp("dc", "sf")); mongocxx::read_preference rp; rp.mode(mongocxx::read_preference::read_mode::k_secondary); rp.tags(make_array(tag_set_ny, tag_set_sf).view());
再試行可能な読み取りと書込み
C++ドライバーは、ネットワークまたはサーバーエラーによって失敗した場合、特定の読み取りおよび書込み操作が 1 回自動的に再試行されます。
接続 URI で retryReads または retryWrites オプションを false に設定することで、再試行可能な読み取りまたは再試行可能な書込みを明示的に無効にすることができます。次の例では、クライアントの再試行可能な読み取りと書込みを無効にします。
mongocxx::uri uri{"mongodb://localhost:27017/?retryReads=false&retryWrites=false"}; mongocxx::client client{uri};
サポートされている再試行可能な読み取りおよび書込み操作の詳細については、 MongoDB Serverマニュアルの次のガイドを参照してください。
ロード バランシング
シャーディングされたクラスターまたはレプリカセットに接続する場合、 C++ドライバーは負荷分散を使用して読み取りおよび書込みリクエストを処理します。負荷分散により、ドライバーはこれらのリクエストを複数のサーバーに分散できるため、1 つのサーバーが過負荷になるのを回避し、最適なパフォーマンスを確保します。
シャーディングされたクラスターに接続する場合、 C++ドライバーは、ネットワークmongos ラウンド トリップ時間が最も短いインスタンスを計算し、最も近い インスタンスを決定します。次に、ドライバーはこのmongos の平均ラウンドトリップ時間を localThresholdMS 値に追加してレイテンシウィンドウを決定します。ドライバーは、レイテンシウィンドウ内の最大 2 つのランダムな インスタンスにわたってリクエストを分散します。ドライバーはリクエストごとに、mongos operationCount値を決定し、操作負荷の低いサーバーを選択します。
レプリカセットに接続すると、 C++ドライバーはまず、読み込み設定 (read preference)に従ってレプリカセットメンバーを選択します。その後、ドライバーは前のセクションで説明したのと同じプロセスに従います。レイテンシウィンドウを計算した後、ドライバーはウィンドウ内にあるランダムなレプリカセットメンバーを最大 2 つ選択し、operationCount 値が低いメンバーを選択してリクエストを受信します。
Tip
負荷分散の詳細については、 MongoDB Serverマニュアルのシャードクラスタのバランサーを参照してください。
LocalThreshold
C++ドライバーは、ローカルしきい値を使用して、サーバー選択のレイテンシウィンドウを計算します。この値により、読み取りリクエストと書込みリクエストを受信する資格のあるサーバーが決まります。
デフォルトでは 、ドライバーは 個のサーバーからping時間が 15 ミリ秒以内である mongos インスタンスまたはレプリカセットメンバーのみを使用します。レイテンシが高いサーバー間で読み取りを分散するには、接続 URI で localThreshold パラメータを設定します。
注意
単一のmongos インスタンスからレプリカセットメンバーを選択する場合、 C++ドライバーはlocalThresholdMS オプションを無視します。この場合は、 localThreshold コマンドライン オプション を使用します。
次の例ではレプリカセットに接続し、35 ミリ秒のローカルしきい値を指定します。
mongocxx::uri uri{"mongodb://localhost:27017/?replicaSet=repl0&localThresholdMS=35"}; mongocxx::client client{uri};
前の例では、 C++ドライバーは、最も近いメンバーのping時間の 35 ミリ秒以内に、一致するメンバーに読み取りを分散します。
照合
コレクションに対して読み取り操作および書き込み (write) 操作を実行するときに、照合を指定できます。
照合は、大文字と小文字やアクセント記号など、string を比較するための言語固有のルールのセットです。
照合を指定するには、オプションオブジェクトの collation() メソッドに照合定義を渡し、このオプションオブジェクトを読み取りまたは書込み操作に渡します。
照合の例
以下のドキュメントを持つコレクションを考えてみましょう。
{ _id: 1, category: "café" }, { _id: 2, category: "cafe" }, { _id: 3, category: "cafE" }
次の例では、ロケールのロケールを指定し、大文字と小文字と文字の違いを無視する照合を作成しています。次に、この照合を使用して、categoryフィールド値が "cafe" と一致するドキュメントを検索します。指定された照合により、クエリは 3 つのドキュメントすべてを返します。
mongocxx::options::find opts{}; opts.collation(bsoncxx::from_json(R"({"locale": "fr", "strength": 1})")); auto cursor = collection.find(make_document(kvp("category", "cafe")), opts); for(auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id": { "$oid" : "1" }, "category": "café" } { "_id": { "$oid" : "2" }, "category": "cafe" } { "_id": { "$oid" : "3" }, "category": "cafE" }
API ドキュメント
このガイドで説明するクラスやメソッドの詳細については、次のAPIドキュメントを参照してください。