オンラインの事故で、MongoDB の本質に気づきました


皆様こんにちは、Nezha と申します.最近プロジェクトで MongoDB を画像やドキュメントのストレージ データベースとして使用しています.MySQL に直接保存するのではなく、MongoDB クラスターをセットアップするのは面倒ですか?

一緒に見つけて、 MongoDB shardingの理論と実践を学び続け、クイックスタートを達成し、履歴書を充実させ、面接レベルを上げ、会話リソースを増やし、数秒で面接の専門家になりましょう.BAT は夢ではありません.

MongoDB は接続を拒否しますか? 明らかに、MongoDB サービスは再びダウンしています。

ここに画像の説明を挿入

MongoDB サーバーに接続して確認します。

ps -aef|grep mongomongoサービスがまだ存在するかどうかを確認することによって? 予想通り、それらはなくなりました。

ここに画像の説明を挿入

ほとんどの場合、ディスクがいっぱいであることが原因です。

df -THディスク容量を確認してください。

ここに画像の説明を挿入

ディスク 100% の問題を解決するにはどうすればよいですか?

cd でログ ディレクトリに移動し、rm -rf *すべてのログを削除してから、MongoDB を再起動します。

Mongodb 起動例外: 子プロセスを fork しようとしています。サーバーが接続できるようになるまで待機しています

ここに画像の説明を挿入

MongoDBはクラスターでデプロイされているので、起動時にデータ同期を行うため、時間がかかる場合があり、焦って我慢できず、Ctrl Cを押して強制停止し、再起動するだけです。

プロセスをps -aef|grep mongo見ると、2 つの同一のプロセスがリストされています。

ps -aef|grep mongo | grep -v grep | awk '{print $2}' | xargs kill -9すべてのmongoプロセスを強制的に停止します

ここに画像の説明を挿入

データ ディレクトリの mongod.lock および diagnostic.data ファイルを削除し、MongoDB を再起動して、スクリプト mongos_start.sh (mongod --config data/mongodb.conf) を開始します。これは完璧なソリューションです。

ここに画像の説明を挿入

MongoDB サーバーの配置ディレクトリの意味は何ですか? それらの間の関係は何ですか?以下では、MongoDB の断片化について簡単に紹介します。

ここに画像の説明を挿入

1.MongoDB シャーディングとは?

シャーディングとは、マシン間でデータを分割するプロセスを指し、パーティショニングとも呼ばれます。

MongoDB support manual partitioning. この方法を使用すると、アプリケーションは複数の異なるデータベース サーバーへの接続を維持し、各サーバーは完全に独立しています。アプリケーションは、さまざまなサーバー上のさまざまなデータのストレージを管理するだけでなく、適切なサーバー上のデータのクエリも管理します。しかし、クラスターにノードが追加または削除されたとき、またはデータ分散または負荷パターンの変化に直面したときに、維持することは困難です。

MongoDB は、アプリケーションからデータベース スキーマを抽象化し、システム管理を簡素化しようとする自動シャーディングをサポートしています。MongoDB はシャード間でデータのバランスを自動的にとるため、ノードの追加と削除が容易になります。

MongoDB のシャーディング メカニズムを使用すると、多くのシャードのクラスターを作成し、コレクション内のデータをクラスター全体に分散させて、データのサブセットを各シャードに配置できます。これにより、アプリケーションは、スタンドアロン サーバーまたはレプリカ セットのリソース制限を超えることができます。

シャードで構成されたクラスターは、アプリケーションにとってスタンドアロン サーバーのようなものです. シャーディングの前に mongos と呼ばれる 1 つ以上のルーティング プロセスが実行されます. Mongos は、各シャードに含まれるデータを指定する「ディレクトリ」を維持します. アプリケーションは、このルーティング サーバーに接続して、通常どおり要求を行うことができます。ルーティング サーバーは、どのデータがどのシャードにあるかを認識しており、要求を適切なシャードに転送できます。リクエストへのレスポンスがある場合、アプリケーションが単一の mongod に接続されていることを認識している限り、理由サーバーはそれらを収集してマージし、アプリケーションに返します。

ここに画像の説明を挿入

2.MongoDB はどのように断片化しますか?

1 台のマシンでクラスターをすばやくセットアップします。まず、--nodb--norcoptions mongo shell:で起動しますmongo --nodb --norc

ShardingTest クラスを使用してクラスターを作成します。次のコードを実行します。

st = ShardingTest({
    
    
	name:"one-min-shards",
	chunkSize:1,
	shards:2,
	rs:{
    
    
		nodes:3,
		oplogSize:10
	},
	other:{
    
    
		enableBalancer:true
	}
});
  • name: シャード クラスターのラベル。
  • shards: クラスターが 2 つのシャードで構成されることを指定します。
  • rs: 各シャードを 3 つのノードのレプリカ セットとして定義します。
  • enableBalancer: クラスターの起動後にバランサーを有効にします。

