スマートスタイル TECH BLOG

データベース&クラウド技術情報

はじめてのMongoDB

はじめに

この記事では、NoSQLのデータベースとして代表的なMongoDBの特徴と簡単な使い方を紹介したいと思います。

MongoDBの特徴

以下の公式マニュアルを読むと、MongoDB には以下のような特徴があります。

Key Features from "Introduction to MongoDB"

  • High Performance
    MongoDBはディスクI/Oを軽減するデータモデルに基づいており、高いパフォーマンスが期待できます。また、ドキュメント型や配列型のデータでもインデックスを活用することで高速処理が実現可能です。
     

  • Rich Query Language
    MongoDBには豊富なクエリ文法が用意されています。標準のSQL規格とは違いますが、基本的なREAD/WRITE処理(CRUD)を行うことができます。また、集合関数、全文検索、地理情報なども扱えます。

  • High Availability
    MySQLなどと同様にレプリケーション機能が実装されていて、可用性の面でも問題は無いと考えられます。自動フェイルオーバー機能も使えて、本番環境でも安心して使える印象があります。

  • Horizontal Scalability
    高負荷な環境に対応するため、MongoDBをスケールすることも可能です。特にデータをクラスタ内の各マシンに分散配置するシャーディング機能は大きいと思います。MongoDB 3.4からは、ゾーンという機能も追加され、より使いやすくなりました。

  • Support for Multiple Storage Engines
    MongoDBはストレージエンジンを選択することができるようですが、基本的には新しいWiredTigerで良いと思います。また、ストレージエンジン以外にもAPIなどの拡張も活発です。

MongoDBを使ってみる

「百聞は一見に如かず」ではないですが、やはり未知のソフトウェアを理解するには実際に動かしてみるのがベストだと私は思います。そこで、早速インストールから試してみましょう。

1. インストール・起動

まずはインストールするパッケージを選択します。様々なプログラム言語のエディションが用意されていますが、今回は「MongoDB Shell (mongo) Edition」を選択します。バージョンも今回は最新版とします。

次にプラットフォームを選択します。MongoDBがサポートするプラットフォームは以下のページに記載されています。今回は CentOS 7.3 を使用します。

https://docs.mongodb.com/manual/installation/#supported-platforms

ここからはインストールガイドの内容に沿って作業を進めていきます。

1-1. yumリポジトリの設定

今回は初めてなのでソースのビルドなどは避け、yumで手軽にインストールします。そのためにまずはMongoDBのyumリポジトリ(mongodb-org-3.4.repo)を設定します。

1-2. MongoDBのインストール

yumコマンドでMongoDB、および関連パッケージをまとめてインストールします。

1-3. SELinuxの設定変更

MongoDBが正常に動作できるようSELinuxの設定を変更する必要があります。今回は検証なので、SELinux自体を無効にしてしまいます。

1-4. MongoDBを起動・ログイン

MongoDBを起動します。その後ログインします。

2. データ操作

続けて、データ操作の基本となるクエリ(CRUD)を試してみたいと思います。ただ、その前にMongoDBのデータ形式について理解しておく必要があります。

例えば、MySQLでusersテーブルを作成し1件のレコードをINSERTする場合は、以下のようになると思います。

それに対して、MongoDBで同様の処理を行おうとすると、以下のようになります。

上記の2例を見比べると以下のような違いがあることに気が付きます。これがMongoDBの特徴である「スキーマレス」「ドキュメント型」の所以です。

  • CREATE TABLEをせず、いきなりデータのINSERTができる
  • カラムの定義が存在しない(文字列 or 数値 を自動判別)
  • Key-Value 形式で単純なデータ構造

それでは、MongoDBのデータ操作を実際に試してみましょう。ここでもマニュアルを参考にしながら進めていきます。

2-1. Create Operations

まずはデータを新規作成する操作です。上記の例のように、MySQLで言えば「CREATE」「INSERT」を一つにまとめたものとなります。

最もシンプルなものは、上で実行したVer 3.2 で追加された “db.collection.insertOne()”です。別のユーザも追加してみましょう。

