MongoDBクラスタのセットアップ方法

MongoDBクラスタのセットアップ方法

  • ITOps・DevOps
5分で読めます 更新日 Mar 6, 2019

ポイント: MongoDBクラスターの設定には、設定サーバー、クエリルーター、シャードサーバーのインストールが含まれます。このプロセスには、各サーバーの構成、適切なネットワーキングの確保、およびデータ分散のためのシャーディングの有効化が含まれます。主なステップには、構成ファイルの編集、サービスの開始、エラーのためのログのチェックが含まれます。詳細な手順については、提供された手順と追加のMongoDBリソースへのリンクに従ってください。

  • 設定サーバー、クエリルーター、シャードサーバーをインストールします。
  • クラスター全体でのデータ分散のためにシャーディングを有効にします。

ここでは、MongoDBクラスタのセットアップ方法を示します。前の投稿では、1台のマシンにインストールする方法を紹介しました。

インストールする部分は3つあります:

  1. 構成サーバー
  2. クエリルーター
  3. シャードサーバー、すなわちデータベース

下の図を見てみると、mongosプロセスはルーターとして実行されており、クライアントにデータを探す場所を指示します。データはシャーディングに基づいてクラスター全体に分散されています。シャーディングは、いくつかのインデックスのハッシュ値に基づいてレコードをサーバーに割り当てることです。構成サーバーは構成情報を保持します。

構成サーバー

MongoDBをインストール

技術的には、MongoDBをクラスターにすることは、MongoDBアーキテクチャの3つの層を別々のプロセスとして持つことを意味します。これは、学術的な目的で1台のマシンで行うことができます。しかし、ここでは2台を使用します。

ルーターと構成サーバーを172.31.46.15にインストールし、シャードサーバーを172.31.47.43にインストールします。単純化のために、最初のサーバーを構成サーバー、2番目のサーバーをデータベースサーバーと呼びましょう。

MongoDBをインストールするにはapt-getを使用しないでください。通常、これは最新のバージョンではありません。代わりに、以下の手順に従ってください。これは、mongod(構成およびシャードサーバー)、mongos(ルーター)、およびmongoクライアントを3つの別々のパッケージとしてインストールします。

2つのサーバー間でポート27017、27018、および27019を開放してください。

構成サーバーには3つのパッケージすべてが必要ですが、データベースサーバーにはmongodb-org-serverのみが必要です。Ubuntuでは、次のようにインストールします。

    wget https://repo.mongodb.org/apt/ubuntu/dists/xenial/mongodb-org/4.0/multiverse/binary-amd64/mongodb-org-server_4.0.5_amd64.deb

sudo dpkg -i mongodb-org-server_4.0.5_amd64.deb

wget https://repo.mongodb.org/apt/ubuntu/dists/xenial/mongodb-org/4.0/multiverse/binary-amd64/mongodb-org-shell_4.0.5_amd64.deb

sudo dpkg -i mongodb-org-shell_4.0.5_amd64.deb

wget https://repo.mongodb.org/apt/ubuntu/dists/xenial/mongodb-org/4.0/multiverse/binary-amd64/mongodb-org-mongos_4.0.5_amd64.deb

 sudo dpkg -i mongodb-org-mongos_4.0.5_amd64.deb

ステップを間違えた場合は、サーバーを削除し、データファイルライブラリ/var/lib/mongodbを消去してください。ソフトウェアを再インストールする際にデータファイルを消去しないと、以前の構成が保持され、誤りが復元されてしまいます。

構成サーバーにログインします。

すべての3台のサーバーをセットアップするために、各サーバーで同じ4つのステップを繰り返します:

  1. 構成ファイルを編集
  2. プロセスを開始
  3. エラーのためにログを確認
  4. さらなる構成のためにシェルにログイン

さて、構成サーバーで構成ファイルを編集します。簡略化のために、各構成ファイルには説明的な名前を付けています:

構成サーバーにログインします。

    sudo vim /etc/mongodConfig.conf

以下のテキストを貼り付けます。最初に、いくつかのフィールドについて説明します:

