MongoDB on AWS Cloud その3:Upgrade to MongoDB 3.2

2016.10.06

こんにちは、菊池です。

今回はMongoDB on AWS 第3弾として、MongoDBの最新バージョンである3.2へのアップグレードを行います。

過去の記事:

MongoDB Ver 3.2

MongoDB Ver. 3.2 は2015年12月にリリースされた最新のメジャーバージョンです。1つ前の3.0から以下のような変更・機能追加があります。

MongoDB 3.2 リリースノート

  • ストレージエンジンとしてWiredTigerがデフォルトに
  • レプリカセットのフェイルオーバー高速化
  • Configサーバでのレプリカセット構成サポート
  • Read Concern(読み込み保証)のサポート
  • 部分Index
  • ドキュメントバリデーション
  • Aggregation Frameworkの拡張

また、有償のEnterprise版に限りますが、

  • In-Memoryストレージエンジンの追加(3.2.6以降)
  • WiredTigerで暗号化に対応

などがあります。2.6 -> 3.0 のWiredTigerのような大きな変更はありませんが、アプリケーション開発や運用管理においてより使いやすくなる機能が追加されています。

なお、2016/10/6時点の最新マイナーバージョンは 3.2.10 です。

環境・前提条件

環境は、前々回で紹介しました、テンプレートで構築されるクラスタ環境(1 Shard / 3 Node Reprication)です。

starting-mongo-aws-04

また、作業の前提として、MongoDB 3.0からのアップグレードとなります。2.6からアップグレードする際は、一度3.0にアップグレードしておく必要があります。

今回の環境は3.0系の最新である3.0.12が稼働しています。

Upgrade手順

それではUpgradeです。手順サマリは以下のようになります。

  1. Balancer停止
  2. Dataノードのローリングアップグレード
  3. Configサーバのローリングアップグレード
  4. mongosのアップグレード
  5. Balancer再開

シャーディングしていないレプリカセットのみの構成であれば、上記2の手順のみとなります。

Balancer停止

まずは事前作業として、シャーディング時にデータチャンクを移動させる働きを持つBalancerを停止します。mongosにログイン(今回の構成ではPrimaryノードで起動)し、sh.getBalancerState()でBalancerの状態確認、sh.stopBalancer()で停止します。

$ mongo
MongoDB shell version: 3.0.12
connecting to: test
mongos> sh.getBalancerState()
true
mongos> sh.stopBalancer()
Waiting for active hosts...
Waiting for the balancer lock...
Waiting again for active hosts after balancer is off...
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "balancer" })
mongos> sh.getBalancerState()
false
mongos>

Dataノードのローリングアップグレード

Dataノードの作業です。まずはPrimaryにログインし、状態を確認します。

$ mongo localhost:27018
MongoDB shell version: 3.0.12
connecting to: localhost:27018/test
s0-rs0:PRIMARY> db.version()
3.0.12
s0-rs0:PRIMARY> db.serverStatus().storageEngine
{ "name" : "mmapv1" }
s0-rs0:PRIMARY>

バージョンは3.0.12、ストレージエンジンはMMAPv1です。レプリカセットの状態も確認しておきます。

s0-rs0:PRIMARY> rs.status()
{
       	"set" : "s0-rs0",
       	"date" : ISODate("2016-10-06T01:32:08.692Z"),
       	"myState" : 1,
       	"members" : [
       		{
       			"_id" : 1,
       			"name" : "10.0.3.34:27018",
       			"health" : 1,
       			"state" : 2,
       			"stateStr" : "SECONDARY",
       			"uptime" : 2168,
       			"optime" : Timestamp(1475715427, 1),
       			"optimeDate" : ISODate("2016-10-06T00:57:07Z"),
       			"lastHeartbeat" : ISODate("2016-10-06T01:32:08.012Z"),
       			"lastHeartbeatRecv" : ISODate("2016-10-06T01:32:07.344Z"),
       			"pingMs" : 0,
       			"syncingTo" : "10.0.2.24:27018",
       			"configVersion" : 1
       		},
       		{
       			"_id" : 2,
       			"name" : "10.0.2.24:27018",
       			"health" : 1,
       			"state" : 1,
       			"stateStr" : "PRIMARY",
       			"uptime" : 2168,
       			"optime" : Timestamp(1475715427, 1),
       			"optimeDate" : ISODate("2016-10-06T00:57:07Z"),
       			"electionTime" : Timestamp(1475715363, 1),
       			"electionDate" : ISODate("2016-10-06T00:56:03Z"),
       			"configVersion" : 1,
       			"self" : true
       		},
       		{
       			"_id" : 3,
       			"name" : "10.0.4.172:27018",
       			"health" : 1,
       			"state" : 2,
       			"stateStr" : "SECONDARY",
       			"uptime" : 2069,
       			"optime" : Timestamp(1475715427, 1),
       			"optimeDate" : ISODate("2016-10-06T00:57:07Z"),
       			"lastHeartbeat" : ISODate("2016-10-06T01:32:08.392Z"),
       			"lastHeartbeatRecv" : ISODate("2016-10-06T01:32:07.823Z"),
       			"pingMs" : 2,
       			"syncingTo" : "10.0.2.24:27018",
       			"configVersion" : 1
       		}
       	],
       	"ok" : 1
}
s0-rs0:PRIMARY>

