AWS EC2にMongoDBインストールとレプリケーション設定


MongoDBインストールとレプリケーション設定について、簡易的な抜粋メモとして書いています。
詳細に関しては、記事の最後の参考サイトを確認するようにしてください。



# ◆ 今日やること

- MongoDBをEC2にインストール
- レプリケーションの設定と確認
    - 今回せっていするレプリケーションの形式は、以下の図の通り、「Primary with Secondary Members」です。


<img width="768" alt="mongorepl.png" src="https://qiita-image-store.s3.amazonaws.com/0/32215/05b25ef0-13b7-720d-05fc-5e38c096acf7.png">
引用元：[Replication — MongoDB Manual 3\.4](https://docs.mongodb.com/manual/replication/)

# ◆ バージョン

-  MongoDB 3.2
-  Linux 4.4.30-32.54.amzn1.x86_64 #1 SMP Thu Nov 10 15:52:05 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

# ◆ 実装編

### > EC2へのインストール

```bash
sudo yum update -y
```

```bash
sudo vim /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
```

```bash
sudo yum install -y mongodb-org
```

```bash
sudo service mongod start

sudo chkconfig mongod on
```

### > 設定周り

- WoredTigerストレージエンジンの主な設定
    - cacheSizeGB: システムメモリの６、７割
    - blockCompressor:デフォルトはsnappy（中間です）

```/etc/mongod.conf
# Where and how to store data.
storage:
  dbPath: /data
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
       cacheSizeGB: 1
       journalCompressor: snappy
    collectionConfig:
       blockCompressor: snappy
```


### > EBSボリュームをAttach

- EBSボリュームにmongoのデータを溜めるようにする。

[Amazon EBS ボリュームを使用できるようにする \- Amazon Elastic Compute Cloud](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-using-volumes.html)に従って、EBSボリュームをアタッチする


- パーミッションを変更するのを忘れないように。

```bash
sudo chown -R mongod:mongod /data
```

- /etc/mongod.conf

```/etc/mongod.conf
# Where and how to store data.
storage:
  dbPath: /data
```


### > レプリケーションの設定

MongoDBではマスターのことをプライマリ，スレーブのことをセカンダリと呼びます。
MongoDBのレプリケーションの最小構成は，3つのノードが必要です。

- ネットワークインターフェイスの設定で、レプリケーションを組むサーバのIPを記述しておくこと

レプリケーション設定前には、お互いに通信できることを確認しないといけません
[Troubleshoot Replica Sets — MongoDB Manual 3\.4](https://docs.mongodb.com/manual/tutorial/troubleshoot-replica-sets/#replica-set-troubleshooting-check-connection)

mongodb が listen するIPアドレスはデフォルトでは 127.0.0.1 に設定されており、ローカルからのみアクセスを許可するようになっています
mongod.conf の bind_ip に設定されたIPアドレスで listen するのでこれを変更することで外部からの接続を許可します
ここに 0.0.0.0 を設定すると全てのIPアドレスからの接続を許可します

```/etc/mongod.conf
# network interfaces
net:
  port: 27017
  bindIp: [127.0.0.1,10.1.52.111,10.1.51.227,10.1.51.68]


```

- レプリケーション名を決める
- Oplogのサイジングと設定サイズを決める


```/etc/mongod.conf
replication:
   oplogSizeMB: 500
   replSetName: testRepl
```

[第4回　MongoDBのレプリケーションを構築してみよう：MongoDBでゆるふわDB体験｜gihyo\.jp … 技術評論社](http://gihyo.jp/dev/serial/01/mongodb/0004?page=4)

> OplogはCapped Collectionなので，作成時以外にサイズ変更することができません。 デフォルトのOplogのサイズは「1GBまたは，ディスクの空き領域の5%」
> Staleを避けるために，Oplogのサイジングは非常に重要となります。
> Oplogのサイズは，mongodの初回起動時にoplogSizeオプションで変更可能です。
> Oplogの適切なサイズを見積もる方法のひとつに，本番を想定した書き込みテストを実施し，作成されたOplogのサイズを取得する方法があります。
> 1時間程度，本番想定と同程度の書き込みテストを行った後，以下のコマンドでレプリケーションの最新情報を取得します。

```
> db.getReplicationInfo()
```

> 1時間で作成されたOplogのサイズがわかれば，Oplogのサイジングの目安となります。
> 少なくとも8時間のセカンダリのダウンタイムに耐えられるようにしておくことが推奨されています。


- レプリケーションの設定

どれかのサーバに入って、以下のコマンドを実行

```
config = {
  _id : "testRepl",
  members : [
    { _id : 0, host : "10.1.51.227:27017" },
    { _id : 1, host : "10.1.51.68:27017" },
    { _id : 2, host : "10.1.52.111:27017"} ] }

rs.initiate(config)
```

- スレーブの読み取り専用動作設定

そのままだと、スレーブが読み取り専用としてアクセスできないので以下の設定を行っておく。

スレーブノードで、以下のコマンドを実行

```mongo
 db.getMongo().setSlaveOk()
```

- レプリケーションステータスの確認

```mongo
testRepl:PRIMARY> rs.status();
{
	"set" : "connobaRepl",
	"date" : ISODate("2017-01-12T07:03:05.556Z"),
	"myState" : 1,
	"term" : NumberLong(6),
	"heartbeatIntervalMillis" : NumberLong(2000),
	"members" : [
		{
			"_id" : 0,
			"name" : "10.1.51.227:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 100310,
			"optime" : {
				"ts" : Timestamp(1484182286, 1),
				"t" : NumberLong(6)
			},
			"optimeDate" : ISODate("2017-01-12T00:51:26Z"),
			"electionTime" : Timestamp(1484104344, 1),
			"electionDate" : ISODate("2017-01-11T03:12:24Z"),
			"configVersion" : 3,
			"self" : true
		},
		{
			"_id" : 1,
			"name" : "10.1.51.68:27017",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 100245,
			"optime" : {
				"ts" : Timestamp(1484182286, 1),
				"t" : NumberLong(6)
			},
			"optimeDate" : ISODate("2017-01-12T00:51:26Z"),
			"lastHeartbeat" : ISODate("2017-01-12T07:03:04.017Z"),
			"lastHeartbeatRecv" : ISODate("2017-01-12T07:03:04.020Z"),
			"pingMs" : NumberLong(0),
			"syncingTo" : "10.1.51.227:27017",
			"configVersion" : 3
		},
		{
			"_id" : 2,
			"name" : "10.1.52.47:27017",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 99751,
			"optime" : {
				"ts" : Timestamp(1484182286, 1),
				"t" : NumberLong(6)
			},
			"optimeDate" : ISODate("2017-01-12T00:51:26Z"),
			"lastHeartbeat" : ISODate("2017-01-12T07:03:05.025Z"),
			"lastHeartbeatRecv" : ISODate("2017-01-12T07:03:05.022Z"),
			"pingMs" : NumberLong(2),
			"syncingTo" : "10.1.51.227:27017",
			"configVersion" : 3
		}
	],
	"ok" : 1
}

```


### > mongoログインの時の警告メッセージを消す方法

- [mongoシェル起動時のwarningを消す](http://dev.classmethod.jp/server-side/db/mongodb-on-ec2/#toc-mongowarning)

```
[ec2-user@ip-10-1-52-47 ~]$ mongo
MongoDB shell version: 3.2.11
connecting to: test
Server has startup warnings:
2017-01-11T03:10:18.308+0000 I CONTROL  [initandlisten]
2017-01-11T03:10:18.308+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-01-11T03:10:18.308+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-01-11T03:10:18.308+0000 I CONTROL  [initandlisten]
testRepl:SECONDARY>
```


# ◆ 参考サイト

- [Install MongoDB Community Edition on Amazon Linux — MongoDB Manual 3\.4](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-amazon/)
- [\[Black Belt Online Seminar\] AWSで使うMongoDB](http://www.slideshare.net/AmazonWebServicesJapan/black-belt-online-seminar-awsmongodb)
- [mongoDBの公式おすすめ設定、mongodb\.conf、クエリチューニングなど](http://hivecolor.com/id/42)
- [MongoDBでゆるふわDB体験：連載｜gihyo\.jp … 技術評論社](http://gihyo.jp/dev/serial/01/mongodb)