path: /var/log/mongodb/mongodConfig.log
各プロセスには、そのプロセスが何であるかを明確に示す名前を付けます。
port: 27019
bindIp: 172.31.46.15
デフォルトでは、構成サーバーはクラスター構成でポート2019で実行されます。ここで明示的に指定することで、覚えておく必要はありません。また、IPアドレスはループバックアドレスではありません。他のサーバーがこのサーバーを見つけることができるようにするためです。
sharding:
clusterRole: configsvr
シャーディングとは、データをあるハッシュ化スキームに従って分配することを意味します。ここでは、このサーバーが構成サーバーであることをMongoDBに伝えます。共有サーバーではありません。
replication:
replSetName: ConfigReplSet
これは、この構成データをレプリケートすることを意味します。その他のレプリカを追加するためにrs.()関数を使用します。任意の名前を使用できます。

このテキストを/etc/mongodConfig.confに貼り付けます:

プロセスを開始します:

    storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongodConfig.log

net:
  port: 27019
  bindIp: 172.31.46.15

sharding:
  clusterRole: configsvr

replication:
  replSetName: ConfigReplSet

プロセスを開始します:

    sudo mongod --config /etc/mongodConfig.conf&

エラーのためにログをチェックします:

    sudo tail -100 /var/log/mongodb/mongodConfig.log

シェルにログインします:

    mongo 172.31.46.15:27019

rs.initiate()でレプリケーションを有効にし、rs.status()でステータスを確認します。設定ファイルConfigReplSetで構成したレプリケーションセットの名前が取得されていることに注意してください。

    > rs.initiate()
{
	"info2" : "no configuration specified. Using a default configuration for the set",
	"me" : "172.31.46.15:27019",
	"ok" : 1,
	"operationTime" : Timestamp(1548598138, 1),
	"$gleStats" : {
		"lastOpTime" : Timestamp(1548598138, 1),
		"electionId" : ObjectId("000000000000000000000000")
	},
	"lastCommittedOpTime" : Timestamp(0, 0),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1548598138, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
ConfigReplSet:SECONDARY> rs.status()
{
	"set" : "ConfigReplSet",

クエリルーターを設定

設定ファイルを編集します:

    sudo vim /etc/mongoRouter.conf

以下のテキストを貼り付けてください。注意:

configDB: ConfigReplSet/172.31.46.15:27019
これは、クエリルーターが構成サーバーとそのレプリカセットを見つける場所を示します。
    systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongoRouter.log

net:
  port: 27017
  bindIp: 172.31.46.15

sharding:
  configDB: ConfigReplSet/172.31.46.15:27019

サービスを開始します。mongosのsに注意してください。これはクエリルーターのプロセスです。

    sudo mongos --config /etc/mongoRouter.conf&

ログを確認し、エラーを探してください:

    mongo 172.31.46.15:27017

シャードの設定

データベースサーバーにログインします。

    sudo vim /etc/mongodShard.conf

以下のテキストを貼り付けてください。注意:

プロセスを開始します。

clusterRole: shardsvr
これは、構成サーバーとは異なり、シャードサーバーになることを意味します。
replSetName: ShardReplSet
これはデータをレプリケートすることを意味します。構成サーバーでは、構成をレプリケートするように指示しました。
port: 27018
デフォルトでは、シャードサーバーはポート27018で実行されます。これを明示的に指定することで、覚えておく必要はありません。
    storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongodShard.log

net:
  port: 27018 
  bindIp: 172.31.47.43

sharding:
  clusterRole: shardsvr

replication:
  replSetName: ShardReplSet

プロセスを開始します。

    sudo mongod --config /etc/mongodShard.conf&

エラーについてログを確認します。

シェルにログインします。

    sudo tail -f /var/log/mongodb/mongodShard.log

シェルにログインします。

    mongo 172.31.47.43:2018

rs.initiate()でレプリケーションをオンにし、その後、rs.status()でステータスを確認します。ShardReplSetという名前に注意してください。クラスター内のすべてのシャードで同じ名前を使用する限り、任意の名前を使用できます。

    rs.initiate()
{
	"info2" : "no configuration specified. Using a default configuration for the set",
	"me" : "172.31.47.43:27018",
	"ok" : 1,
	"operationTime" : Timestamp(1548602253, 1),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1548602253, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
ShardReplSet:SECONDARY> rs.status()
{
	"set" : "ShardReplSet",

クラスタにシャードを追加

構成サーバーに戻り、ルーターに接続します:

    mongo 172.31.46.15:27017

以下のすべてのコマンドをシェルに貼り付けます:

    sh.addShard( "ShardReplSet/172.31.47.43:27018")

{
	"shardAdded" : "ShardReplSet",
	"ok" : 1,
	"operationTime" : Timestamp(1548602529, 4),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1548602529, 4),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}

booksという名前のデータベースを作成し、その後シャーディングを有効にします。

    use books
switched to db books

sh.enableSharding("books")

{
	"ok" : 1,
	"operationTime" : Timestamp(1548602601, 6),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1548602601, 6),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}

コレクションを作成します。

    db.createCollection("collection")


{
	"ok" : 1,
	"operationTime" : Timestamp(1548602659, 5),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1548602659, 5),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}

インデックスを作成します。フィールドisbnを降順でインデックスします。

1件のレコードを追加します。

    db.collection.createIndex( { isbn: -1 } )


{
	"raw" : {
		"ShardReplSet/172.31.47.43:27018" : {
			"createdCollectionAutomatically" : false,
			"numIndexesBefore" : 1,
			"numIndexesAfter" : 2,
			"ok" : 1
		}
	},
	"ok" : 1,
	"operationTime" : Timestamp(1548602670, 9),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1548602670, 9),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}

