Mongodb-replication
MongoDB-レプリケーション
レプリケーションは、複数のサーバー間でデータを同期するプロセスです。 レプリケーションは冗長性を提供し、異なるデータベースサーバー上のデータの複数のコピーによりデータの可用性を高めます。 レプリケーションは、単一サーバーの損失からデータベースを保護します。 レプリケーションを使用すると、ハードウェア障害やサービスの中断から回復することもできます。 データの追加コピーを使用して、災害復旧、レポート、またはバックアップ専用にすることができます。
複製する理由
- データを安全に保つために データの高可用性(24 7)
- 災害からの回復
- メンテナンスのためのダウンタイムなし(バックアップ、インデックスの再構築、圧縮など)
- 読み取りスケーリング(読み取り元の追加コピー)
- レプリカセットはアプリケーションに対して透過的です
MongoDBでのレプリケーションの仕組み
MongoDBは、レプリカセットを使用してレプリケーションを実現します。 レプリカセットは、同じデータセットをホストする mongod インスタンスのグループです。 レプリカでは、1つのノードがすべての書き込み操作を受け取るプライマリノードです。 セカンダリなどの他のすべてのインスタンスは、プライマリからの操作を適用して、同じデータセットを持つようにします。 レプリカセットには、プライマリノードを1つだけ含めることができます。
- レプリカセットは、2つ以上のノードのグループです(通常、最低3つのノードが必要です)。
- レプリカセットでは、1つのノードがプライマリノードで、残りのノードがセカンダリノードです。
- すべてのデータは、プライマリノードからセカンダリノードに複製されます。
- 自動フェールオーバーまたはメンテナンス時に、プライマリの選択が確立され、新しいプライマリノードが選択されます。
- 障害が発生したノードの回復後、レプリカセットに再び参加し、セカンダリノードとして機能します。
クライアントアプリケーションが常にプライマリノードと対話し、プライマリノードがデータをセカンダリノードに複製するMongoDBレプリケーションの典型的な図を示します。
レプリカセットの機能
- N個のノードのクラスター
- 任意の1つのノードをプライマリにすることができます
- すべての書き込み操作はプライマリに移動します
- 自動フェイルオーバー
- 自動回復
- プライマリーのコンセンサス選挙
レプリカセットをセットアップする
このチュートリアルでは、スタンドアロンMongoDBインスタンスをレプリカセットに変換します。 レプリカセットに変換するには、次の手順があります-
- MongoDBサーバーを実行中のシャットダウン。
- {ブランク}
- -replSetオプションを指定して、MongoDBサーバーを起動します。 以下は、--replSetの基本的な構文です-
mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"
例
mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
- ポート27017で、rs0という名前のmongodインスタンスを開始します。
- コマンドプロンプトを起動して、このmongodインスタンスに接続します。
- Mongoクライアントで、コマンド* rs.initiate()*を発行して、新しいレプリカセットを開始します。
- レプリカセットの構成を確認するには、* rs.conf()コマンドを発行します。 レプリカセットのステータスを確認するには、コマンド rs.status()*を発行します。
メンバーをレプリカセットに追加する
メンバーをレプリカセットに追加するには、複数のマシンでmongodインスタンスを起動します。 次に、mongoクライアントを起動し、コマンド* rs.add()*を発行します。
構文
- rs.add()*コマンドの基本的な構文は次のとおりです-
>rs.add(HOST_NAME:PORT)
例
mongodインスタンス名が mongod1.net で、ポート 27017 で実行されているとします。 このインスタンスをレプリカセットに追加するには、Mongoクライアントでコマンド* rs.add()*を発行します。
>rs.add("mongod1.net:27017")
>
プライマリノードに接続している場合にのみ、レプリカセットにmongodインスタンスを追加できます。 プライマリに接続しているかどうかを確認するには、mongoクライアントでコマンド* db.isMaster()*を発行します。