ステータス:非推奨

この記事では、サポートされなくなったバージョンのUbuntuについて説明します。 現在Ubuntu12.04を実行しているサーバーを運用している場合は、サポートされているバージョンのUbuntuにアップグレードまたは移行することを強くお勧めします。

理由:
Ubuntu 12.04は2017年4月28日に保守終了(EOL)に達しました and no longer receives security patches or updates. This guide is no longer maintained.

代わりに参照してください:このガイドは参照として役立つ場合がありますが、他のUbuntuリリースでは機能しない場合があります。 可能な場合は、使用しているUbuntuのバージョン用に作成されたガイドを使用することを強くお勧めします。 ページ上部の検索機能を使用して、より新しいバージョンを見つけることができます。

序章


MongoDBは、非常に人気のあるNoSQLデータベースです。 多くの場合、アプリケーションデータとWebサイト情報を保存および管理するために使用されます。 MongoDBは、動的なスキーマ設計、簡単なスケーラビリティ、およびプログラムで簡単にアクセスできるデータ形式を誇っています。

このガイドでは、データの高可用性を確保し、堅牢なフェイルオーバーシステムを作成するために、データレプリケーションを設定する方法について説明します。 これは、データベースのダウンが組織やビジネスに悪影響を与える可能性がある本番環境では重要です。

システムにMongoDBがすでにインストールされていることを前提としています。 Ubuntu 12.04 にMongoDBをインストールする方法については、ここをクリックしてください。

MongoDBレプリケーションセットとは何ですか?


MongoDBは、「レプリケーションセット」と呼ばれる実装を通じてレプリケーションを処理します。 基本的な形式のレプリケーションセットは、マスタースレーブ構成のノードにいくぶん似ています。 単一のプライマリメンバーは、セカンダリメンバーに変更を適用するためのベースとして使用されます。

レプリケーションセットとマスタースレーブレプリケーションの違いは、プライマリメンバーが使用できなくなった場合に備えて、レプリケーションセットに固有の自動フェイルオーバーメカニズムがあることです。

  • プライマリメンバー:プライマリメンバーは、レプリケーションセットを使用するトランザクションのデフォルトのアクセスポイントです。 書き込み操作を受け入れることができる唯一のメンバーです。

    各レプリケーションセットは、一度に1つのプライマリメンバーのみを持つことができます。 これは、プライマリの「oplog」(操作ログ)をコピーし、セカンダリのデータセットで変更を繰り返すことによってレプリケーションが行われるためです。 書き込み操作を受け入れる複数のプライマリは、データの競合につながります。

  • セカンダリメンバー:レプリケーションセットには、複数のセカンダリメンバーを含めることができます。 二次メンバーは、oplogからの変更を自分のデータに複製します。

    デフォルトでは、アプリケーションは読み取り操作と書き込み操作の両方についてプライマリメンバーにクエリを実行しますが、1つ以上のセカンダリメンバーから読み取るようにセットアップを構成できます。 プライマリがオフラインになるか、ステップダウンすると、セカンダリメンバーがプライマリになることができます。

    注:データは非同期で転送されるため、セカンダリノードからの読み取りにより、古いデータが提供される可能性があります。 これがユースケースの懸念事項である場合は、この機能を有効にしないでください。

  • アービター:アービターは、実際のレプリケーションプロセスに参加しないレプリケーションセットのオプションのメンバーです。 これは複製セットに追加され、選挙でタイブレーカーとして機能するという1つの限定された機能のみに参加します。

    プライマリメンバーが使用できなくなった場合、セカンダリノード間で自動選択プロセスが実行され、新しいプライマリが選択されます。 セカンダリメンバープールに偶数のノードが含まれている場合、投票の行き詰まりのために新しいプライマリを選出できなくなる可能性があります。 決定が確実に達成されるように、これらの状況で仲裁人が投票します。

    レプリケーションセットにセカンダリメンバーが1つしかない場合は、アービターが必要です。

二次メンバーのカスタマイズオプション


すべてのセカンダリメンバーがレプリケーションセットの標準ルールに準拠することを望まない場合があります。 レプリケーションセットには最大12人のメンバーを含めることができ、選挙の状況では最大7人が投票します。

優先度0のレプリケーションメンバー


特定のセットメンバーをプライマリポジションに選出すると、アプリケーションのパフォーマンスに悪影響を与える可能性がある状況がいくつかあります。

たとえば、データをリモートデータセンターに複製する場合、または特定のメンバーのハードウェアがセットのメインアクセスポイントとして機能するのに不十分な場合、優先度0を設定すると、このメンバーがプライマリにならないようにすることができますが、データのコピーを続行できます。

非表示のレプリケーションメンバー


状況によっては、クライアントがアクセスおよび表示できるメンバーのメインセットを、目的が異なり干渉してはならないバックグラウンドメンバーから分離する必要があります。

たとえば、分析作業のベースとなるセカンダリメンバーが必要な場合があります。これは、最新のデータセットの恩恵を受けますが、作業メンバーに負担をかけることになります。 このメンバーを非表示に設定することにより、レプリケーションセットの一般的な操作に干渉することはありません。

非表示のメンバーは、プライマリメンバーにならないように、必ず優先度0に設定されますが、選挙では投票します。

遅延レプリケーションメンバー


セカンダリメンバーの遅延オプションを設定することにより、セカンダリがプライマリのoplogからコピーする各アクションの実行を待機する時間を制御できます。

これは、誤って削除されないように保護したり、破壊的な操作から回復したりする場合に便利です。 たとえば、セカンダリを半日遅らせた場合、セカンダリはそれ自体のデータセットに対して誤った操作をすぐに実行することはなく、変更を元に戻すために使用される可能性があります。

