MongoDB シャーディング


シャーディング

MongoDBにはもう1つのクラスタ、すなわちシャーディング技術があります。これにより、MongoDBのデータ量が大幅に増加するニーズを満たすことができます。

MongoDBが大量のデータを保存する場合、1台のマシンではデータを保存するのに不十分な場合があり、許容可能な読み取り/書き込みスループットを提供するのにも不十分な場合があります。その場合、複数のマシンにデータを分割することで、データベースシステムはより多くのデータを保存・処理できるようになります。


シャーディングを使用する理由

  • すべての書き込み操作をプライマリノードにレプリケートする
  • 遅延に敏感なデータはプライマリノードでクエリされます
  • 単一のレプリカセットは12ノードに制限されています
  • リクエスト量が膨大な場合、メモリ不足が発生します。
  • ローカルディスクの容量不足
  • 垂直拡張(スケールアップ)は高価です

MongoDBシャーディング

下図は、MongoDBにおけるシャーディングクラスタ構成の分布を示しています。

上図には、主に以下の3つの主要コンポーネントがあります:

  • Shard:

    実際のデータブロックの保存に使用されます。実際の本番環境では、1つのシャードサーバーの役割は、複数台のマシンで構成されるレプリカセットが担当し、ホストの単一障害点を防ぎます。

  • Config Server:

    mongodインスタンスは、chunk情報を含むClusterMetadata全体を保存します。

  • Query Routers:

    フロントエンドルーターであり、クライアントはここから接続します。クラスタ全体を単一のデータベースのように見せることができるため、フロントエンドアプリケーションは透過的に使用できます。


シャーディングの例

シャーディング構造のポート割り当ては次のとおりです:

Shard Server 1:27020
Shard Server 2:27021
Shard Server 3:27022
Shard Server 4:27023
Config Server :27100
Route Process:40000

ステップ1: Shard Serverを起動する

[root@100 /]# mkdir -p /www/mongoDB/shard/s0
[root@100 /]# mkdir -p /www/mongoDB/shard/s1
[root@100 /]# mkdir -p /www/mongoDB/shard/s2
[root@100 /]# mkdir -p /www/mongoDB/shard/s3
[root@100 /]# mkdir -p /www/mongoDB/shard/log
[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27020 --dbpath=/www/mongoDB/shard/s0 --logpath=/www/mongoDB/shard/log/s0.log --logappend --fork
....
[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27023 --dbpath=/www/mongoDB/shard/s3 --logpath=/www/mongoDB/shard/log/s3.log --logappend --fork

ステップ2: Config Serverを起動する

[root@100 /]# mkdir -p /www/mongoDB/shard/config
[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27100 --dbpath=/www/mongoDB/shard/config --logpath=/www/mongoDB/shard/log/config.log --logappend --fork

注意:ここでは通常のMongoDBサービスを起動するのとまったく同じように起動できます。--shardsvr と --configsvr パラメータを追加する必要はありません。これらの2つのパラメータは起動ポートを変更するためのものなので、自分でポートを指定するだけでよいのです。

ステップ3: Route Processを起動する

/usr/local/mongoDB/bin/mongos --port 40000 --configdb localhost:27100 --fork --logpath=/www/mongoDB/shard/log/route.log --chunkSize 500

mongosの起動パラメータでは、chunkSize項目はchunkのサイズを指定するために使用され、単位はMBで、デフォルトサイズは200MBです。

ステップ4: Shardingを設定する

次に、MongoDB Shellを使用してmongosにログインし、Shardノードを追加します。

[root@100 shard]# /usr/local/mongoDB/bin/mongo admin --port 40000
MongoDB shell version: 2.0.7
connecting to: 127.0.0.1:40000/admin
mongos> db.runCommand({ addshard:"localhost:27020" })
{ "shardAdded" : "shard0000", "ok" : 1 }
......
mongos> db.runCommand({ addshard:"localhost:27029" })
{ "shardAdded" : "shard0009", "ok" : 1 }
mongos> db.runCommand({ enablesharding:"test" }) #设置分片存储的数据库
{ "ok" : 1 }
mongos> db.runCommand({ shardcollection: "test.log", key: { id:1,time:1}})
{ "collectionsharded" : "test.log", "ok" : 1 }

ステップ5: プログラムコードを大幅に変更する必要はありません。通常のMongoDBデータベースに接続するのと同じように、データベース接続をポート40000に接続します。

その他の拡張