まずはSecondaryの2ノードをアップグレードします。Secondaryのどちらかにログインし、MongoDBのサーバサービスであるmongod0を停止します。

$ sudo service mongod0 stop
Stopping mongod:                                           [  OK  ]

インストールされているMongoDB関連のパッケージを確認します。

$ sudo yum list installed | grep mongo
mongodb-org.x86_64                3.0.12-1.amzn1                @mongodb-org-3.0
mongodb-org-mongos.x86_64         3.0.12-1.amzn1                @mongodb-org-3.0
mongodb-org-server.x86_64         3.0.12-1.amzn1                @mongodb-org-3.0
mongodb-org-shell.x86_64          3.0.12-1.amzn1                @mongodb-org-3.0
mongodb-org-tools.x86_64          3.0.12-1.amzn1                @mongodb-org-3.0

後から作業するmongosを除き、全てアンインストール。

$ sudo yum remove mongodb-org mongodb-org-server mongodb-org-shell mongodb-org-tools

MongoDB3.2をyumでインストールするため、/etc/yum.repos.d/mongodb-org-3.2.repoに以下を記述。

[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc

mongosを除く、server、shell、toolsをインストール。

$ sudo yum install mongodb-org-server mongodb-org-shell mongodb-org-tools

インストールできました。

$ sudo yum list installed | grep mongo
mongodb-org-mongos.x86_64         3.0.12-1.amzn1                @mongodb-org-3.0
mongodb-org-server.x86_64         3.2.10-1.amzn1                @mongodb-org-3.2
mongodb-org-shell.x86_64          3.2.10-1.amzn1                @mongodb-org-3.2
mongodb-org-tools.x86_64          3.2.10-1.amzn1                @mongodb-org-3.2

これで mongod0 の起動が可能ですが、このままだと旧バージョンで作成されたMMAPv1のデータファイルが残ったままです。Ver.3.2ではWiredTigerがデフォルトですが、/etc/mongod0.congdbPath:に記載のディレクトリにMMAPv1のデータファイルが残っていると、MMAPv1として起動します。WiredTigerとしたい場合には、dbPath:のディレクトリを変更するか、データファイルを一度削除します。

$ sudo rm -rf /data/s0-rs0/*

この状態で起動することで、他のレプリカセットからデータ同期を行う際に WiredTiger で再構築されます。

それではmongod0を起動します。

$ sudo service mongod0 start
Starting mongod:                                           [  OK  ]

DBに接続し、バージョンとストレージエンジンを確認します。

$ mongo localhost:27018
MongoDB shell version: 3.2.10
connecting to: localhost:27018/test
s0-rs0:SECONDARY> db.version()
3.2.10
s0-rs0:SECONDARY> db.serverStatus().storageEngine
{
       	"name" : "wiredTiger",
       	"supportsCommittedReads" : true,
       	"persistent" : true
}
s0-rs0:SECONDARY>

これで、バージョン:3.2.10ストレージエンジン:WiredTigerで起動しました。 ちなみに、MMAPv1のままで起動した場合には、db.serverStatus().storageEngineの出力は以下のようになります。

s0-rs0:SECONDARY> db.serverStatus().storageEngine
{ "name" : "mmapv1", "supportsCommittedReads" : false, "persistent" : true }
s0-rs0:SECONDARY>

これでDataノード1台のアップグレードが完了です。同じ手順で、もう一台のSecondaryノード、Primaryノードもバージョンアップを行います。

全てのレプリカセットメンバーのアップグレードが完了したら、レプリケーションプロトコルのバージョンアップを行います。Primaryノードにログインし、以下のコマンドを実行します。

s0-rs0:PRIMARY> cfg = rs.conf();
s0-rs0:PRIMARY> cfg.protocolVersion=1;
1
s0-rs0:PRIMARY> rs.reconfig(cfg);
{ "ok" : 1 }
s0-rs0:PRIMARY> 

以上でDataノードのアップグレードは完了です。

Configサーバのローリングアップグレード

次に、Configサーバのアップグレードです。基本的には上記Dataノードの手順を同じになりますが、以下の点に注意して下さい。

  • テンプレートから構築した構成の場合、設定ファイル/etc/mongod.confがアップグレード時に上書きされてしまいます。事前に退避し後で書き換えるようにして下さい。
  • Configサーバはレプリカセットになっていません(独立した3台のサーバ)。なので、データファイルを削除してしまうと起動後に自動で同期されません。そのまま残してMMAPv1で起動するか、作業前にエクスポートしアップグレード後にインポートする必要があります。本手順ではMMAPv1のままとします。

まずはConfigServer00にてmongodを停止します。

$ sudo service mongos stop
Stopping mongod:                                           [  OK  ]

設定ファイル/etc/mongod.confを退避します。

$ sudo cp -p /etc/mongod.conf ~/

インストール済みのパッケージを確認。

$ sudo yum list installed | grep mongo
mongodb-org.x86_64                3.0.12-1.amzn1                @mongodb-org-3.0
mongodb-org-mongos.x86_64         3.0.12-1.amzn1                @mongodb-org-3.0
mongodb-org-server.x86_64         3.0.12-1.amzn1                @mongodb-org-3.0
mongodb-org-shell.x86_64          3.0.12-1.amzn1                @mongodb-org-3.0
mongodb-org-tools.x86_64          3.0.12-1.amzn1                @mongodb-org-3.0

全てアンインストールします。Configサーバではmongosを起動していませんので、mongosも不要です。

$ sudo yum remove mongodb-org mongodb-org-mongos mongodb-org-server mongodb-org-shell mongodb-org-tools

yumで3.2をインストールするため、/etc/yum.repos.d/mongodb-org-3.2.repoに以下を記述。

[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc

Ver.3.2を一式インストールします。

$ sudo yum install mongodb-org mongodb-org-mongos mongodb-org-server mongodb-org-shell mongodb-org-tools

退避していたmongod.confを戻します。

$ sudo mv ~/mongod.conf /etc/mongod.conf

mongodを起動。

$ sudo service mongod start
Starting mongod:                                           [  OK  ]

Configサーバに接続し、バージョンを確認。

$ mongo localhost:27030
configsvr> db.version()
3.2.10
configsvr>

これで1台目のConfigサーバがアップグレードできました。続けて同じ手順で残り2台のConfigサーバをアップグレードします。

mongosのアップグレード

最後にmongosのアップグレードです。以下の点にご注意ください。

  • 必ずConfigサーバのアップグレード後に作業してください。mongosをConfigサーバより先にアップグレードすると、mongosが起動できなくなります

mongosが稼働するPrimary00で作業します。まずはmongosを停止します。

$ sudo service mongos stop
Stopping mongod:                                           [  OK  ]

mongosをアンインストール。

$ sudo yum remove mongodb-org-mongos

Ver.3.2のmongosをインストール(前述の作業で、作業対象ノードに/etc/yum.repos.d/mongodb-org-3.2.repoがある前提)

$ sudo yum install mongodb-org-mongos

インストールされたパッケージを確認します。

$ sudo yum list installed | grep mongo
mongodb-org.x86_64                3.2.10-1.amzn1                @mongodb-org-3.2
mongodb-org-mongos.x86_64         3.2.10-1.amzn1                @mongodb-org-3.2
mongodb-org-server.x86_64         3.2.10-1.amzn1                @mongodb-org-3.2
mongodb-org-shell.x86_64          3.2.10-1.amzn1                @mongodb-org-3.2
mongodb-org-tools.x86_64          3.2.10-1.amzn1                @mongodb-org-3.2

mongosを起動。

$ sudo service mongos start
Starting mongod:                                           [  OK  ]

mongosに接続し、シャードステータスを確認します。

$ mongo
MongoDB shell version: 3.2.10
connecting to: test
mongos>
mongos> sh.status()
--- Sharding Status ---
  sharding version: {
       	"_id" : 1,
       	"minCompatibleVersion" : 5,
       	"currentVersion" : 6,
       	"clusterId" : ObjectId("57f4aa7e3c227d2423e5fb0d")
  }
  shards:
       	{  "_id" : "s0-rs0",  "host" : "s0-rs0/10.0.2.24:27018,10.0.3.34:27018,10.0.4.172:27018" }
  active mongoses:
       	"3.2.10" : 1
  balancer:
       	Currently enabled:  no
       	Currently running:  no
       	Failed balancer rounds in last 5 attempts:  0
       	Migration Results for the last 24 hours:
       		No recent migrations
  databases:
       	{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
       	{  "_id" : "testDB",  "partitioned" : false,  "primary" : "s0-rs0" }
       	{  "_id" : "test",  "partitioned" : false,  "primary" : "s0-rs0" }
mongos>

以上でmongosのバージョンアップは完了です。

Balancer再開

作業開始時に停止したBalancerを再開します。

mongos> sh.getBalancerState()
false
mongos> sh.startBalancer()
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
mongos> sh.getBalancerState()
true
mongos>

これで全ての作業が完了です。MongoDB関連のコンポーネントが全て最新の3.2.12にアップゲレードされました。

まとめ

テンプレートから構築されたMongoDBを最新版にアップグレードする手順を紹介しました。

MongoDBは非常にシンプルな構造であることと、一部制限はあるもののクラスタ内で異なるバージョン/ストレージエンジンが混在できることで簡単なローリングアップグレードが可能になっています。

今回は3.0からのアップグレードということもあり、3.2からサポートされたConfigサーバのレプリカセットへの変更は行いませんでした。スタンドアロンのConfigサーバをレプリカセットへ移行する手順についても今後紹介していきたいと思います。

参考リンク