1件のレコードを追加します。

    db.collection.insertOne( { isbn: 100 } )


{
	"acknowledged" : true,
	"insertedId" : ObjectId("5c4dcd69e83741cb900b46f8")
}

コレクションのシャーディングを有効にします。

    sh.shardCollection("books.collection", { isbn : "hashed" } )

{
	"collectionsharded" : "books.collection",
	"collectionUUID" : UUID("0d10320b-3086-472e-a3ac-4be67fae21f9"),
	"ok" : 1,
	"operationTime" : Timestamp(1548603537, 12),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1548603537, 12),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}

データが下記のようにクラスター全体に分散されていることを確認します。当然、データベースサーバーは1台しかないので、1台だけが表示されます。別のブログ記事では、より多くのサーバーを追加する方法を示します。

    db.collection.getShardDistribution()

Shard ShardReplSet at ShardReplSet/172.31.47.43:27018
 data : 0B docs : 0 chunks : 2
 estimated data per chunk : 0B
 estimated docs per chunk : 0

Totals
 data : 0B docs : 0 chunks : 2
 Shard ShardReplSet contains NaN% data, NaN% docs in cluster, avg obj size on shard : NaNGiB

MongoDBガイド

  1. MongoDB概要:MongoDBの始め方
  2. UbuntuとMacにMongoDBをインストールする方法
  3. MongoDBでのデータベースの作成
  4. MongoDBシェル基本コマンド
  5. MongoDB Compass:Mongo GUIの使用
  6. MongoDBの役割ベースアクセス制御(RBAC)の説明
  7. MongoDBのプロジェクションとプロジェクション演算子の説明
  8. MongoDB集約関数の説明
  9. MongoDBのソート:sort()メソッドと例
  10. MongoDBでのPushとPull演算子の使用
  11. MongoDB $unwindの使い方
  12. 23の一般的なMongoDBクエリ演算子とその使用方法
  13. MongoDBジオロケーションクエリの例
  14. MongoDBトランザクションの紹介
  15. MongoDBインデックス:主要インデックスタイプとその管理方法
  16. 知っておくべき主要なMongoDBコマンド
  17. MongoDBレプリケーション:完全な紹介
  18. MongoDBクラスタのセットアップ方法
  19. MongoDBシャーディング:概念、例、チュートリアル
  20. MongoDB Atlas:管理されたMongoDBのセットアップと使用
  21. MongoDBをDockerコンテナとして実行する方法
  22. MongoDBのメモリ使用量、管理、および要件
  23. MongoDBバックアップのためのmongodumpの使用方法
  24. MongoDBバックアップを復元するためのmongorestoreの例
  25. PyMongoの使用方法
  26. MongoDBとNodeJSのためのMongooseの使用方法
  27. MongoDBチートシート
  28. MongoDB対Cassandra:NoSQLデータベースの比較
  29. PostgreSQL対MongoDB:データベースの比較
  30. MySQL対MongoDB:データベースの比較
  31. MongoDB認定:紹介

これらの投稿は私自身の意見であり、必ずしもBMCの立場、戦略、または意見を表すものではありません。

ITOps・DevOpsの関連記事

BMCからのさらなる情報に興味がありますか?

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーションに関する月刊メールです:研究、顧客ストーリー、製品ニュース、イベント。

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ザ・ブリーフに登録しました

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーション—BMC AMIおよびControl-M—に関するアナリストの研究、顧客の展開、両者にわたるイベントを網羅しています。