スキーマレスなので、最初の John のレコードとは全く別のカラムだったり、配列データを入れても何も問題はありません。ユーザ登録の時に未入力の欄があったり、逆に想定とは違う内容が書いてあったりしてもエラーが出ずに対応できるため、これは便利そうですね。
なお、複数のデータを一度に作成したい場合は、db.collection.insertMany() を使うのが良さそうです。

2-2. Read Operations

MongoDBにはSELECT文がありません。データの読み込みは、db.collection.find() を使用します。ためしに格納した全データを読み取りしてみましょう。

limit条件を付けて、取得するレコード数を制限することもできます。

また、データの読み取りには絞り込み条件が重要です。MongoDBの場合は、以下のように指定します。例えば、年齢が25歳のデータを抽出してみましょう。

複数の絞り込み条件を指定する場合は、” , ” で併記します。
また値の範囲指定(>、<)を行う場合は、” $gt ” / ” $lt “(greater than / less than)を使用します。

このように既存データの構造を意識せずに、欲しい情報を簡単に抽出することができます。

2-3. Update Operations

次は更新処理です。使用できるコマンドは updateOne() / updateMany() / replaceOne() の3種類です。
試しに26歳以上の人物の年齢を「18歳」に変更してみましょう。

MongoDBの更新クエリは、最初に対象となるレコードの絞り込み条件を指定し、その後変更内容を記述します。その際、 $set 句を付ける必要があります。
「30歳」だった John が「18歳」に変更されているのが分かります。

2-4. Delete Operations

最後はDELETEです。こちらもシンプルに deleteOne() / deleteMany() で実行できます。
試しに John のレコードを削除してみましょう。

3. レプリケーション設定

MySQLではすっかりお馴染みのレプリケーション機能ですが、MongoDBでも同様の機能が実装されています。
もし本番環境で MongoDB を運用する場合は恐らく必須となる機能なので、実際にレプリケーション
環境を構築してみたいと思います。

今回は上記のマニュアルに記載されている「Primary 1台 / Secondly 2台」の構成を目指します。

3-1. 環境

先ほどまで使用していたサーバも含めて、以下の3台を使用します(全て vagrant で作成したものです)。

ホスト名 IPアドレス 役割
test-server 192.168.100.10 Primary
test-server2 192.168.100.20 Secondly-1
test-server3 192.168.100.30 Secondly-2

3-2. セカンダリのセットアップ

Deploy a Replica Set for Testing and Development

ここからは上記マニュアルの手順に則って進めていきます。まずは新しく追加した2サーバにMongoDB をインストールしましょう。

次にMongoDB設定ファイルを編集します。デフォルトでは /etc/mongod.conf に配置されています。
新たに追加する設定は以下の通りです。

  • bindIp: 0.0.0.0
    今回はテスト環境のため、0.0.0.0 を設定して全てのネットワークから接続を許可します。
  • replSetName: test-cluster
    レプリカセットの名称を指定します。

設定ファイルの中に「#replication:」セクションがあるので、そこに追記しましょう。なお、全ノード同じ変更内容で問題ありません。

編集後、MongoDBを再起動(or 起動)します。

3-3. PRIMARY から SECONDLY に接続

PRIMARYとなる server1 にログインして、レプリケーション設定を行います。

続けて server2 / server3 をグループに追加します。この時点で追加を行った server1 がPRIMARYで、それ以外が SECONDLY であると自動判別されます。

3-4. レプリケーションのステータスを確認

レプリケーションのステータスは、rs.status()コマンドで確認することができます。

3-5. フェイルオーバの挙動確認

PRIMARYである server1 の mongod を kill コマンドで強制終了して、フェイルオーバが適切に動作するかを確認します。

server2でステータスを確認すると、PRIMARYが server2 に切り替わっていることが分かります。

このため不慮の障害でサーバがダウンしても、SECONDLYを用意しておけばサービスを停止せずに MongoDB の利用が可能となります。

余談

この記事を書いている間に、 Percona Performance Blog で MongoDB の構成について取り上げられました。もし興味があればご覧になってみてください。

Common MongoDB Topologies

※ Percona社ではMongoDBのサポートも行っています
Percona Server for MongoDB

Return Top