シャーディングの復習
シャーディングの種類
- 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で過去に実行したコマンド検索できるようになってる