インターネット経由のプライベートアクセスでMongoDBを構成する例。 この記事では、1つのサーバーで3つのレプリカセットを展開し、OpLogをアクティブ化する例を示します。 OpLogは、たとえばMeteorベースのアプリケーション( ロングポーリングを無効にするため)など、MongoDBの変更を監視( リッスン )する「リアクティブ」アプリケーションに必要です。
以下の例は単一サーバー内での作業に焦点を当てているという事実にもかかわらず、安定性の理由から、各レプリカセットメンバーを個別のサーバーに展開することをお勧めします。 これを行うには、 rs.initiate({/*...*/})
メソッドrs.initiate({/*...*/})
渡されるレプリカセットメンバーのアドレスを変更する必要があります。
レプリカセットメンバーの構成では、wiredTigerがデータベースエンジンとして使用されます 。このエンジンの利点については、 リリースノートを参照してください 。
定義:
- ユーザー
admin
-MongoDBのすべての機能とコマンドに対するフルアクセス権(root
)を持つユーザー。 -
appUser
アプリケーションデータベースに対してのみ制限された読み取りおよび書き込みreadWrite
(readWrite
)を持つユーザー。 -
appDB
アプリケーションに使用されるデータベース。 - ユーザー
oplogger
local
データベース(OpLogが保存されているデータベース)に対する読み取り権限を持つユーザー。 -
oplogger
ロール-local
データベースの読み取り権限を持つロール。 -
<password>
-このプレースホルダーはパスワードに置き換える必要があります。 常に二重引用符で示されます 。
MongoDB> = 3.1およびDebian> = 7の例を示します
- インストール手順の手順に従ってください。 インストールプロセス中に、
mongodb
グループで構成されるmongodb
システムユーザーが自動的に作成されます。 - データベースファイルのディレクトリの権限を作成および指定します。
$ mkdir -p /data/mongos/one /data/mongos/two /data/mongos/three $ chmod 755 /data $ chown -R mongodb:mongodb /data/mongos
- MongoDB ログディレクトリ( logs )のアクセス許可を作成および指定します。
$ mkdir -p /var/log/mongodb/one /var/log/mongodb/two /var/log/mongodb/three $ chown -R mongodb:mongodb /var/log/mongodb
-
mongod
サービスを削除します。
$ rm /etc/init.d/mongod
- レプリカセットの最初のメンバー用のMongoDB構成ファイルを作成します(
nano /etc/mongod-one.conf
):
storage: dbPath: /data/mongos/one journal: enabled: true engine: wiredTiger systemLog: verbosity: 0 traceAllExceptions: false destination: file logAppend: true path: /var/log/mongodb/one/mongod.log net: port: 27017 bindIp: 0.0.0.0 operationProfiling: slowOpThresholdMs: 2100 mode: off replication: replSetName: rs0
- レプリカセットの2番目のメンバー(
nano /etc/mongod-two.conf
)のMongoDB構成ファイルを作成します。
storage: dbPath: /data/mongos/two journal: enabled: true engine: wiredTiger systemLog: verbosity: 0 traceAllExceptions: false destination: file logAppend: true path: /var/log/mongodb/two/mongod.log net: port: 27018 bindIp: 0.0.0.0 operationProfiling: slowOpThresholdMs: 2100 mode: off replication: replSetName: rs0
- レプリカセットの3番目のメンバー(
nano /etc/mongod-three.conf
)のMongoDB構成ファイルを作成します。
storage: dbPath: /data/mongos/three journal: enabled: true engine: wiredTiger systemLog: verbosity: 0 traceAllExceptions: false destination: file logAppend: true path: /var/log/mongodb/three/mongod.log net: port: 27019 bindIp: 0.0.0.0 operationProfiling: slowOpThresholdMs: 2100 mode: off replication: replSetName: rs0
- 共有認証キーを使用してファイルの権限を作成および指定します。このキーはレプリカセットのメンバーが相互に通信するために使用されます。
$ openssl rand -base64 741 > /data/mongos/key $ chown mongodb:mongodb /data/mongos/key $ chmod 400 /data/mongos/key
- MongoDBを
mongodb
として実行するためのcronファイルを作成します(crontab -u mongodb -e
):
@reboot /usr/bin/mongod --config /etc/mongod-one.conf --fork @reboot /usr/bin/mongod --config /etc/mongod-two.conf --fork @reboot /usr/bin/mongod --config /etc/mongod-three.conf --fork
- マシン( サーバー )を再起動します
- レプリカセットの構成を指定し、RSを開始します。
// Mongo Shell: $ mongo var conf = { "_id" : "rs0", "members" : [ { "_id" : 0, "host" : "127.0.0.1:27017" }, { "_id" : 1, "host" : "127.0.0.1:27018" }, { "_id" : 2, "host" : "127.0.0.1:27019" } ] } rs.initiate(conf)
-
root
権限を持つadmin
ユーザーを作成します(レプリカセットのPRIMARYメンバーにコマンドを入力してください)。
// Mongo Shell: $ mongo --port 27017 use admin db.createUser({user:"admin", pwd:<password>, roles:[{role:"root", db:"admin"}]})
-
--auth
フラグ(crontab -u mongodb -e
)を使用してMongoDBを実行するようにcronファイルを更新します。これにより、不正アクセスからMongoDBが閉じられます(信頼性の高い保護についてはMongoDB セキュリティの記事を参照してください )。
@reboot /usr/bin/mongod --config /etc/mongod-one.conf --auth --fork @reboot /usr/bin/mongod --config /etc/mongod-two.conf --auth --fork @reboot /usr/bin/mongod --config /etc/mongod-three.conf --auth --fork
- レプリカセットの各メンバーの共有認証キーへのパスを指定します。
# nano /etc/mongod-one.conf # nano /etc/mongod-two.conf # nano /etc/mongod-three.conf security: keyFile: /data/mongos/key
- マシン( サーバー )を再起動します
- アプリケーションデータベースの読み取りおよび書き込み
readWrite
を持つユーザーを作成します(アプリケーションのコードで、このユーザーを使用してMongoDBにアクセスします )。
// Mongo Shell: $ mongo -u "admin" -p <password> --authenticationDatabase "admin" use admin db.createUser({user:"appUser", pwd:<password>, roles:[{role:"readWrite", db:"appDB"}]})
-
oplogger
ロールを作成します。
// Mongo Shell: $ mongo -u "admin" -p <password> --authenticationDatabase "admin" use admin db.runCommand({createRole:"oplogger", privileges:[{resource: {db:"local", collection:"system.replset"}, actions: ["find"]}], roles:[{role:"read", db:"local"}]})
-
oplogger
ユーザーを作成し、oplogger
ロールを割り当てます。
// Mongo Shell: $ mongo -u "admin" -p <password> --authenticationDatabase "admin" use admin // MongoDB 2.4 db.createUser({user:"oplogger", pwd:<password>, roles:[], otherDBRoles:{local:["read"]}}) // MongoDB >= 2.6 db.createUser({user:"oplogger", pwd:<password>, roles:[{role: "read", db: "local"}]}) db.runCommand({grantRolesToUser:"oplogger", roles:["oplogger"]})
- すべてのユーザーが正しく作成されていることを確認します。
// Mongo Shell: $ mongo -u "admin" -p <password> --authenticationDatabase "admin" use admin show users
これ以降、MongoDBはサーバー( machine )のパブリックIPアドレス、およびループバックとローカルホストで使用可能になります。
接続文字列:
- アプリケーションの場合:
mongodb://appUser:<password>@<PUBLIC_IP>:27017,<PUBLIC_IP>:27018,<PUBLIC_IP>:27019/appDB?authSource=admin&replicaSet=rs0
- OpLogの場合:
mongodb://oplogger:<password>@<PUBLIC_IP>:27017,<PUBLIC_IP>:27018,<PUBLIC_IP>:27019/local?authSource=admin&replicaSet=rs0
更新:
mongodb@2.2.0( driver )以降、接続文字列とレプリカセットの構成の両方で同じIPアドレス/ドメイン名を使用する必要があります。 バグ#NODE-746を参照してください。
これらのドライバーの革新にはエラーが伴います。 no valid replicaset members found
no primary found in replicaset
。
新しい要件を満たすために-MongoDBが配置されているホスト( サーバー )にドメイン名を割り当てると、サブドメインも機能します。 ドメインmongo.example.com
を選択したとします。
MongoDBサーバーで、次を実行します。
// Mongo Shell: $ mongo var rsconf = rs.conf(); rsconf.members[0].host = 'mongo.example.com:27017'; rsconf.members[1].host = 'mongo.example.com:27018'; rsconf.members[2].host = 'mongo.example.com:27019'; rs.reconfig(rsconf);
データベース接続文字列を更新します。
- アプリケーションの場合:
mongodb://appUser:<password>@mongo.example.com:27017,mongo.example.com:27018,mongo.example.com:27019/appDB?authSource=admin&replicaSet=rs0
- OpLogの場合:
mongodb://oplogger:<password>@mongo.example.com:27017,mongo.example.com:27018,mongo.example.com:27019/local?authSource=admin&replicaSet=rs0