MongoDBプライマリシャード概要
01 プライマリシャードとは何ですか?
シャードクラスターの各データベースには、シャード化されていない現在のデータベース内のコレクションのデータを保持するプライマリシャードがあり、プライマリシャードとマスターノード(プライマリー)の間には関連性はありません。
プライマリシャードは mongos によって選択されます。新しいデータベースが作成されるたびに、mongos はクラスタから最も少ないデータを含むシャードを新しいデータベースのプライマリシャードとして選択するという事実に基づいています。具体的には以下のように選択されます。
listDatabaseコマンドで返されるtotalSizeフィールドを選択基準として選択します。以下のようになります。
mongos> db.adminCommand("listDatabases")
{
"databases" : [
{
xxxx
},
{
xxxx
},
{
xxxx
}
],
"totalSize" : 2842624,
"totalSizeMb" : 2,
"ok" : 1,
"operationTime" : Timestamp(1610982469, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1610982469, 1),
"signature" : {
"hash" : BinData(0,"knqdZrxpyGFdSi0gljxCQG4LJ9U="),
"keyId" : NumberLong("6894922308364795934")
}
}
}
データベースのプライマリスライスを手動で選択したい場合は、movePrimaryコマンドを使用します。プライマリスライスの移行処理には時間がかかるので、移行が完了するまでデータベースや対応するコレクションにはアクセスしないようにしましょう。移行処理はクラスタ全体の運用に影響を与える可能性があるため、このコマンドは一般に自発的に使用すべきではありません。どうしても使用したい場合は、ネットワーク負荷への影響を必ず考慮してください。
レプリカセットから変更した構成でシャードクラスターを展開した場合、レプリカセット上のそれらのデータベースのプライマリシャードは元のレプリカセットに残り、後から作成したデータベースのみが他のシャードにプライマリシャードを設定することができます。
02 マスターシャードを移行する方法
ここでは、movePrimaryコマンドを使用して、データベースのプライマリシャードを移行する方法を説明します。
まず、新しいデータベースのテストコレクションの現在のプライマリスライスがsharding_yeyzスライス上にあることを確認しましょう。以下のように、new.testのプライマリスライスです。
mongos> sh.status()
--- Sharding Status ---
shards:
{ "_id" : "sharding_yeyz", "host" : "sharding_yeyz/127.0.0.1:27018,127.0.0.1:27019,127.0.0.1:27020& quot;, "state" : 1, "tags" : [ "1_1000" ] }
{ "_id" : "sharding_yeyz1", "host" : "sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026& quot;, "state" : 1, "tags" : [ "1000_", "1000_2000" ] }
databases:
...
{ "_id" : "new", "primary" : "sharding_yeyz", "partitioned" : true, "version" : { "uuid" : { "1000_", "1000_2000" } databases: ... "uuid" : UUID("68c70c64-f732-4478-8851-06dad4b94d6b"), "lastMod" : 1 } }
new.test
shard key: { "number" : 1 }
unique: false
balancing: true
chunks:
sharding_yeyz 3
sharding_yeyz1 1
{ "number" : { "$minKey" : 1 } } -->> { "number" : 1 } on : sharding_yeyz Timestamp(2, 1)
{ "number" : 1 } -->> { "number" : 1000 } on : sharding_yeyz Timestamp(1, 2)
{ "number" : 1000 } -->> { "number" : 2000 } on : sharding_yeyz1 Timestamp(2, 0)
{ "number" : 2000 } -->> { "number" : { "$maxKey" : 1 } } on : sharding_yeyz Timestamp(1, 5)
tag: 1_1000 { "number" : 1 } -->> { "number" : 1000 }
tag: 1000_2000 { "number" : 1000 } -->> { "number" : 2000 }
次に、movePrimaryコマンドを使用します。これを使う前に、どのように実行されるかを知っておく必要があります。
1、まずクラスタメタデータのプライマリスライス情報を修正する
2. 次に、スライスを持たないすべてのコレクションを指定されたマスタースライスに移動させる
**mongos上でしか実行できません。
コマンドは次のように使用します。
db.adminCommand( { movePrimary: <databaseName>, to: <newPrimaryShard> } )
Example.
db.adminCommand( { movePrimary : "new", to : "sharding_yeyz1" } )
実行した後
db.adminCommand( { movePrimary : "new", to : "sharding_yeyz1" } )
その後、結果は以下のようになります。
mongos> sh.status()
--- Sharding Status ---
shards:
{ "_id" : "sharding_yeyz", "host" : "sharding_yeyz/127.0.0.1:27018,127.0.0.1:27019,127.0.0.1:27020& quot;, "state" : 1, "tags" : [ "1_1000" ] }
{ "_id" : "sharding_yeyz1", "host" : "sharding_yeyz1/127.0.0.1:27024,127.0.0.1:27025,127.0.0.1:27026& quot;, "state" : 1, "tags" : [ "1000_", "1000_2000" ] }
databases:
{ "_id" : "new", "primary" : "sharding_yeyz1", "partitioned" : true, "version" : { "uuid" : UUID("68c70c64-f732-4478-8851-06dad4b94d6b"), "lastMod" : 2 } }
new.test
shard key: { "number" : 1 }
unique: false
balancing: true
chunks:
sharding_yeyz 3
sharding_yeyz1 1
{ "number" : { "$minKey" : 1 } } -->> { "number" : 1 } on : sharding_yeyz Timestamp(2, 1)
{ "number" : 1 } -->> { "number" : 1000 } on : sharding_yeyz Timestamp(1, 2)
{ "number" : 1000 } -->> { "number" : 2000 } on : sharding_yeyz1 Timestamp(2, 0)
{ "number" : 2000 } -->> { "number" : { "$maxKey" : 1 } } on : sharding_yeyz Timestamp(1, 5)
tag: 1_1000 { "number" : 1 } -->> { "number" : 1000 }
tag: 1000_2000 { "number" : 1000 } -->> { "number" : 2000 }
ご覧の通り、メインスライスの移行が完了しました。
以上、MongoDBのプライマリシャードについてまとめました。MongoDBのプライマリシャードについての詳しい情報は、BinaryDevelopの他の関連記事にも注目してください。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン