🎃

ひとりMongoDB University 12/25 - 起動中のレプリカセットへの調整

2020/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 にエントリされているのがわかる。

ノードが不要になった時

  • 予算の関係でArbiterノードが保持できない、などの理由でノードを消したい場合は、以下のコマンドを使う。
// rs.remove()の引数はホスト:port
rs.remove("m103:28000")

まずレプリカセットのメンバーからノードを外し、その後にノードを停止する。(消す)

ノード数の調整(消さない場合)

プライマリノードを選出する(Voteの)ために、レプリカセットの合計ノード数は、プライマリも含めて奇数にするのが基本。
不要なノードは停止したり、Arbiterを使って調整するほかに、1台だけはVoteにも参加しないけどデータは同期させておきたい、といった場合にHiddenノードを設定できる。

上記だと、4ノード存在するとVoteの際に確定できないことがあるので、3ノードあれば良い。
1ノードを消すのではなく、Hiddenとして設定する。

ノードを起動させたままノードの役割だけを変更

// まず 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日まで終わりました!(途中外部に書いたものもあります)

サクサク書ける環境のおかげで、途中力尽きて動画を本当に「見た」だけの日もありましたが、なんとか続きました。ありがとうございました!!

脚注
  1. M103: Basic Cluster Administration のコースになります。コースを開始すると、完了までの期限は2ヶ月以内です。 ↩︎

Discussion