読者です 読者をやめる 読者になる 読者になる

シャーディングの復習

MongoDB

シャーディングの種類

  • Range Base sharding
  • Hash Base Sharding
    • 全部のshardに分散されるので均一的にデータが入る
    • 範囲検索するとおそらくすべてのshardにアクセスするとおもうので微妙
    • データ一本釣りするときは有効かもしれない。(例:ユーザ自分自身のデータを引っ張ってくるときとか)
  • Tag Aware Sharding
    • 「タグ」をshard keyにするぽい

下2つは2.4以降に追加されたけど、今のところうまい使い道が出てこないのが残念なところ

シャーディングをくむ

基本MongoDBのSharding機能で遊ぶ - 個人的なまとめで作ってる通りです。今回は設定ファイルをyamlファイルにしたぐらい。

コレクションの初期配置のshardingを変える

sh.shardCollection でシャーディング対象のコレクションを追加した後に、moveChunkするだけ。最初のマイグレーションが走る前はprimary shardに入るので、こうやってprimary shardにデータが偏らないようにします。

mongos> sh.shardCollection("test.fuga",{id:1})
{ "collectionsharded" : "test.fuga", "ok" : 1 }

mongos> printShardingStatus()
--- Sharding Status ---
  databases:
	{  "_id" : "test",  "partitioned" : true,  "primary" : "shard0000" }
		test.fuga
			shard key: { "id" : 1 }
			chunks:
				shard0000	1
			{ "id" : { "$minKey" : 1 } } -->> { "id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 0)


mongos> sh.moveChunk("test.fuga", {id: {$minKey:1}}, "shard0001");
{ "millis" : 82, "ok" : 1 }

mongos> printShardingStatus()
--- Sharding Status ---
  databases:
	{  "_id" : "test",  "partitioned" : true,  "primary" : "shard0000" }
		test.fuga
			shard key: { "id" : 1 }
			chunks:
				shard0001	1
			{ "id" : { "$minKey" : 1 } } -->> { "id" : { "$maxKey" : 1 } } on : shard0001 Timestamp(2, 0)

チャンクを分割したい

データが集中してチャンクを分割して移動させたいときはsh.splitFind()で中央で分割させます。sh.splitAt()もありますが、均等な分割をさせたほうがマイグレーション的に優しいです。基本、MongoDBに任せたほうがいいのですが、運用途中で分割させないといけないケースが出てるので。必要であれば、moveChunkします。

mongos> printShardingStatus()
--- Sharding Status ---
		test.test_collection
			shard key: { "user_id" : 1 }
			chunks:
				shard0002	2
				shard0000	3
				shard0001	3
			{ "user_id" : { "$minKey" : 1 } } -->> { "user_id" : 0 } on : shard0002 Timestamp(7, 1)
			{ "user_id" : 0 } -->> { "user_id" : 5999 } on : shard0000 Timestamp(8, 1)

mongos> sh.splitFind("test.test_collection", {user_id: 0});
{ "ok" : 1 }

mongos> printShardingStatus()
--- Sharding Status ---
  databases:
	{  "_id" : "test",  "partitioned" : true,  "primary" : "shard0000" }
		test.test_collection
			shard key: { "user_id" : 1 }
			chunks:
				shard0002	3
				shard0000	3
				shard0001	3
			{ "user_id" : { "$minKey" : 1 } } -->> { "user_id" : 0 } on : shard0002 Timestamp(7, 1)
			{ "user_id" : 0 } -->> { "user_id" : 2999 } on : shard0002 Timestamp(9, 0)
			{ "user_id" : 2999 } -->> { "user_id" : 5999 } on : shard0000 Timestamp(9, 1)

コンソール触ってて気づいたこと

  • tabキーを押すと補完が効いたけど、昔からあった??
  • sh,rsから始まるコマンドあったっけ?db.runCommandで実行してたけど、いつから入ったんだろうか?
  • ctrl+rで過去に実行したコマンド検索できるようになってる