同じサーバー上のMongoDBレプリカセットとOpLog

インターネット経由のプライベートアクセスでMongoDBを構成する例。 この記事では、1つのサーバーで3つのレプリカセットを展開し、OpLogをアクティブ化する例を示します。 OpLogは、たとえばMeteorベースのアプリケーション( ロングポーリングを無効にするため)など、MongoDBの変更を監視( リッスン )する「リアクティブ」アプリケーションに必要です。


以下の例は単一サーバー内での作業に焦点を当てているという事実にもかかわらず、安定性の理由から、各レプリカセットメンバーを個別のサーバーに展開することをお勧めします。 これを行うには、 rs.initiate({/*...*/})メソッドrs.initiate({/*...*/})渡されるレプリカセットメンバーのアドレスを変更する必要があります。


レプリカセットメンバーの構成では、wiredTigerがデータベースエンジンとして使用されます 。このエンジンの利点については、 リリースノートを参照してください


定義:



MongoDB> = 3.1およびDebian> = 7の例を示します


  1. インストール手順の手順に従ってください。 インストールプロセス中に、 mongodbグループで構成されるmongodbシステムユーザーが自動的に作成されます。
  2. データベースファイルのディレクトリの権限を作成および指定します。
     $ mkdir -p /data/mongos/one /data/mongos/two /data/mongos/three $ chmod 755 /data $ chown -R mongodb:mongodb /data/mongos 
  3. MongoDB ログディレクトリ( logs )のアクセス許可を作成および指定します。
     $ mkdir -p /var/log/mongodb/one /var/log/mongodb/two /var/log/mongodb/three $ chown -R mongodb:mongodb /var/log/mongodb 
  4. mongodサービスを削除します。
     $ rm /etc/init.d/mongod 
  5. レプリカセットの最初のメンバー用の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 
  6. レプリカセットの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 
  7. レプリカセットの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 
  8. 共有認証キーを使用してファイルの権限を作成および指定します。このキーはレプリカセットのメンバーが相互に通信するために使用されます。
     $ openssl rand -base64 741 > /data/mongos/key $ chown mongodb:mongodb /data/mongos/key $ chmod 400 /data/mongos/key 
  9. 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 
  10. マシン( サーバー )を再起動します
  11. レプリカセットの構成を指定し、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) 
  12. root権限を持つadminユーザーを作成します(レプリカセットのPRIMARYメンバーにコマンドを入力してください)。
     // Mongo Shell: $ mongo --port 27017 use admin db.createUser({user:"admin", pwd:<password>, roles:[{role:"root", db:"admin"}]}) 
  13. --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 
  14. レプリカセットの各メンバーの共有認証キーへのパスを指定します。
     # nano /etc/mongod-one.conf # nano /etc/mongod-two.conf # nano /etc/mongod-three.conf security: keyFile: /data/mongos/key 
  15. マシン( サーバー )を再起動します
  16. アプリケーションデータベースの読み取りおよび書き込みreadWriteを持つユーザーを作成します(アプリケーションのコードで、このユーザーを使用してMongoDBにアクセスします )。
     // Mongo Shell: $ mongo -u "admin" -p <password> --authenticationDatabase "admin" use admin db.createUser({user:"appUser", pwd:<password>, roles:[{role:"readWrite", db:"appDB"}]}) 
  17. 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"}]}) 
  18. 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"]}) 
  19. すべてのユーザーが正しく作成されていることを確認します。
     // Mongo Shell: $ mongo -u "admin" -p <password> --authenticationDatabase "admin" use admin show users 

これ以降、MongoDBはサーバー( machine )のパブリックIPアドレス、およびループバックとローカルホストで使用可能になります。


接続文字列:





更新:


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); 

データベース接続文字列を更新します。



英語版



Source: https://habr.com/ru/post/J305380/


All Articles