ひとりMongoDB University 12/25 - 起動中のレプリカセットへの調整
この記録は、アドベントカレンダー形式の、MongoDB Universityの学習コースの記録、25日目になります!
ただいまコース: M103[1]を進めています。Chapter2を1日3つぐらいずつ進めたい。
25日までに15stepが目標で、なんとか24日で15stepまでできた!
Chapter 2: Reconfiguring a Running Replica Set (動画)
- レプリカセットを構成して稼働中に、ノードやArbiterを追加する必要が出た場合
- 「上司がノードをもう一個増やしてね!って言ってきたよ」という感じ
- 当初はプライマリ1、セカンダリ2の構成
- セカンダリノード1つ追加、Arbiterノードも1つ追加
- 追加の手順
- レプリカセットの設定を記載してノードを起動
- Mongo shellでMasterから起動したノードをセカンダリとして追加する(コマンド経由)
※Arbiterノードはデータのレプリカは行わない。障害時にプライマリノードを選出する際に、投票権だけを持ったノード。
追加のセカンダリノードの設定
# node4.conf
storage:
dbPath: /var/mongodb/db/node4 # 同一ホスト内ならdbPathは分ましょう!
net:
bindIp: 192.168.103.100,localhost
port: 27014
systemLog:
destination: file
path: /var/mongodb/db/node4/mongod.log
logAppend: true
processManagement:
fork: true
replication:
replSetName: m103-example # replSetNameを指定すること!
追加のArbiterノードの設定
※基本的にはレプリカセットの設定とほぼ同じ。Arbiter特有の設定がない!!
storage:
dbPath: /var/mongodb/db/arbiter
net:
bindIp: 192.168.103.100,localhost
port: 28000
systemLog:
destination: file
path: /var/mongodb/db/arbiter/mongod.log
logAppend: true
processManagement:
fork: true
replication:
replSetName: m103-example # replSetNameを指定すること!
まずはどちらも同じように起動する。
mongod -f node4.conf
mongod -f arbiter.conf
そのあとで、rsコマンドでノードを追加するけれど、Arbiter用の別のコマンドで登録。
rs.add("m103:27014")
rs.addArb("m103:28000")
登録後、rs.isMaster() コマンドでレプリカセットを確認すると、hosts
ではなく’ arbiters
にエントリされているのがわかる。
- rs.addArb()
- https://docs.mongodb.com/manual/reference/method/rs.addArb/
- Adds a new arbiter to an existing replica set.
- Specifies the hostname and optionally the port number.
ノードが不要になった時
- 予算の関係でArbiterノードが保持できない、などの理由でノードを消したい場合は、以下のコマンドを使う。
// rs.remove()の引数はホスト:port
rs.remove("m103:28000")
まずレプリカセットのメンバーからノードを外し、その後にノードを停止する。(消す)
ノード数の調整(消さない場合)
プライマリノードを選出する(Voteの)ために、レプリカセットの合計ノード数は、プライマリも含めて奇数にするのが基本。
不要なノードは停止したり、Arbiterを使って調整するほかに、1台だけはVoteにも参加しないけどデータは同期させておきたい、といった場合にHiddenノードを設定できる。
上記だと、4ノード存在するとVoteの際に確定できないことがあるので、3ノードあれば良い。
1ノードを消すのではなく、Hiddenとして設定する。
ノードを起動させたままノードの役割だけを変更
-
https://docs.mongodb.com/manual/reference/method/rs.conf/index.html
- rs.conf()
- Returns a document that contains the current replica set configuration.
- ドキュメントセット(いわゆる設定情報を格納したテーブル、データのセット)を返します
- 設定変更をくわえたドキュメントを引数にして、rs.reconfig()で設定を更新します
- https://docs.mongodb.com/manual/reference/method/rs.reconfig/index.html
- このコマンドを実行する場合は、プライマリノードに接続して操作すること
// まず rs.conf() で設定オブジェクトを取得
cfg = rs.conf()
// hiddenノードにしたいメンバー(ここでは4番目のノード)の設定を調整します
cfg.members[3].votes = 0 // voteできないようにする
cfg.members[3].hidden = true // hiddenノードにする
cfg.members[3].priority = 0 // priorityを下げる(選出されない)
// 新しい設定にしたcfgオブジェクト(ドキュメントを引数にわたします)
// 全部まるっとわたすこと
// rs.reconfig(NewConfig)で適用
rs.reconfig(cfg)
Lecture Instructions
Note: In the video lecture, we used the old hostname "m103.mongodb.university" which has been changed to "m103" . We have updated all of the following commands accordingly.
このレッスンでは、"m103.mongodb.university"という名前で起動していたホストを、m103"にリネームした場合の対応を扱います。こういった場合は、以下の手順で設定を更新します。
Chapter 2: Reconfiguring a Running Replica Set (クイズ)
Problem
Which of the following is true about reconfiguring a replica set with rs.reconfig()?
こたえ
- It does not require any of the nodes to restarted.
- 設定変更の際は、ノードの再起動は必要ありません
- It does not require any of the configuration files to be updated.
- (設定はlocaldbにドキュメントとして登録されているので)設定ファイルは必要ありません
Chapter 2: Lab: Reconfigure a Replica Set (演習問題)
- 4ノードのレプリカセットを起動します (起動済みらしい)
- Connect to the replica set m103-repl and retrieve the configuration of the node localhost:27004. This is the node you will reconfigure.
-
m103-repl
というレプリカセットに接続します - ノード localhost:27004 の設定を取得します(このノードの設定を変更します)
-
- このノードをhiddenノードに設定します
- the number of votes should be 0
- the hidden field should be true
- the priority should be 0
- Reconfigure the replica set using your new configuration document.
- rs.reconfig() で設定を反映します
やってみる
mongodの起動の確認
接続
- To authenticate as m103-admin with password m103-pass
- プライマリは1番目 (port:27001)
bash-4.4# mongo --port 27001 -u m103-admin -p m103-pass
MongoDB shell version v4.0.5
connecting to: mongodb://127.0.0.1:27001/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("56114a80-b546-439a-8b6b-2ea1b565e3dc") }
MongoDB server version: 4.0.5
Welcome to the MongoDB shell.
For interactive help, type "help".
--- [ 略 ] ---
---
# プライマリに接続
m103-repl:PRIMARY>
プライマリかどうかの再確認
m103-repl:PRIMARY> result = rs.isMaster()
{
"hosts" : [
"localhost:27001",
"localhost:27002",
"localhost:27003",
"localhost:27004"
],
"setName" : "m103-repl",
"setVersion" : 4,
"ismaster" : true,
"secondary" : false,
"primary" : "localhost:27001",
"me" : "localhost:27001",
"electionId" : ObjectId("7fffffff0000000000000001"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1608902645, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2020-12-25T13:24:05Z"),
"majorityOpTime" : {
"ts" : Timestamp(1608902645, 1),
"t" : NumberLong(1)
},
"majorityWriteDate" : ISODate("2020-12-25T13:24:05Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 100000,
"localTime" : ISODate("2020-12-25T13:24:09.431Z"),
"logicalSessionTimeoutMinutes" : 30,
"minWireVersion" : 0,
"maxWireVersion" : 7,
"readOnly" : false,
"ok" : 1,
"operationTime" : Timestamp(1608902645, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1608902645, 1),
"signature" : {
"hash" : BinData(0,"8JoxzdJ/Yws500Lrum1cK2bbFPU="),
"keyId" : NumberLong("6910181674332454913")
}
}
}
m103-repl:PRIMARY> result.ismaster
true
m103-repl:PRIMARY> result.hosts
[
"localhost:27001",
"localhost:27002",
"localhost:27003",
"localhost:27004"
]
m103-repl:PRIMARY>
localhost:27004 の設定を取得
// プライマリノードで実行
m103-repl:PRIMARY> cfg = rs.conf()
// 対象のノードの確認
m103-repl:PRIMARY> cfg.members[3]
{
"_id" : 3,
"host" : "localhost:27004",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
設定を変更
- 以下の通りにする
- the number of votes should be 0
- the hidden field should be true
- the priority should be 0
//値を変更
m103-repl:PRIMARY> cfg.members[3].votes = 0
0
m103-repl:PRIMARY> cfg.members[3].hidden = true
true
m103-repl:PRIMARY> cfg.members[3].priority = 0
0
変更の適用
適用します
m103-repl:PRIMARY> rs.reconfig(cfg)
{
"ok" : 1,
"operationTime" : Timestamp(1608902993, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1608902993, 1),
"signature" : {
"hash" : BinData(0,"pyIjQfRcRjJLhabVY/SmAs42rhI="),
"keyId" : NumberLong("6910181674332454913")
}
}
}
テスト!
とおりました!!
今日の進捗
今日は3つすすみました!
最初の動画は8分程度でしたが、リファレンスを確認したり、コマンドをチェックしたり、英語を聞き取り直していたら1時間かかってしまいました...。
演習がスムーズに進んで何よりです。
この次からは、レプリカセットでのRead/Writeになります!
きょうのzenn
zennを利用してのアドベントカレンダー、なんとか25日まで終わりました!(途中外部に書いたものもあります)
- ひとりMongoDB University Advent Calendar 2020 on Adventar
サクサク書ける環境のおかげで、途中力尽きて動画を本当に「見た」だけの日もありましたが、なんとか続きました。ありがとうございました!!
-
M103: Basic Cluster Administration のコースになります。コースを開始すると、完了までの期限は2ヶ月以内です。 ↩︎
Discussion