sql >> データベース >  >> NoSQL >> MongoDB

Ansibleを使用してクラウドでMongoDBレプリカセットを維持する

    レプリケーションは、冗長性を作成することでデータの高可用性を確保するために、データベースシステムに広く適用されています。これは基本的に、異なるマシンにある可能性のある異なる実行中のサーバーで同じデータのコピーを作成する戦略であり、メインサーバーに障害が発生した場合に、別のサーバーでサービスを継続できるようにします。

    >

    レプリカセットは、同じデータセットを維持するMongoDBインスタンスのグループです。これらは、実稼働展開の基礎です。メインサーバーシステムに障害が発生した場合に備えて、データは常に別のサーバーから利用できるため、レプリケーションは有利です。さらに、クライアントが異なるサーバーに読み取り要求を送信し、最も近いサーバーから応答を取得できるようにすることで、読み取りスループットが向上します。

    レプリカセットは、さまざまなマシンとアービターノードでホストできるいくつかのデータ保持ノードを構成します。これらのデータ保持ノードの1つはプライマリとしてラベル付けされ、他のノードはセカンダリノードとしてラベル付けされます。プライマリノードはすべての書き込み操作を受け取り、書き込み操作が完了して変更がoplogに記録された後、データを他のノードに複製します。

    アービターは、データセットを維持しないが、他のレプリカセットメンバーによるハートビートおよび選択要求に応答することによってレプリカセットにクォーラムを提供する追加のインスタンスです。したがって、完全に機能するのではなく、レプリカセットを維持するコストを削減します。データセットを持つレプリカセットメンバー。

    自動フェイルオーバー

    プライマリノードは、停電やネットワークの切断などの理由で障害が発生し、他のメンバーと通信できない場合があります。設定されたelectionTimeoutMillis期間を超えて通信が切断された場合、セカンダリの1つが、新しいプライマリとして自分自身を指名するための選挙を要求します。選択が完了して成功した場合、クラスターは通常の操作を続行します。この間、書き込み操作はできません。ただし、読み取りクエリは、プライマリがオフラインのときにセカンダリで通常どおりに実行されるように構成できます。

    最適なレプリケーションプロセスを実現するには、クラスターが新しいプライマリを選択するまでの時間の中央値は、デフォルトのレプリケーション構成設定では最大12秒である必要があります。これは、時間を延長する可能性のあるネットワークレイテンシなどの要因の影響を受ける可能性があるため、この時間が長く設定されすぎないように、クラスタのアーキテクチャを考慮する必要があります。

    selectionTimeoutMillisの値は、デフォルトの10000(10秒)から下げることができるため、非常に高速なときにプライマリを最初に検出できます。ただし、これは、プライマリノードが正常であっても、一時的なネットワーク遅延などの小さな要因でさえ頻繁に選挙を呼び出す可能性があります。これにより、書き込み操作のロールバックなどの問題が発生します。

    レプリカセットに対応

    前述のように、レプリカセットには異なるホストマシンのメンバーが含まれている可能性があるため、クラスターの保守がより複雑になります。このレプリカセットを簡単に保守できる単一のプラットフォームが必要です。 Ansibleは、レプリカセットを構成および管理するためのより良い概要を提供するツールの1つです。 Ansibleを初めて使用する場合は、この記事から簡単に要約して、プレイブックの作成などの基本を理解してください。

    構成パラメーター

    • arbiter_at_index: これにより、レプリカセットメンバーリスト内のアービターの位置が定義されます。アービターは、他のメンバーのようにデータを持っておらず、プライマリノードとして使用できないことを覚えています。選挙中に定足数を作成するためにのみ使用できます。たとえば、メンバーの数が偶数の場合は、投票数が等しい場合に1を追加して勝者メンバーになるように、アービターを追加することをお勧めします。割り当てる値は整数である必要があります。
    • chaining_allowed: これはブール値を取り、chaining _allowed =trueの場合に、他のセカンダリメンバーが他のセカンダリメンバーから複製する必要があるかどうかを定義します。それ以外の場合、chaining _allowed =falseの場合、他のセカンダリメンバーはプライマリからのみ複製できます。デフォルト値はtrueです。
    • election_timeout_secs: デフォルトでは、値は10000です(整数値を取ります)。これは、プライマリノードに到達できない場合、または他のメンバーと通信していないために選択がトリガーされるタイミングを検出するためのミリ秒単位の時間です。これを中央値12秒に設定します。設定が高すぎると、主要な障害を検出するまでに時間がかかり、選挙を行うのに時間がかかります。これは書き込み操作に影響するため、その期間中に大量のデータが失われる可能性があります。一方、設定が低すぎると、ケースがそれほど深刻ではなく、プライマリがまだ到達可能である場合でも、選挙のトリガーが頻繁に発生します。その結果、書き込み操作のロールバックが非常に多くなり、ある時点でデータの整合性が低下したり、不整合が発生したりする可能性があります。
    • heartbeat_timeout_secs: レプリカセットは、ハートビートと呼ばれる信号を送信することにより、選挙の前に相互に通信する必要があります。次に、メンバーは、デフォルトで10秒に設定されている特定の期間内にこのシグナリングに応答する必要があります。 Heartbeat_timeout_secsは、レプリカセットメンバーが互いにハートビートが成功するのを待機する秒数であり、メンバーが応答しない場合は、アクセス不能としてマークされます。ただし、これはプロトコルバージョン0にのみ適用されます。したがって、この値は整数です。
    • login_host: これは、ログインデータベースを格納するホストです。 MongoDBのデフォルトはlocalhostです。
    • login_database: デフォルトはadminで、ログイン資格情報が保存される場所です(文字列値を取ります)
    • login_user: 認証を行うためのユーザー名(文字列値を取ります)
    • login_password: ユーザーを認証するためのパスワード。 (文字列値を取ります)
    • login_port: これは、ホストがログインするためのMongoDBポートです。 (整数値を取ります)
    • メンバー: レプリカセットメンバーのリストを定義します。カンマまたはyamlリストで区切られた文字列です。つまり、mongodb0:27017、mongodb2:27018、mongodb3:27019…ポート番号がない場合は、27017が想定されます。
    • protocol_version: レプリケーションプロセスのバージョンを定義する整数を取ります。 0または1のいずれか
    • レプリカセット: これは、レプリカセットの名前を定義する文字列値です。
    • ssl: データベースに接続するときにSSL接続を使用するかどうかを定義するブール値。
    • ssl_certs_reqs: これは、接続の反対側から証明書が必要かどうか、および提供されている場合はそれを検証する必要があるかどうかを指定します。このための選択肢は、CERT_NONE、CERT_OPTIONAL、およびCERT_REQUIREDです。デフォルトはCERT_REQUIREDです。
    • 検証: 提供されたレプリカセット構成で基本的な検証を行うかどうかを定義するブール値を取ります。デフォルト値はtrueです。

    Ansibleを使用したMongoDBレプリカセットの作成

    これは、ansibleでレプリカセットを設定するためのタスクの簡単な例です。このファイルをtasks.yamlと呼びましょう

    # Create a replicaset called 'replica0' with the 3 provided members
    - name: Ensure replicaset replica0 exists
      mongodb_replicaset:
        login_host: localhost
        login_user: admin
        login_password: root
        replica_set: replica0
        arbiter_at_index:2
        election_timeout_secs:12000
        members:
        - mongodb1:27017
        - mongodb2:27018
        - mongodb3:27019
      when: groups.mongod.index(inventory_hostname) == 0
    
    # Create two single-node replicasets on the localhost for testing
    - name: Ensure replicaset replica0 exists
      mongodb_replicaset:
        login_host: localhost
        login_port: 3001
        login_user: admin
        login_password: root
        login_database: admin
        replica_set: replica0
        members: localhost:3000
        validate: yes
    
    - name: Ensure replicaset replica1 exists
      mongodb_replicaset:
        login_host: localhost
        login_port: 3002
        login_user: admin
        login_password: secret
        login_database: root
        replica_set: replica1
        members: localhost:3001
        validate: yes

    プレイブックでは、次のようなタスクを呼び出すことができます

    ---
    - hosts: ansible-test
      remote_user: root
      become: yes
      Tasks:
    - include: tasks.yml

    これをプレイブック、ansible-playbook -i Inventory.txt -c ssh mongodbcreateReplcaSet.yamlで実行すると、レプリカセットが作成されているかどうかに関係なく、応答が表示されます。キーmongodb_replicasetが、成功の値と作成されたレプリカセットの説明とともに返される場合は、問題ありません。

    結論

    MongoDBでは、通常、異なるマシンでホストされる可能性のあるmongodインスタンスのレプリカセットを構成するのは面倒です。ただし、Ansibleは、上記のようにいくつかのパラメーターを定義するだけで、同じことを行うための単純なプラットフォームを提供します。レプリケーションは、継続的なアプリケーション操作を保証するプロセスの1つであるため、実稼働環境で複数のメンバーを設定することにより、適切に構成する必要があります。アービターは、選挙プロセス中にクォーラムを作成するために使用されるため、その位置を定義することにより、構成ファイルに含める必要があります。


    1. 2つの日付の間のオブジェクトを検索MongoDB

    2. MongoDB $ ln

    3. MongoDb接続が拒否されました

    4. meteorで集計関数を使用する方法