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

Puppetを使用したMongoDBレプリカセットとシャードのデプロイの基本

    データベースシステムは、読み取りと書き込みの両方のスループット操作を容易にする、明確に定義されたアプローチと統合されている場合に最高のパフォーマンスを発揮します。 MongoDBは、同じ概念が垂直スケーリングのみを強化するリレーショナルDBMとは対照的に、水平および垂直スケーリングを可能にすることを目的として、レプリケーションとシャーディングを採用することでさらに一歩前進しました。

    シャーディングにより、データベースクラスターのメンバー間で負荷が確実に分散されるため、読み取り操作がほとんど待ち時間なしで実行されます。シャーディングを使用しないと、大量のデータセットと高スループットの操作を備えた単一のデータベースサーバーの容量が技術的に困難になる可能性があり、必要な対策を考慮しないと、そのサーバーに障害が発生する可能性があります。たとえば、クエリの割合が非常に高い場合、サーバーのCPU容量は圧倒されます。

    一方、レプリケーションは、異なるデータベースサーバーが同じデータを格納するという概念です。データの整合性を強化するだけでなく、データの高可用性を保証します。高性能のソーシャルメディアアプリケーションの例を見てみましょう。停電の場合のようにメインのサービスデータベースシステムに障害が発生した場合、同じデータを提供する別のシステムが必要です。優れたレプリカセットには、3つ以上のメンバー、アービター、および最適なelectionTimeoutMillisが必要です。レプリケーションでは、すべての書き込み操作が行われ、Oplogに適用されるマスター/プライマリノードがあります。 Oplogから、加えられたすべての変更が他のメンバーに適用されます。この場合、他のメンバーはセカンダリノードまたはスレーブと呼ばれます。プライマリノードがしばらくして通信しない場合:electionTimeoutMillis、他のノードは選挙に行くように合図されます。選挙タイムアウトミリスは、システムが長時間ダウンするために高すぎたり低すぎたりしないように設定する必要があります。これは、一時的なネットワークレイテンシが発生した場合でも、大量のデータや頻繁な選択が失われ、データの不整合が発生する可能性があるためです。アービターは、抽選があったが他のメンバーのようにデータを持っていない場合に、勝者のメンバーに投票を追加してマスターになるために使用されます。

    Puppetを使用してMongoDBレプリカセットをデプロイする理由

    多くの場合、シャーディングはレプリケーションと連携して使用されます。レプリカセットの構成と保守のプロセスは、次の理由で簡単ではありません。

    1. ヒューマンエラーの可能性が高い
    2. 反復的なタスクを自動的に実行できない
    3. 特に多数のメンバーが関与している場合は時間がかかります
    4. 仕事の不満の可能性
    5. 出現する可能性のある圧倒的な複雑さ。

    概説された挫折を克服するために、私たちは簡単に作業するのに役立つ十分なリソースを備えたPuppetのような自動化されたシステムに落ち着きました。

    前回のブログでは、Puppetを使用してMongoDBをインストールおよび構成するプロセスを学びました。ただし、レプリカセットとシャードの構成に使用するため、Puppetの基本的なリソースを理解することが重要です。見逃した方のために、これは、作成したマシンにMongoDBをインストールして実行するプロセスのマニフェストファイルです

    ​  package {'mongodb':
    
        ensure => 'installed',
    
      }
    
      service {'mongodb':
    
        ensure => 'running',
    
        enable => true
    
      }

    したがって、上記のコンテンツをrunMongoDB.ppというファイルに入れて、コマンドで実行できます。

    $ sudo apply runMongoDB.pp

    「mongodb」モジュールと関数を使用して、各mongodbリソースに対応するパラメーターを使用してレプリカセットを設定できます。

    MongoDB接続

    ノードとmongodbサーバーの間にmongodb接続を確立する必要があります。これの主な目的は、mongodbサーバーに到達できないが、データベースの監視などの他の目的に使用できる可能性がある場合に、構成の変更が適用されないようにすることです。 mongodb_conn_validatorを使用します

    mongodb_conn_validator{‘mongodb_validator’:
    
    ensure => present,
    
         server: ‘127.0.0.1:27017’,
    
         timeout: 40,
    
         tcp_port:27017
    
        }

    name:この場合、名前mongodb_validatorはリソースのIDを定義します。接続文字列と見なすこともできます

    サーバー:これは、mongodbを実行するサーバーのDNS名/IPアドレスを含む文字列または文字列の配列である可能性があります。

    タイムアウト:これは、バリデーターがpuppetdbが実行されていないと判断する前に待機する必要がある最大秒数です。

    tcp_port:これは、mongodbサーバーへのhttps接続を試行することでmongodb接続を検証するリソースのプロバイダーです。認証には、ローカルのパペット環境からセットアップされたパペットSSL証明書が使用されます。

    データベースの作成
    mongodb_database{‘databaseName’:
    
    ensure => present,
    
         tries => 10
    
    }

    この関数は、次の3つのパラメーターを取ります。

    name:この場合、name databaseNameは、作成するデータベースの名前を定義します。これは、name =>‘databaseName’としても宣言されます。

    試行:これは、MongoDBの起動を待機する2秒間の最大試行回数を定義します

    MongoDBユーザーの作成

    モジュールmongodb_userを使用すると、puppetモジュール内の特定のデータベースのユーザーを作成および管理できます。

    mongodb_user {userprod:
    
      username => ‘prodUser’,
    
      ensure => present,
    
      password_hash => mongodb_password(‘prodUser’, ‘passProdser’),
    
      database => prodUser,
    
      roles => [‘readWrite’, ‘dbAdmin’],
    
      tries  => 10
    
    }
    プロパティ

    username:ユーザーの名前を定義します。

    password_hash:これはユーザーのパスワードハッシュです。 MongoDB 3.0以降で使用可能な関数mongodb_password()は、ハッシュの作成に使用されます。

    ロール:これは、ユーザーがターゲットデータベースで実行できるロールを定義します。

    パスワード:これはプレーンなユーザーパスワードテキストです。

    データベース:ユーザーのターゲットデータベースを定義します。

    レプリカセットの作成 モジュールmongodb_replsetを使用してレプリカセットを作成します。

    Mongodb_replset{'replicaset1':
    
       arbiter: 'host0:27017',
    
       ensure  => present,
    
       members => ['host0:27017','host1:27017', 'host2:27017', 'host3:27017'] 
    
       initialize_host: host1:27017
    
    }

    name:レプリカセットの名前を定義します。

    メンバー:レプリカセットが保持するメンバーの配列。

    initialize_host:レプリカセットの初期化に使用されるホスト

    アービター:アービターとして使用されるレプリカセットメンバーを定義します。

    MongoDBシャードの作成

    mongodb_shard{'shard1':
    
       ensure  => present,
    
       members => ['shard1/host1:27017', 'shard1/host2:27017', 'shard1/host3:27017'] 
    
       keys: 'price'
    
    }

    name:シャードの名前を定義します。

    メンバー:これは、シャードが保持するメンバーの配列です。

    キー:シャーディングで使用するキー、または複合シャードキーの作成に使用できるキーの配列を定義します。


    1. MongoDbでjacksonを使用して日付フィールドをISODate()として保存する方法

    2. 配列mongodbの長さを見つける方法

    3. Redis管理パネル

    4. MongoDB insert()