レプリカセット タグセットの構成
レプリカセット ノードは、 tags
を使用して構成できます。
{ "<tag1>": "<string1>", "<tag2>": "<string2>",... }
読み取り操作では、 読み込み設定 ( read preference ) でタグセットを指定して、特定のタグを持つノードに読み取り操作を指示できます。
書込み (write) 操作では、 タグを使用してカスタムの書込み保証 ( write concern) を作成できます。
読み込み設定(read preference)でタグセットを使用する
レプリカセット メンバーがtags
に関連付けられている場合は、それらのメンバーをターゲットにするために読み込み設定( read preference )でタグセットを指定できます。 タグセットはドキュメントの配列であり、各ドキュメントにはタグと値のペアが含まれています。 一致が見つかるまで、指定は順番に試行されます。 見つかると、その仕様を使用して一致するすべてのノードを検索します。
注意
読み込み設定(read preference)モードprimary
を指定する場合、タグセットは指定できません。
たとえば、レプリカセット には次のレプリカセット構成があります(簡潔にするために一部のフィールドは省略されています)。
{ "_id" : "rs0", "version" : 1, "protocolVersion" : NumberLong(1), "writeConcernMajorityJournalDefault" : true, "members" : [ { "_id" : 0, "host" : "mongodb0.example.net:27017", ..., "tags": { }, ... }, { "_id" : 1, "host" : "mongodb1.example.net:27017", ..., "tags": { }, ... }, { "_id" : 2, "host" : "mongodb2.example.net:27017", ..., "tags": { }, ... } ], "settings" : { ... } }
メンバーに タグ を追加します。
mongosh
をレプリカセットに接続し、rs.reconfig()
を使用してメンバーにタグを追加します。conf = rs.conf(); conf.members[0].tags = { "dc": "east", "usage": "production" }; conf.members[1].tags = { "dc": "east", "usage": "reporting" }; conf.members[2].tags = { "dc": "west", "usage": "production" }; rs.reconfig(conf); レプリカセットの構成を確認します。
rs.conf()
を実行してレプリカセットの構成を確認します(簡潔にするために一部のフィールドは省略されています)。rs.conf()
は、次のようなドキュメントを返します。{ "_id" : "rs0", "version" : 2, "protocolVersion" : NumberLong(1), "writeConcernMajorityJournalDefault" : true, "members" : [ { "_id" : 0, "host" : "mongodb0.example.net:27017", ... "tags" : { "dc": "east", "usage": "production" }, ... }, { "_id" : 1, "host" : "mongodb1.example.net:27017", ... "tags" : { "dc": "east", "usage": "reporting" }, ... }, { "_id" : 2, "host" : "mongodb2.example.net:27017", ... "tags" : { "dc": "west", "usage": "production" }, ... } ], "settings" : { ... } } 読み込み設定(read preference)でタグセットを指定します。
特定のタグでタグ付けされたセカンダリに読み取り操作を指示するには、レプリカセットに接続された
mongo
shell で、readPref()
メソッドを使用して 読み込み設定( read preference )とタグセットを指定します。 たとえば、"dc": "east"
と"usage": "production"
の両方でタグ付けされたセカンダリに読み取り操作を指示するには、次のタグセットを含めます。db.collection.find({}).readPref( "secondary", [ { "dc": "east", "usage": "production" } ] ) "dc": "east"
でタグ付けされたセカンダリに読み取り操作を指示し、見つからない場合は"usage": "production"
タグのセカンダリに読み取り操作を送信するには、次のタグセットを含めます。db.collection.find({}).readPref( "secondary", [ { "dc": "east"}, { "usage": "production" } ] )
カスタムマルチデータセンター書込み保証 (write concern)
レプリカセット メンバーがtags
に関連付けられている場合は、レプリカセットのsettings.getLastErrorModes
設定を構成してカスタムの書込み保証 (write concern) を作成できます。
以下の 2 つのデータセンターにノードを含む 5 つのノードからなるレプリカセットがあるとします。
VA
がdc_va
とタグ付けした施設CA
がdc_ca
とタグ付けした施設
{ "_id" : "rs0", "version" : 1, "protocolVersion" : NumberLong(1), "writeConcernMajorityJournalDefault" : true, "members" : [ { "_id" : 0, "host" : "mongodb0.example.net:27017", ..., "tags": { }, ... }, { "_id" : 1, "host" : "mongodb1.example.net:27017", ..., "tags": { }, ... }, { "_id" : 2, "host" : "mongodb2.example.net:27017", ..., "tags": { }, ... } { "_id" : 3, "host" : "mongodb3.example.net:27017", ..., "tags": { }, ... } { "_id" : 4, "host" : "mongodb4.example.net:27017", ..., "tags": { }, ... } ], "settings" : { ... } }
レプリカセット メンバーに タグ を追加します。
mongosh
をレプリカセットに接続し、rs.reconfig()
を使用してメンバーにタグを追加します。conf = rs.conf(); conf.members[0].tags = { "dc_va": "rack1"}; conf.members[1].tags = { "dc_va": "rack2"}; conf.members[2].tags = { "dc_ca": "rack1"}; conf.members[3].tags = { "dc_ca": "rack2"}; conf.members[4].tags = { "dc_va": "rack1"}; rs.reconfig(conf); カスタム書込み保証 (write concern) を作成します。
レプリカセット構成で、
settings.getLastErrorModes
設定でカスタム書込み保証を定義します。 たとえば、次の は、異なるdc_va
タグ値を持つ 2 つのノードと、任意のdc_ca
タグ値を持つ 1 つのノードに書き込みを伝播することを要求するカスタム書込み保証MultipleDC
を定義します。conf = rs.conf(); conf.settings = { getLastErrorModes: { MultipleDC : { "dc_va": 2, "dc_ca": 1 } } }; rs.reconfig(conf); 注意
同じ
"dc_va"
タグを持つ 2 つのノードに書込みが伝播される場合、MultipleDC
書込み保証は満たされません。 たとえば、書込み (write) がmembers[0]
とmembers[4]
にのみ伝達された場合、タグの値は同じ"rack1"
であるため、"dc_va": 2
は満たされません。カスタム書込み保証 (write concern) を使用します。
カスタム書込み保証を使用するには、次のように書込み保証内の
w
オプションに書込み保証名を渡します。db.collection.insertOne( { id: "xyz", status: "A" }, { writeConcern: { w: "MultipleDC" } } )