Docs Menu
Docs Home
/ / /
Scala ドライバー

レプリカセットに対する操作の構成

項目一覧

  • Overview
  • 読み取り設定と書込み設定の優先順位
  • 読み取り操作と書込み操作の設定
  • クライアント構成
  • トランザクション構成
  • データベース構成
  • コレクション構成
  • 高度な読み取り構成
  • タグセット
  • LocalThreshold
  • API ドキュメント

このガイドでは、書込み保証 (write concern)、読み取り保証 (read concern)、読み込み設定 (read preference)オプションを設定して、 Scalaドライバーがレプリカセットに対して作成、読み取り、アップデート、削除( CRUD )操作を実行する方法を変更する方法を学習できます。

次のレベルで、書込み保証、読み取り保証、読み込み設定(read preference)のオプションを設定できます。

  • クライアント(オーバーライドされない限り、すべての操作実行にデフォルトを設定します)

  • トランザクション

  • Database

  • コレクション

このリストは、オプション設定の優先順位の増加順も示しています。 例、トランザクションに読み取り保証 (read concern)レベルを設定すると、クライアントから継承された読み取り保証 (read concern)レベルが上書きされます。

書込み保証 (write concern) 、読み取り保証 (read concern)) 、読み込み設定 (read preference)オプションを使用すると、レプリカセット内のデータの因果整合性と可用性をカスタマイズできます。 これらのオプションの完全なリストについては、 MongoDB Serverマニュアルの次のガイドを参照してください。

  • 読み込み設定 (read preference)

  • 読み取り保証(read concern)

  • 書込み保証 (write concern)

