データベースシステムは、読み取りと書き込みの両方のスループット操作を容易にする、明確に定義されたアプローチと統合されている場合に最高のパフォーマンスを発揮します。 MongoDBは、同じ概念が垂直スケーリングのみを強化するリレーショナルDBMとは対照的に、水平および垂直スケーリングを可能にすることを目的として、レプリケーションとシャーディングを採用することでさらに一歩前進しました。
シャーディングにより、データベースクラスターのメンバー間で負荷が確実に分散されるため、読み取り操作がほとんど待ち時間なしで実行されます。シャーディングを使用しないと、大量のデータセットと高スループットの操作を備えた単一のデータベースサーバーの容量が技術的に困難になる可能性があり、必要な対策を考慮しないと、そのサーバーに障害が発生する可能性があります。たとえば、クエリの割合が非常に高い場合、サーバーのCPU容量は圧倒されます。
一方、レプリケーションは、異なるデータベースサーバーが同じデータを格納するという概念です。データの整合性を強化するだけでなく、データの高可用性を保証します。高性能のソーシャルメディアアプリケーションの例を見てみましょう。停電の場合のようにメインのサービスデータベースシステムに障害が発生した場合、同じデータを提供する別のシステムが必要です。優れたレプリカセットには、3つ以上のメンバー、アービター、および最適なelectionTimeoutMillisが必要です。レプリケーションでは、すべての書き込み操作が行われ、Oplogに適用されるマスター/プライマリノードがあります。 Oplogから、加えられたすべての変更が他のメンバーに適用されます。この場合、他のメンバーはセカンダリノードまたはスレーブと呼ばれます。プライマリノードがしばらくして通信しない場合:electionTimeoutMillis、他のノードは選挙に行くように合図されます。選挙タイムアウトミリスは、システムが長時間ダウンするために高すぎたり低すぎたりしないように設定する必要があります。これは、一時的なネットワークレイテンシが発生した場合でも、大量のデータや頻繁な選択が失われ、データの不整合が発生する可能性があるためです。アービターは、抽選があったが他のメンバーのようにデータを持っていない場合に、勝者のメンバーに投票を追加してマスターになるために使用されます。
Puppetを使用してMongoDBレプリカセットをデプロイする理由
多くの場合、シャーディングはレプリケーションと連携して使用されます。レプリカセットの構成と保守のプロセスは、次の理由で簡単ではありません。
- ヒューマンエラーの可能性が高い
- 反復的なタスクを自動的に実行できない
- 特に多数のメンバーが関与している場合は時間がかかります
- 仕事の不満の可能性
- 出現する可能性のある圧倒的な複雑さ。
概説された挫折を克服するために、私たちは簡単に作業するのに役立つ十分なリソースを備えた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_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_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{'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:シャードの名前を定義します。
メンバー:これは、シャードが保持するメンバーの配列です。
キー:シャーディングで使用するキー、または複合シャードキーの作成に使用できるキーの配列を定義します。