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に接続します。
その他の拡張