ShardingTest は、サーバー側のテスト スイートをサポートするように設計されており、リソースの使用を可能な限り低く保ち、比較的複雑なアーキテクチャでシャーディング クラスターを構築する際に非常に便利です。ShardingTest を実行すると、それぞれがレプリカ セットである 2 つのシャードを持つクラスターが作成されます。同時に、レプリカ セットが構成され、レプリケーション アグリーメントを確立するために必要なオプションを使用して各ノードが開始されます。クライアントがスタンドアロンのmongodと通信しているかのようにクラスターと対話できるように、シャード全体のリクエストを管理するためにmongosを開始します。最後に、クエリが正しいシャードに送信されるように正当化テーブルの信頼性を維持するために使用される構成サーバーの追加のレプリカ セットを開始します。

シャーディングの主な使用例は、ハードウェアとコストの制約に対処するため、またはアプリケーションのパフォーマンスを向上させるためにデータセットを分割することです。

ShardingTest がクラスターのセットアップを完了すると、接続できる 10 個のプロセスが起動して実行されます: 2 つのレプリカ セット (それぞれ 3 ノード)、構成サーバー レプリカ セット (3 ノード)、および mongos。デフォルトでは、これらのプロセスはポート 20000 で開始されます。mongos はポート 20009 で実行されます。

3. いつシャードするか?

通常、シャーディングは次の目的で使用されます。

  • 利用可能な RAM を増やします。
  • 利用可能なディスク容量を増やします。
  • サーバーの負荷を軽減します。
  • 単一の MongoDB では維持できないスループットを処理します。

ここに画像の説明を挿入

4.MongoDB シャード サーバーを構築する

1. サーバー構成プロセスを構成する

構成サーバーはクラスターの頭脳であり、各サーバーに含まれるデータに関するすべてのメタデータを保持するため、最初に構成サーバーを作成する必要があります。サーバーを構成することは非常に重要です。ランタイムはジャーナリングを有効にし、そのデータが非一時的なドライブに保存されるようにする必要があります。

mongod -f config.confmongos は構成サーバーから構成情報を抽出する必要があるため、構成サーバーは mongos プロセスの前に開始する必要があります。

構成サーバーに書き込む場合、MongoDB は「多数」の writeConcern レベル
を使用し、構成サーバーから読み取る場合、MongoDB は「多数」の readConcern レベルを使用します。

これにより、分割されたクラスターのメタデータは、ロールバックなしで構成サーバーのレプリカ セットにのみコミットされます。また、構成サーバーの障害の影響を受けないメタデータのみが読み取られるようにします。これにより、すべての mongos ルーティング ノードで、シャード クラスター内のデータの編成方法に一貫性が保たれます。

サーバー リソースに関しては、構成サーバーには十分なネットワーク リソースと CPU リソースが必要です. 構成サーバーはデータのディレクトリをクラスターに保存するだけなので、必要なハード ディスク ストレージ リソースはわずかです.

構成サーバーは重要であるため、構成サーバーのデータはクラスターのメンテナンスの前にバックアップする必要があります。

2.mongosプロセス

mongos はルーティング サーバーであり、アプリケーション接続に使用されます。ルーティングサーバーをmongod -f config.conf起動することで、mongos プロセスは設定サーバーのアドレスを知る必要があるため、config.conf に設定する必要がconfigdb=configReplSet/配置服务器的三个地址あり、logpath を設定することで MongoDB のログを保存できます。

特定の数の mongos プロセスを開始し、できるだけすべてのシャードの近くに配置する必要があります。これにより、クエリのパフォーマンスが向上します。

3. レプリカ セットをシャードに変換する

構成サーバーとルーティング サーバーを順番に起動した後、フラグメントを追加できます。以前にレプリカ セットが既に存在する場合、このレプリカ セットが最初のフラグメントになります。

MongoDB 3.4 以降、分割されたクラスターの場合、分割された mongod インスタンスは、config.conf に追加された --shardsvr オプションで構成する必要があります。shardsvr=trueレプリカ セットを分割に変換するプロセスでは、レプリカ セットの各メンバーが必要です。上記のアクションを繰り返します。

レプリカ セットをシャードとしてクラスターに追加した後、アプリケーションの接続をレプリカ セットから mongos ルーティング サーバーに変更し、ファイアウォールを設定してアプリケーションとシャード間の直接接続を切断することができます。

4. データの断片化

(1) データのシャーディング方法

テスト データベースがあり、名前キーでワーカー コレクションを分割するとします。

  1. 最初にデータベースを分割します> sh.enableSharding("test")
  2. 次に、コレクションを分割しsh.shardCollection("test.worker",{"name":1})ます。

ワーカー コレクションが既に存在する場合は、名前フィールドにインデックスが存在する必要があります。存在しない場合、shardCollection はエラーを返します。シャードされたコレクションが存在しない場合、mongos は名前のシャード キーにインデックスを自動的に作成します。

