MongoDB を GCE で構築する
はじめに
今回は GCE (Google Compute Engine) で MongoDB を構築する方法をまとめます。
構築方法
MongoDB の公式 Docker イメージ を使用して、GCE の Container Optimized OS で VM インスタンスを構築する方法を紹介します。また、プライマリとセカンダリ2台の合計3台のレプリケーション構成で構築したいと思います。
VM インスタンス構築
Artifact Registry の Docker イメージから VM インスタンスを作成するので、まずは Dockerfile を用意します。Dockerfile には、使用するポートとタイムゾーンの設定、MongoDB 起動コマンドのみのシンプルな構成で OK です。プライマリもセカンダリも同じイメージを使用します。
FROM mongo:5.0.11
ENV TZ Asia/Tokyo
EXPOSE 27017
CMD ["mongod", "--replSet", "<replSetName>"]
レプリカセットの公式チュートリアルの手順①に記載されているように、レプリケーション構成にする場合は、起動コマンドに --replSet
オプションを付けてレプリカセット名を設定します。
VM インスタンスの設定はMongoDBの利用用途によって適した設定があるかと思いますが、今回は以下のような構成としました。
- データの永続化
Container Optimized OS の場合はインスタンスを停止するとデータが消えてしまいます。データをそのまま保持したい場合は、ホストディレクトリのマウントを設定します。MongoDB のデータは/data/db
ディレクトリに保存されているので、このディレクトリとホスト側の適当なディレクトリをマウントすれば良いです。 - ネットワーク インターフェース
今回はよりセキュアにするために、VM インスタンスに外部 IP アドレスを持たせない構成とします。その場合は、Cloud NAT を経由して外部と接続することになるので、VM インスタンスを作成するリージョンのゲートウェイを作成します。
Cloud Run のジョブや Cloud Functions から MongoDB にアクセスさせたい場合は、Cloud Run のネットワーキング設定でサーバーレス VPC アクセスコネクタを使用
を選び、Cloud Functions のネットワーク設定で VPC コネクタを指定する必要があります。
レプリケーション設定
VM インスタンスの構築が完了したら、公式チュートリアルの手順③の初期化を行います。こちらはコマンド1つで完了します。
プライマリにしたいインスタンスの mongodb コンテナ内に入り、以下のコマンドを実行してレプリカセットのメンバーを設定します。
mongo --eval 'rs.initiate({_id: "<replSetName>", members: [{ _id: 0, host: "db0.example.com:27017", "priority": 100 },{ _id: 1, host: "db1.example.com:27017", "priority": 10 },{ _id: 2, host: "db2.example.com", "priority": 0 }]})'
host
は IP アドレスではなく、ドメインを指定することが推奨されています。今回のように VM インスタンスが外部 IP アドレスを持たない場合は、VM インスタンスの内部 DNS を指定すると良いです。
また、特定のインスタンスを優先的にプライマリにしたい場合は、"priority"
に優先度を設定することができます。上記の例では "priority"
の値が最も高い _id: 0
のメンバーが優先的にプライマリに選ばれることになります。
特に優先度を設定する必要がない場合は、_id
と host
の指定だけで OK です。プライマリがどのインスタンスになっているかは、以下のコマンドで確認することができます。こちらのコマンドはセカンダリインスタンスで実行しても問題ありません。
mongo --eval 'rs.status()'
接続方法
GCE で構築した MongoDB への接続方法を紹介します。
MongoDB Compass で接続する
MongoDB 公式が提供している GUI の MongoDB Compass を予めダウンロードしておきます。内部 IP アドレスしか持たない VM インスタンスにアクセスするには、ローカル環境と GCE インスタンスに TCP トンネルを作成する必要があります。ローカルのターミナルで以下のコマンドを実行し、ローカルの 27017 番ポートと プライマリの VM インスタンスの 27017 番ポート間にトンネルを作成します。
gcloud beta compute start-iap-tunnel <instanceName> 27017 --local-host-port=localhost:27017 --project "<projectID>" --zone "<zoneName>"
Listening on port [27017].
というメッセージが表示されたら、MongoDB Compass を起動し、localhost の 27017 番ポートを指定すると接続できます。
アプリケーションから接続する
アプリケーションから接続する際の URI に、レプリケーション名、各メンバーのドメインとポートを記載するだけで、アプリケーション側でプライマリの判定をしなくても接続することができます。
mongodb://<User>:<Password>@db0.example.com:27017,db1.example.com:27017,db2.example.com:27017/?replicaSet=mongo-repl
参考:https://www.mongodb.com/docs/manual/reference/connection-string/#replica-set-option
まとめ
今回は MongoDB を GCE で構築する方法をまとめました。レプリケーションの設定はコマンド1つで完了するので、簡単に構築することができました。参考になれば幸いです。
Discussion