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