shardCollection コマンドはコレクションを複数のデータ ブロックに分割し、MongoDB はコレクション内のデータをクラスター内のシャードに均等に分散させます。

ここに画像の説明を挿入

5.MongoDB はクラスター データをどのように追跡しますか?

1.データブロック

MongoDB には膨大な量のデータがあるため、MongoDB は通常、ドキュメントをデータ ブロックの形式でグループ化します. これらのデータ ブロックは、スライス キーの指定された範囲内のドキュメントです. MongoDB は通常、より小さいテーブルを使用して、データ ブロックとシャード間の関係を維持します。 . マッピング関係。

注意が必要です:

  1. ブロックはオーバーラップできません。
  2. ブロック内のドキュメント数が多すぎる場合、自動的に 2 つのドキュメントに分割されます。
  3. ドキュメントは常に 1 つのブロックにのみ属します。

2.ブロック範囲

  1. 新しいフラグメントのコレクションには 1 つのブロックしかなく、ブロックの境界は負の無限大から正の無限大までです。
  2. チャンクが大きくなると、MongoDB はそれを負の無限大から値まで、および値から正の無限大までの 2 つのチャンクに自動的に分割します。範囲が小さいブロックには値より小さい値が含まれ、範囲が大きいブロックには値と値より大きい値が含まれます。

したがって、mongos はドキュメントがどのブロックにあるかを簡単に見つけることができます。

3. ブロックを分割する

各シャードのマスター ノード mongod プロセスは現在のブロックを追跡し、特定のしきい値に達すると、ブロックを分割する必要があるかどうかを確認し、分割する必要がある場合、mongod は構成サーバーからグローバル ブロック サイズの構成値を要求します。次に、構成サーバーでチャンク分割を実行し、メタデータを更新します。構成サーバーは、新しいチャンク ドキュメントを作成し、古いチャンクのスコープを変更します。

クライアントがブロックを書き込むと、mongod はそのブロックの分割しきい値をチェックします。

ここに画像の説明を挿入

分割のしきい値に達した場合、mongod はバランサーに要求を送信して最上位のチャンクを移行します。それ以外の場合、チャンクはシャードに残ります。

ここに画像の説明を挿入

同じシャード キーを持つ 2 つのドキュメントは同じチャンクにバインドされるため、分割は異なるシャード キー値を持つドキュメント間でのみ行うことができます。

以下の文書がreadTimeで断片化されていれば可能です。

ただし、本をより速く読み、1 か月以内にすべての本を読み終えると、readTime は同じになり、断片化はできなくなります。

したがって、シャーディング時に異なるシャード キー値を持つことが特に重要です。

{"name":"哪吒编程","book":"Java核心技术","readTime":"October"}
{"name":"哪吒编程","book":"Java编程思想","readTime":"October"}
{"name":"哪吒编程","book":"深入理解Java虚拟机","readTime":"October"}
{"name":"哪吒编程","book":"effective java","readTime":"November"}
{"name":"哪吒编程","book":"重构 改善既有代码的设计","readTime":"November"}
{"name":"哪吒编程","book":"高性能MySQL","readTime":"December"}
{"name":"哪吒编程","book":"Spring技术内幕","readTime":"December"}
{"name":"哪吒编程","book":"重学Java设计模式","readTime":"December"}
{"name":"哪吒编程","book":"深入理解高并发编程","readTime":"January"}
{"name":"哪吒编程","book":"Redis设计与实现","readTime":"January"}

シャーディングの前提条件は、すべての構成サーバーが稼働していて到達可能である必要があることです。mongod がブロックの書き込み要求を取得し続けると、そのブロックを分割しようとして失敗し続け、これらの分割試行により mongod の速度が低下します。mongod がシャード化を繰り返し試みて成功しないプロセスは、スプリット ストームと呼ばれます。

ここに画像の説明を挿入

6.イコライザー

バランサーはデータ移行を担当します。バランサーはシャード間の不均衡を定期的にチェックし、そうであれば、ブロックが移行されます。MongoDB 3.4+ では、バランサーは構成サーバーのレプリカ セットのプライマリ メンバーにあります。

バランサーは、各シャードのブロック数を監視する構成サーバー レプリカ セットのマスターのバックグラウンド プロセスです。バランサーは、シャード上のブロック数が特定の移行しきい値に達した場合にのみアクティブ化されます。


ここに画像の説明を挿入

Javaの学習ルートまとめ、ブリックムーバーがJavaアーキテクトを攻撃

100,000 語と 208 の Java クラシック インタビューの質問のまとめ (回答付き)

Java ベーシック チュートリアル シリーズ

Java 高並列プログラミング シリーズ

データベース アドバンスド コンバット シリーズ

おすすめ

転載: blog.csdn.net/guorui_java/article/details/128424399