MongoDB

Growiを導入するためにMongoDBが必要となったため、とりあえず最低限の設定までのメモ。

MongoDBは、ドキュメント志向の柔軟性の高いデータベースサーバで、基本的にJSON形式でデータを保持する。特徴的なのが、ログインして利用したいデータベースに移動(use <DB名>)してデータをストアした時点で、初めてデータベースが作成される点である。同様に、リレーショナルデータベースにおけるテーブルにあたるコレクションも、任意の名称を指定してストアした段階で新たに作成される。Gentoo Linuxではインストール直後はユーザ認証等が設定されておらず、誰でも接続して任意のデータベース、コレクションを作成できてしまう。テスト用には便利だが、本格運用には最低限ユーザ認証程度はしておきたい。

インストールと設定

インストール

> emerge -av mongodb

設定は、 mongodb.confいYAML形式で記述していく。とりあえずインストール直後の状態で起動すれば、最低限は動作する。設定ファイルを編集する前に、まず管理ユーザを作成する。

ユーザの作成は、mongoコマンドでデータベースに接続し、db.createUser()関数にJSON形式でパラメータを与えて行う。

> mongo

# admin データベースに移動
mongo > use admin
mongo > db.createUser({
          user: "admin",
          pwd: passwordPrompt(),
          roles: [
            { role: "root", db: "admin" },
            { role: "userAdmin", db: "admin" },
            { role: "userAdminAnyDatabase", db: "admin" }
          ]
        })

pwdにpasswordPrompt()関数を指定することで、コマンド実行時にパスワードプロンプトが表示される。roleについては、どのデータベースに対するものかを指定する。指定している「userAdmin」「userAdminAnyDatabase」は、adminデータベース自身、および他のすべてのデータベースのユーザ管理ができる権限。この権限を持っていても、データベースの内容を表示したり更新することはできない。管理用コマンドを実行するためには「root」ロールも必要なので追加。

mongoターミナルを抜けてmongodb.confファイルを編集し、ユーザ認証を有効かしてサーバを再起動する。

setParameter:
  enableLocalhostAuthBypass: false

security:
  authorization: enabled

「enableLocalhostAuthBypass」をtrueに設定すると、「最初の」ユーザを作成するまではローカルホストからの接続時に認証をバイパスする設定のようだ。ユーザを作成した後はtrueに設定しても認証はバイパスされない。念のためfalseに設定。認証を有効にするのは下段のsecurityのauthorizationパラメータ。

ユーザ作成

管理ユーザを作成し、認証を有効にしてもmongoコマンドで接続することはできる。しかし、認証が有効になっているのでデータのストアができない。認証は、コマンドの引数で指定するか、接続後にdb.autu()関数を利用する。

> mongo -u admin -p --authenticationDatabase admin

ユーザが所属するデータベースも指定しなければならない。上で作成した管理ユーザでログインする。ログイン後、growi用のユーザを作成する。

mongo > use growi
mongo > db.createUser({
          user: "growi",
          pwd: passwordPrompt(),
          roles: [
            { role: "readWrite", db: "growi" }
          ]
        })

この段階では「growi」データベースは存在しないが、growiデータベースに対するユーザは作成される。growiユーザで接続すると、growiデータベース以下で「read」と「write」を行うことができる。

ユーザは、adminデータベースのsystem.usersコレクションで管理されているようだ。

管理用のコマンドなど

基本的にコマンドで細かな管理を行うわけではないが、データを確認したりするのに有用なコマンド。

# データベースの一覧
mongo > show dbs

# コレクションの一覧
mongo > use <DB名>
mongo > show collections

# コレクション内のデータ確認
mongo > db.<コレクション名>.find()

# ユーザの一覧
mongo > use <DB名>
mongo > show users

権限がなくても、useでどのデータベースにも移動できるし、showコマンドも発行できるが、権限がなければエラーとなったり何も表示されない。user一覧は、useで接続したDBに登録されたユーザを表示する。