遅延メンバーはプライマリメンバーになることはできませんが、選挙に投票することはできます。 ほとんどの場合、プロセスが古いデータを読み取らないように、これらを非表示にする必要があります。

レプリケーションセットを構成する方法


レプリケーションセットを構成する方法を示すために、プライマリと2つのセカンダリを使用して単純なセットを構成します。 これは、フォローするために3つのVPSインスタンスが必要になることを意味します。 Ubuntu12.04マシンを使用します。

セットのメンバーとなる各マシンにMongoDBをインストールする必要があります。 このチュートリアルに従って、 Ubuntu12.04にMongoDBをインストールする方法を学ぶことができます。

3つのサーバーインスタンスすべてにMongoDBをインストールしたら、ドロップレットが相互に通信できるようにいくつかの設定を行う必要があります。

次の手順は、rootユーザーとしてログインしていることを前提としています。

DNS解決を設定する


MongoDBインスタンスが相互に効果的に通信するには、各メンバーの適切なホスト名を解決するようにマシンを構成する必要があります。 これを行うには、各レプリケーションメンバーのサブドメインを構成するか、各コンピューターで/etc/hostsファイルを編集します。

長期的にはサブドメインを使用する方がおそらく良いでしょうが、すぐに軌道に乗るために、hostsファイルを介してこれを行います。

間もなく複製される各メンバーで、/etc/hostsファイルを編集します。

nano /etc/hosts

ローカルホストを構成する最初の行の後に、レプリケーションセットの各メンバーのエントリを追加する必要があります。 これらのエントリは次の形式を取ります。

 IPアドレス mongohost0.example.com

セットのメンバーのIPアドレスは、DigitalOceanコントロールパネルで取得できます。 そのコンピューターのホスト名として選択する名前は任意ですが、わかりやすい名前にする必要があります。

この例では、/etc/hostsは次のようになります。

 127.0.0.1 localhost mongo0 123.456.789.111  mongo0.example.com  123.456.789.222  mongo1.example.com  123.456.789.333  mongo2.example.com

このファイルは、(ほとんど)セット内のすべてのホストで同じである必要があります。 各メンバーのファイルを保存して閉じます。

次に、これらの新しい変更を反映するようにドロップレットのホスト名を設定する必要があります。 各VPSのコマンドは、/etc/hostsファイルでその特定のマシンに付けた名前を反映します。 次のようなコマンドを各サーバーで発行する必要があります。

ホスト名mongo0.example.com

各サーバーでこのコマンドを変更して、選択した名前をファイルに反映させます。

/etc/hostnameファイルを編集して、これも反映します。

 nano / etc / hostname
  mongo0.example.com

これらの手順は、各ノードで実行する必要があります。

MongoDB構成ファイルでレプリケーションの準備をする


MongoDB構成を開始するために最初に行う必要があるのは、各サーバーでMongoDBプロセスを停止することです。

各サーバーで、次のように入力します。

service mongodb stop

次に、データの保存に使用するディレクトリを構成する必要があります。 次のコマンドでディレクトリを作成します。

mkdir /mongo-metadata

データディレクトリが作成されたので、新しいレプリケーションセット構成を反映するように構成ファイルを変更できます。

nano /etc/mongodb.conf

このファイルでは、いくつかのパラメータを指定する必要があります。 まず、dbpath変数を調整して、作成したディレクトリを指すようにします。

dbpath=/mongo-metadata

ポート番号指定の前からコメントを削除して、デフォルトのポートで開始されるようにします。

port = 27017

ファイルの下部に向かって、replSetパラメーターの前にあるコメントフォームを削除します。 この変数の値を、わかりやすい値に変更してください。

replSet = rs0

最後に、サーバーインスタンスを生成した後にシェルを使用できるように、プロセスフォークを作成する必要があります。 これをファイルの最後に追加します。

fork = true

ファイルを保存して閉じます。 次のコマンドを発行して、レプリケーションメンバーを開始します。

mongod --config /etc/mongodb.conf

これらの手順は、レプリケーションセットの各メンバーで繰り返す必要があります。

レプリケーションセットを開始し、メンバーを追加します


レプリケーションセットの各メンバーを構成し、各マシンでmongodプロセスを開始したので、レプリケーションを開始して各メンバーを追加できます。

メンバーの1人に、次のように入力します。

mongo

これにより、現在のメンバーのMongoDBプロンプトが表示されます。

次のように入力して、レプリケーションセットを開始します。

rs.initiate()

これにより、レプリケーションセットが開始され、現在接続しているサーバーがセットの最初のメンバーとして追加されます。 次のように入力すると、これを確認できます。

rs.conf()

{
    "_id" : "rs0"
    "version" : 1,
    "members" : [
        {
            "_id" : 0,
            "host" "mongo0.example.com:27017"
        }
    ]
}

これで、/etc/hostsファイルでノードに指定したホスト名を参照することにより、レプリケーションセットにノードを追加できます。

rs.add("mongo1.example.com")

{ "ok" : 1 }

残りのレプリケーションメンバーごとにこれを実行します。 これで、レプリケーションセットが稼働しているはずです。

結論


データストレージターゲットごとにレプリケーションセットを適切に構成することにより、データベースは、使用不可やハードウェア障害からある程度保護されます。 これは、あらゆる生産システムにとって不可欠です。

レプリケーションセットは、本質的に外部からは見えないため、アプリケーションとのシームレスなインターフェイスを提供します。 すべてのレプリケーションメカニズムは内部で処理されます。 MongoDBシャーディングの実装を計画している場合は、シャードサーバーコンポーネントごとにレプリケーションセットを実装することをお勧めします。