アプリケーションの開発が成功した後、MongoDBの作成に専念する前に、スムーズで効率的なフローを確保し、最適なパフォーマンスを実現するために、これらのクイックガイドラインを検討してください。
1)展開オプション
適切なハードウェアの選択
最適なパフォーマンスを得るには、HDDではなくSSDを使用することをお勧めします。ストレージがローカルかリモートかに注意し、それに応じて対策を講じる必要があります。ハードウェアの欠陥と回復スキームの保護にはRAIDを使用することをお勧めしますが、有害な障害に対する保護を提供しないため、RAIDに完全に依存しないでください。ディスク上での実行には、RAID-10は、他のRAIDレベルにはないパフォーマンスと可用性の点で最適です。適切なハードウェアは、パフォーマンスを最適化し、大きな障害を回避するためのアプリケーションの構成要素です。
クラウドホスティング
プレインストールされたMongoDBデータベースホストを提供するさまざまなクラウドベンダーが利用可能です。最良の選択の選択は、アプリケーションが成長し、ターゲット市場で第一印象を与えるための設立ステップです。 MongoDB Atlasは、ノードのデプロイやAmazon S3に保存されているデータのスナップショットなどの機能を備えた、クラウドインターフェイスの完全なソリューションを提供する可能な選択肢の1つです。 ClusterControlは、展開とスケーリングを容易にするためのもう1つの優れたオプションです。これは、ノードの簡単な追加と削除、インスタンスのサイズ変更、本番クラスターのクローン作成などのさまざまな機能を提供します。ここで無料でClusterControlを試すことができます。その他の利用可能なオプションは、RackSpaceObjectRocketとMongoStitchです。
2)RAM
頻繁にアクセスされるアイテムはRAMにキャッシュされるため、MongoDBは最適な応答時間を提供できます。 RAMは通常、保存するデータの量、コレクションの数、およびインデックスによって異なります。インデックスを収容するのに十分なRAMがあることを確認してください。そうしないと、本番環境でのアプリケーションのパフォーマンスに大きな影響を及ぼします。 RAMが多いほど、ページフォールトが少なくなり、応答時間が長くなります。
3)インデックス作成
慢性的な書き込み要求を含むアプリケーションの場合、インデックス作成は不可欠な役割を果たします。 MongoDBドキュメントによると:
「書き込み操作でインデックス付きフィールドが変更された場合、MongoDBは変更されたフィールドをキーとして持つすべてのインデックスを更新します」
したがって、DBのパフォーマンスに影響を与える可能性があるため、インデックスを選択する際は注意が必要です。
インデックス作成の例:レストランデータベースのサンプルエントリ
{
"address": {
"building": "701",
"street": "Harley street",
"zipcode": "71000"
},
"cuisine": "Bakery",
"grades": [
{ "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
{ "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
{ "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
{ "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
{ "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
],
"name": "Bombay Bakery",
"restaurant_id": "187521"
}
-
単一フィールドでのインデックスの作成
> db.restaurants.createIndex( { "cuisine": 1 } ); { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
上記の例では、料理の分野で昇順のインデックスが作成されています。
-
複数のフィールドにインデックスを作成する
> db.restaurants.createIndex( { "cuisine": 1 , "address.zipcode": -1 } ); { "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 }
ここでは、料理と郵便番号のフィールドに複合インデックスが作成されます。 -ve番号は、降順を定義します。
4)シャーディングの準備をする
MongoDBは、シャーディングと呼ばれるメカニズムを使用して、データを異なるマシンに分割します。大量のデータセットが予想される場合を除いて、最初にシャーディングを追加することはお勧めしません。応答時間に直接影響するため、データパターンに応じて、適切なシャーディングキーが必要なアプリケーションのパフォーマンスを維持することを忘れないでください。シャード間でのデータのバランシングは自動的に行われます。ただし、準備して適切な計画を立てることをお勧めします。したがって、アプリケーションが要求するときはいつでも統合できます。
5)OS構成のベストプラクティス
- XFSファイルシステム
- これは、非常にスケーラブルで高性能な64ビットジャーナリングファイルシステムです。 I / O操作をますます少なくすることで、I/Oパフォーマンスを向上させます。
- ファイル記述子の制限を設定します。
- 透過的な巨大ページとNonuniformAccessMemory(NUMA)を無効にします。
- デフォルトのTCPキープアライブ時間を300秒(Linuxの場合)および120秒(Azureの場合)に変更します。
デフォルトのキープアライブ時間を変更するには、これらのコマンドを試してください。
Linuxの場合
sudo sysctl -w net.ipv4.tcp_keepalive_time=<value>
Windowsの場合
このコマンドを管理者としてコマンドプロンプトに入力します。ここで、
reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ /t REG_DWORD /v KeepAliveTime /d <value>
6)レプリケーションを使用した高可用性の確保
レプリケーションなしで本番環境に移行すると、アプリの突然のダウン障害が発生する可能性があります。ノードに障害が発生した場合、レプリケーションが問題を処理します。アプリケーションのニーズに応じて、セカンダリMongoDBインスタンスの読み取り、書き込み操作を管理します。
複製するときは、次の点に注意してください。
- 高可用性を実現するには、レプリカセットを少なくとも3つのデータセンターにデプロイします。
- MongoDBインスタンスの投票数が0または1であることを確認してください。
- すべてのMongoDBインスタンス間の完全な双方向ネットワーク接続を確保します。
4つのローカルMongoDBインスタンスを使用してレプリカセットを作成する例:
-
4つのローカルMongoDBインスタンスを作成する
まず、データディレクトリを作成します
mkdir -p /data/m0 mkdir -p /data/m1 mkdir -p /data/m2 mkdir -p /data/m3
-
4つのローカルインスタンスを開始します
mongod --replSet cluster1 --port 27017 --dbpath /data/m0 mongod --replSet cluster2 --port 27018 --dbpath /data/m1 mongod --replSet cluster1 --port 27019 --dbpath /data/m2 mongod --replSet cluster1 --port 27020 --dbpath /data/m3
-
インスタンスをクラスターに追加して開始します
mongo myhost:34014 myConfig = {_id: ‘cluster1’, members: [ {_id: 0, host: ‘myhost1:27017’}, {_id: 1, host: ‘myhost2:27018’}, {_id: 2, host: ‘myhost3:27019’}, {_id: 3, host: ‘myhost4:27020’}] } rs.initiate(myConfig);
セキュリティ対策
7)安全なマシン
MongoDBをホストしているマシンの開いているポートは、さまざまな悪意のある攻撃に対して脆弱です。適切なセキュリティ構成の遅れにより、3万を超えるMongoDBデータベースがランサムウェア攻撃で侵害されました。本番環境に移行している間、MongoDBサーバーのパブリックポートを閉じます。ただし、SShの目的で1つのポートを開いたままにしておく必要があります。
MongoDBインスタンスでの認証の有効化:
-
お気に入りのエディターでmongod.confファイルを起動します。
-
これらの行を構成ファイルの最後に追加します。
security: authorization: enabled
-
これらの行を構成ファイルの最後に追加します。
service mongod restart
-
ステータスを確認する
service mongod status
外部アクセスの制限
mongod.confファイルをもう一度開いて、サーバーへのアクセスを制限するIPを設定します。
bind_ip=127.0.0.1
この行を追加すると、127.0.0を介してのみサーバーにアクセスできるようになります。 (これはローカルホストです)。バインドオプションで複数のIPを追加することもできます。
bind_ip=127.0.0.1,168.21.200.200
これは、ローカルホストとプライベートネットワークからアクセスできることを意味します。
8)パスワード保護
マシンにセキュリティレイヤーを追加するには、アクセス制御を有効にして認証を適用します。 MongoDBサーバーが外部からの接続を受け入れるように制限しているにもかかわらず、悪意のあるスクリプトがサーバーに侵入する可能性があります。したがって、データベースのユーザー名/パスワードを設定し、必要な権限を割り当てることを躊躇しないでください。アクセス制御を有効にすると、ユーザーは自分の役割によって決定されたアクションのみを実行できます。
ユーザーを作成し、特定の役割でデータベースアクセスを割り当てる手順は次のとおりです。
最初に、すべてのユーザーとデータベースを管理するためのユーザー(この場合はadmin)を作成し、次に1つのMongoDBデータベースインスタンスに対する読み取りと書き込みの権限のみを持つ特定のデータベース所有者を作成します。
データベースインスタンスの他のユーザーを管理するための管理者ユーザーを作成する
-
Mongoシェルを開き、管理データベースに切り替えます:
use admin
-
管理データベースのユーザーを作成する
db.createUser({ user: "admin", pwd: "admin_password", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
-
新しく作成されたユーザーを認証する
db.auth("admin", "admin_password")
-
特定のインスタンスユーザーの作成:
use database_1 db.createUser({ user: "user_1", pwd: "your_password", roles: [{ role: "dbOwner", db: "database_1" }] })
-
次に、ユーザーが正常に作成されたかどうかを確認します。
db.auth("user_1", "your_password") show collections
それでおしまい!これで、適切な認証を使用してデータベースインスタンスを正常に保護できました。同じ手順で、必要な数のユーザーを追加できます。
9)データの暗号化と保護
Wiredtigerをストレージエンジンとして使用している場合は、保存時の暗号化構成を使用してデータを暗号化できます。そうでない場合は、ファイルシステム、デバイス、または物理暗号化を使用して、ホストで暗号化を実行する必要があります。
10)展開を監視する
MongoDBの本番環境へのデプロイが完了したら、パフォーマンスアクティビティを追跡して、起こりうる初期の問題を防ぐ必要があります。本番環境でデータパフォーマンスを監視するために適応できるさまざまな戦略があります。
-
MongoDBには、インスタンスのパフォーマンスとアクティビティに関する統計を返すユーティリティが含まれています。ユーティリティは、問題を特定し、通常の操作を分析するために使用されます。
-
モンゴスタットを使用して、運用タイプの配置と容量計画を把握します。
-
レポートの追跡と読み取り/書き込みアクティビティには、mongotopをお勧めします。
mongotop 15
このコマンドは、15秒ごとに出力を返します。
ns total read write 2018-04-22T15:32:01-05:00
admin.system.roles 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
local.me 0ms 0ms 0ms
local.oplog.rs 0ms 0ms 0ms
local.replset.minvalid 0ms 0ms 0ms
local.startup_log 0ms 0ms 0ms
local.system.indexes 0ms 0ms 0ms
local.system.namespaces 0ms 0ms 0ms
local.system.replset 0ms 0ms 0ms
ns total read write 2018-04-22T15:32:16-05:00
admin.system.roles 0ms 0ms 0ms
admin.system.version 0ms 0ms 0ms
local.me 0ms 0ms 0ms
local.oplog.rs 0ms 0ms 0ms
local.replset.minvalid 0ms 0ms 0ms
local.startup_log 0ms 0ms 0ms
local.system.indexes 0ms 0ms 0ms
local.system.namespaces 0ms 0ms 0ms
local.system.replset 0ms 0ms 0ms
MongoDB Monitoring Service(MMS)は、MongoDBクラスターを監視し、本番環境のデプロイメントアクティビティを確認するのに便利なもう1つの利用可能なオプションです。
そしてもちろん、オープンソースデータベースの自動化および管理システムであるSevereninesによるClusterControlがあります。 ClusterControlは、自動化されたセキュリティ設定を使用してクラスターを簡単に展開できるようにし、壊れたノードの修復と回復、自動アップグレードなどを含む使いやすい管理自動化を提供することで、データベースのトラブルシューティングを容易にします。その(永久に無料の)Community Editionを使い始めることができます。これを使用すると、MongoDBをデプロイおよび監視したり、セットアップに固有の側面に監視作業を調整するためのカスタムアドバイザーを作成したりできます。こちらから無料でダウンロードしてください。