読み込み設定(読み込み設定 (read preference)を設定することで、ドライバーがレプリカセットメンバー間で読み取り操作をルーティングする方法を制御できます。 また、読み取りおよび書込み保証を設定して、ドライバーがレプリカセットに対する読み取りおよび書込み操作の確認を待機する方法も制御できます。

次のセクションでは、さまざまなレベルでこれらの読み取りと書込み設定を構成する方法を示します。

この例では、 MongoClientSettingsインスタンスを コンストラクターに渡すことで、MongoClientインスタンスの読み込み設定(読み込み設定 (read preference)、読み取り保証 (read concern)、書込み保証 (write concern)を設定する方法を示しています。 このコードは、次の設定を構成します。

  • secondary 読み込み設定 (read preference): 読み取り操作は、 セカンダリレプリカセットメンバーからデータを取得します。

  • LOCAL 読み取り保証 (read concern) : 読み取り操作は、インスタンスの最新データを返しますが、そのデータがレプリカセットのノードの過半数に書き込まれたことを保証します。

  • W2 書込み保証 (write concern)) : プライマリレプリカセットノードと 1 つのセカンダリ ノードは、書込み (write)操作を確認する必要があります。

val mongoClient = MongoClient(MongoClientSettings.builder()
.applyConnectionString(ConnectionString("mongodb://localhost:27017/"))
.readPreference(ReadPreference.secondary())
.readConcern(ReadConcern.LOCAL)
.writeConcern(WriteConcern.W2)
.build())

あるいは、接続 URI で読み取り設定と書込み設定を指定することもできます。これはMongoClientコンストラクターにパラメーターとして渡されます。

val uriClient = MongoClient("mongodb://localhost:27017/?readPreference=secondary&w=2&readConcernLevel=local")

この例では、 TransactionOptionsインスタンスを startTransaction() メソッドに渡すことで、トランザクションの 読み込み設定(読み込み設定 (read preference)、読み取り保証 (read concern)、書込み保証 (write concern)を設定する方法を示しています。 トランザクションは セッション 内で実行されます。これは、順番に実行されるよう関連付けられた読み取り操作または書込み (write) 操作のグループです。トランザクションオプションを構成する前に、セッションを開始するための ClientSessionインスタンスを作成します。

Tip

セッションの詳細については、 MongoDB Serverマニュアルの「 サーバー セッション 」を参照してください。

この例では、次の設定を構成しています。

  • primary 読み込み設定 (read preference): 読み取り操作は、 プライマリレプリカセットメンバーからデータを取得します。

  • MAJORITY 読み取り保証 (read concern) : 読み取り操作は、レプリカセットノードの過半数に書き込まれたインスタンスの最新データを返します。

  • W1 書込み保証 (write concern)) : プライマリレプリカセットノードは書込み (write)操作を確認する必要があります。

val clientSessionFuture = mongoClient.startSession().toFuture()
val clientSession = Await.result(clientSessionFuture, Duration(10, TimeUnit.SECONDS))
val tOptions: TransactionOptions = TransactionOptions.builder()
.readPreference(ReadPreference.primary())
.readConcern(ReadConcern.MAJORITY)
.writeConcern(WriteConcern.W1)
.build()
clientSession.startTransaction(tOptions)

この例では、セッター メソッドを getDatabase() メソッドに連鎖させることで、test_database というデータベースの読み込み設定(読み込み設定 (read preference)、読み取り保証 (read concern)、書込み保証 (write concern)を設定する方法を示しています。 このコードは、次の設定を構成します。

  • primaryPreferred 読み込み設定 (read preference): 読み取り操作は、プライマリレプリカセットメンバーからデータを取得します。プライマリが使用できない場合は セカンダリ メンバーからデータが取得されます。

  • AVAILABLE 読み取り保証 (read concern) : 読み取り操作は、インスタンスの最新データを返しますが、そのデータがレプリカセットのノードの過半数に書き込まれたことを保証します。

  • MAJORITY 書込み保証 (write concern) ) : すべてのレプリカセットのノードの過半数が書込み (write)操作を確認する必要があります。

val database = mongoClient.getDatabase("test_database")
.withReadPreference(ReadPreference.primaryPreferred())
.withReadConcern(ReadConcern.AVAILABLE)
.withWriteConcern(WriteConcern.MAJORITY)

この例では、セッター メソッドを getCollection() メソッドに連鎖させることで、test_collection というコレクションの読み込み設定(読み込み設定 (read preference)、読み取り保証 (read concern)、書込み保証 (write concern)を設定する方法を示しています。 このコードは、次の設定を構成します。

  • secondaryPreferred 読み込み設定 (read preference): 読み取り操作は、セカンダリレプリカセットメンバーからデータを取得します。セカンダリ メンバーが使用できない場合は、プライマリ メンバーからデータが取得されます。

  • AVAILABLE 読み取り保証 (read concern) : 読み取り操作は、インスタンスの最新データを返しますが、そのデータがレプリカセットのノードの過半数に書き込まれたことを保証します。

  • UNACKNOWLEDGED 書込み保証 (write concern)) : レプリカセット ノードは書込み (write)操作を確認する必要はありません。

val collection = database.getCollection("test_collection")
.withReadPreference(ReadPreference.secondaryPreferred())
.withReadConcern(ReadConcern.AVAILABLE)
.withWriteConcern(WriteConcern.UNACKNOWLEDGED)

次のセクションでは、 Scalaドライバーがレプリカセットメンバーから読み取りを行う方法をさらにカスタマイズする方法について説明します。

MongoDB Serverでは、選択した任意の基準に従ってレプリカセットメンバーにキーと値のタグを適用できます。次に、それらのタグを使用して、1 つ以上のノードを 読み取り操作の対象にすることができます。

デフォルトでは 、 Scalaドライバーは、読み取り元ノードを選択するときに タグを無視します。 特定のタグを優先するようにScalaドライバーに指定するには、タグをリストとして 読み込み設定(読み込み設定 (read preference)セッター メソッドに渡します。

米国の複数のデータセンターでホストされているノードを含むレプリカセットに接続しているとします。 ドライバーが次の順序でセカンダリレプリカセットメンバーからの読み取りを優先するようにします。

  1. タグ付けされた ニューヨークデータセンターのメンバー ("dc", "ny")

  2. サンフランシスコデータセンターのメンバー( でタグ付け) ("dc", "sf")

  3. セカンダリ ノード

このコード例では、前述のレプリカセットメンバーを表すタグのリストを ReadPreference.secondary() セッター メソッドに渡します。 次に、コードは読み込み設定 (read preference)情報を withReadPreference() メソッドに渡して、データベースに読み取り順序を設定します。

val tag1 = new TagSet(new Tag("dc", "ny"))
val tag2 = new TagSet(new Tag("dc", "sf"))
val tag3 = new TagSet()
val readPreference = ReadPreference.secondary(List(tag1, tag2, tag3).asJava)
val database = mongoClient.getDatabase("test_database")
.withReadPreference(readPreference)

指定した読み込み設定 (read preference)とタグセットと一致するレプリカセットノードが複数ある場合、 Scalaドライバーは、 ping時間に応じて選択された、最も近いレプリカセットノードから読み取ります。

デフォルトでは 、ドライバーはping時間が最も近いメンバーの 15 ミリ秒以内であるメンバーのみをクエリに使用します。 より高いレイテンシを持つメンバーに読み取りを分散するには、MongoClientSettingsインスタンスで localThreshold オプションを設定するか、接続 URI で localThresholdMS オプションを設定します。

次の例では、 35 ミリ秒のローカルしきい値を指定します。 各アプローチに対応するコードを表示するには、MongoClientSettings または Connection URIタブを選択します。

val client = MongoClient(MongoClientSettings.builder()
.applyConnectionString(ConnectionString("mongodb://localhost:27017/"))
.applyToClusterSettings(builder => builder
.localThreshold(35, TimeUnit.MILLISECONDS)
)
.build())
val connectionString = "mongodb://localhost:27017/?replicaSet=repl0&localThresholdMS=35"
val client = MongoClient(connectionString)

前の例では、 Scalaドライバーは、最も近いメンバーのping時間の 35 ミリ秒以内に、一致するメンバーに読み取りを分散します。

注意

Scalaドライバーは、mongosインスタンスを介してレプリカセットと通信する場合、localThresholdMS オプションを無視します。 この場合は、 localThreshold コマンドライン オプション を使用します。

このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。

戻る

大きなファイルの保存