查詢分片集合返回主分片和其他分片的所有結果
我嘗試設置一個分片來測試這個功能,並可能將我們的一些數據遷移到其中。
我遵循了文件指南https://docs.mongodb.com/v3.4/tutorial/convert-replica-set-to-replicated-shard-cluster/
所以我有一個第一個副本 rs0(包含 2 個伺服器)、一個副本 rs1(包含 2 個伺服器)和一個配置副本(包含 2 個用於測試的伺服器,我知道我應該在生產中至少使用 3 個)
現在,當我連接 mongos 實例時,我看到 rs0 是我的主分片。我分片的集合包含 1,000,000 個文件。rs1 包含 1 個塊,其中包含大約 500,000 個文件。如果我在 mongos 中執行 db.partitioned_collection.count() 它返回 1,500,000。而我預計它會返回 1,000,000。
我知道主分片包含所有未分片的文件,但是 mongos 應該只查詢 rs0 塊內的數據,不是嗎?
我究竟做錯了什麼 ?
我的 sh.status() 結果是:
--- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5b992a952e6c702f9dd5b675") } shards: { "_id" : "rs0", "host" : "rs0/mongo-test:27017,mongo-test:27018", "state" : 1 } { "_id" : "rs1", "host" : "rs1/mongo-test:27019,mongo-test:27020", "state" : 1 } active mongoses: "3.6.7" : 1 autosplit: Currently enabled: yes balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: 2 : Success databases: { "_id" : "config", "primary" : "config", "partitioned" : true } config.system.sessions shard key: { "_id" : 1 } unique: false balancing: true chunks: rs0 1 { "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : rs0 Timestamp(1, 0) { "_id" : "test", "primary" : "rs0", "partitioned" : true } test.partitioned_collection shard key: { "number" : 1 } unique: false balancing: true chunks: rs0 2 rs1 1 { "number" : { "$minKey" : 1 } } -->> { "number" : 4794 } on : rs1 Timestamp(2, 0) { "number" : 4794 } -->> { "number" : 9586 } on : rs0 Timestamp(2, 1) { "number" : 9586 } -->> { "number" : { "$maxKey" : 1 } } on : rs0 Timestamp(1, 2)
更新#1:
看來我完全誤讀了以下文件https://docs.mongodb.com/v3.6/core/sharded-cluster-shards/#primary-shard。實際上,主分片不保存未分片的文件,而是保存未分片的集合……
所以現在的問題是為什麼我的主分片(rs0)應該只包含 2 個塊,仍然包含整個集合數據?
我終於再次測試以完全遵循https://docs.mongodb.com/v3.6/tutorial/convert-replica-set-to-replicated-shard-cluster/上的範例。而這一次它確實奏效了…… rs0 花了一些時間(不知道確切的時間)來刪除移動的文件,但幾分鐘(或幾十分鐘)後它們就不再存在了。
我試圖記住我第一次做的不同之處。我想知道我是否在 rs0 直接在 rs0 副本集上成為分片的一部分後插入了測試數據。據我了解,我們不能直接在分片副本集上插入/更新數據。