データベースシステムは、実行中のインスタンスの数に分散したワークロードがある場合、またはデータが簡単な方法で分類されている場合に、より適切に機能します。 MongoDBはシャーディングを利用して、特定のデータベース内のデータがいくつかのキーに従ってグループ化されるようにします。シャーディングは水平スケーリングを強化し、その結果、パフォーマンスと信頼性が向上します。一般に、MongoDBは、垂直スケーリングのみを促進するMySQLなどのSQL DBMSとは対照的に、水平および垂直スケーリングを提供します。
MongoDBの整合性モデルは緩く、コレクション内のドキュメントには、同じコレクション内の他のドキュメントにはない追加のキーが含まれている可能性があります。
シャーディング
シャーディングとは、基本的にデータを個別のチャンクに分割し、チャンクの範囲をさまざまなシャードサーバーに定義することです。シャーディングされるデータベース内のすべてのドキュメントに存在することが多いフィールドであるシャードキーは、データをグループ化するために使用されます。シャーディングはレプリケーションと連携して機能し、単一のサーバーに依存するのではなく、複数のサーバー間でワークロードを分散させることにより、読み取りスループットを高速化します。さらに、複製により、書き込まれたデータのコピーを確実に利用できるようになります。
コレクションに120のドキュメントがあるとしましょう。これらのデータは、以下の構成設定に示すように、3つのレプリカセットがあり、それぞれに40のドキュメントがあるようにシャーディングできます。 2つのクライアントがリクエストを送信する場合(1つはインデックス35にあるドキュメントをフェッチし、もう1つはインデックスが92にあるドキュメントをフェッチする)、リクエストはクエリルーター(mongosプロセス)によって受信され、クエリルーターは次のレコードを保持する構成ノードに接続します。チャンクの範囲がシャード間でどのように分散されるか。指定されたドキュメントIDが見つかると、関連付けられたシャードからフェッチされます。たとえば、上記のように、最初のクライアントのドキュメントはシャードAからフェッチされ、クライアントBの場合、ドキュメントはシャードCからフェッチされます。一般に、水平スケーリングとして定義される分散ワークロードがあります。
指定されたシャードについて、シャード内のコレクションのサイズがchunk_sizeを超える場合、コレクションは、定義されたシャードキーを使用して、シャード間で自動的に分割およびバランス調整されます。デプロイメントのセットアップでは、以下の例では、それぞれがプライマリといくつかのセカンダリを持つ3つのレプリカセットが必要になります。プライマリノードはシャーディングサーバーとしても機能します。
MongoDB実稼働デプロイメントの最小推奨構成は、それぞれがレプリカセットを持つ少なくとも3つのシャードサーバーです。最高のパフォーマンスを得るには、構成ノードがシャードと統合されている間、mongosサーバーは別々のサーバーにデプロイされます。
Ansibleを使用したMongoDBシャードのデプロイ
クラスターのシャードとレプリカセットを個別に構成するのは面倒な作業であるため、Ansibleのような単純なツールに解決して、必要な結果を非常に簡単に実現します。プレイブックは、Ansibleソフトウェアが実行する必要な構成とタスクを作成するために使用されます。
体系的なプレイブックのプロセスは次のとおりです。
- mongo基本パッケージ(サーバーなし、pymongo、コマンドラインインターフェース)をインストールします
- mongodbサーバーをインストールします。開始するには、このガイドに従ってください。
- mongodインスタンスと対応するレプリカセットを設定します。
- 構成サーバーの構成とセットアップ
- Mongosルーティングサービスを構成および設定します。
- シャードをクラスターに追加します。
トップレベルのプレイブックは次のようになります
- name: install mongo base packages include: mongod.yml
tags: - mongod
- name: configure config server
include: configServer.yml
when: inventory_hostname in groups['mongoc-servers']
tags:
- cs
- name: configure mongos server
include: configMongos.yml
when: inventory_hostname in groups['mongos-server'] tags:
- mongos
- name: add shards
include: addShards.yml
when: inventory_hostname in groups['mongos-servers']
tags:
- mongos
- shards
上記のファイルをmongodbCluster.ymlとして保存できます。
SomeninesがMongoDBDBAになる-MongoDBを本番環境に導入MongoDBDownloadを無料でデプロイ、監視、管理、スケーリングするために知っておくべきことを学びましょう単純なmongodb.ymlファイルは次のようになります:
---
- hosts: ansible-test
remote_user: root
become: yes
tasks:
- name: Import the public key used by the package management system
apt_key: keyserver=hkp://keyserver.ubuntu.com:80 id=7F0CEB10 state=present
- name: Add MongoDB repository
apt_repository: repo='deb <a class="vglnk" href="https://downloads-distro.mongodb.org/repo/ubuntu-upstart" rel="nofollow"><span>http</span><span>://</span><span>downloads</span><span>-</span><span>distro</span><span>.</span><span>mongodb</span><span>.</span><span>org</span><span>/</span><span>repo</span><span>/</span><span>ubuntu</span><span>-</span><span>upstart</span></a> dist 10gen' state=present
- name: install mongodb
apt: pkg=mongodb-org state=latest update_cache=yes
notify:
- start mongodb
handlers:
- name: start mongodb
service: name=mongod state=started
レプリカセットの展開に必要な一般的なパラメータに、シャードを追加するためにこれら2つがさらに必要です。
- シャード: デフォルトではnullです。これはシャード接続文字列であり、
/ host:portの形式である必要があります。例:replica0 / siteurl1.com:27017 - 状態: デフォルトでは、シャードが存在する必要があることを示す値が存在します。存在しない場合は、シャードが存在しないように設定できます。
このブログで説明されているようにレプリカセットをデプロイした後、シャードの追加に進むことができます。
# add a replicaset shard named replica0 with a member running on port 27017 on mongodb0.example.net
- mongodb_shard:
login_user: admin
login_password: root
shard: "replica0/mongodb1.example.net:27017"
state: present
# add a standalone mongod shard running on port 27018 of mongodb2.example.net
- mongodb_shard:
login_user: admin
login_password: root
shard: "mongodb2.example.net:27018"
state: present
# Single node shard running on localhost
- name: Ensure shard replica0 exists
mongodb_shard:
login_user: admin
login_password: root
shard: "replica0/localhost:3001"
state: present
# Single node shard running on localhost
- name: Ensure shard replica0 exists
mongodb_shard:
login_user: admin
login_password: root
shard: "replica0/localhost:3002"
state: present
これらすべての構成を設定した後、コマンドを使用してプレイブックを実行します
ansible-playbook -i hosts mongodbCluster.yml
プレイブックが完成したら、任意のmongosサーバーにログインして、コマンドsh.status()を発行できます。出力が以下のようなものである場合、シャードはデプロイされています。さらに、成功が評価されている場合は、キーmongodb_shardを確認できます。
mongos> sh.status()
--- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shardA", "host" : "locahhost1/web2:2017,locahhost3:2017" }
{ "_id" : "shardB", "host" : "locahhost3/web2:2018,locahhost3:2019" }
{ "_id" : "shardC", "host" : "locahhost3/web2:2019,locahhost3:2019" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
Replica0というシャードを削除するには
- mongodb_shard:
login_user: admin
login_password: root
shard: replica0
state: absent
結論
Ansibleは、実行する必要のあるタスクを定義するだけでよいため、デプロイプロセスを簡単にする上で大きな役割を果たしてきました。たとえば、40個のレプリカセットメンバーがあり、それぞれにシャードを追加する必要がある場合を想像してみてください。通常の方法で進むと、年齢がかかり、多くの人為的ミスが発生しやすくなります。 ansibleを使用すると、これらのタスクをプレイブックと呼ばれる単純なファイルで定義するだけで、ファイルの実行時にansibleがタスクを処理します。