因服务器资源限制,为每日写入200G的系统搭建Mongodb分片集群时,选择的是一主一从一仲裁节点的搭建模式。主从主机逻辑卷划分约27T存储空间。
开始搭建时,将分片1的数据写入到lv1中。目前已使用约23T。
今日添加lv2,约27T存储,并添加分片2,数据存储指向lv2。所有操作执行完成。但经过8小时的观察,分片1已有集合数据未能通过均衡器迁移到分片2上。
主要有两个问题想请教:
①分片1的逻辑卷有27T空间,数据最大能写入多大的存储空间?总容量的85%?
②已有集合数据未能均衡到新的分片,可能是哪里有问题?
期待各位老师的指导,感恩与感谢。
因社区上传图片一直报错,此处贴上查询结果:
mongos> db.stats()db.stats()
{
“raw” : {
“shard3/192.168.1.167:22003,192.168.1.168:22003” : {
“db” : “rf_db”,
“collections” : 0,
“views” : 0,
“objects” : 0,
“avgObjSize” : 0,
“dataSize” : 0,
“storageSize” : 0,
“numExtents” : 0,
“indexes” : 0,
“indexSize” : 0,
“scaleFactor” : 1,
“fileSize” : 0,
“fsUsedSize” : 0,
“fsTotalSize” : 0,
“ok” : 1
},
“shard2/192.168.1.167:22002,192.168.1.168:22002” : {
“db” : “rf_db”,
“collections” : 6,
“views” : 0,
“objects” : 238588633,
“avgObjSize” : 103180.52150836121,
“dataSize” : 24617699578907,
“storageSize” : 24775974219776,
“numExtents” : 0,
“indexes” : 14,
“indexSize” : 7591469056,
“scaleFactor” : 1,
“fsUsedSize” : 24908139327488,
“fsTotalSize” : 29992543059968,
“ok” : 1
}
},
“objects” : 238588633,
“avgObjSize” : 103180,
“dataSize” : NumberLong(“24617699578907”),
“storageSize” : NumberLong(“24775974219776”),
“numExtents” : 0,
“indexes” : 14,
“indexSize” : 7591469056,
“scaleFactor” : 1,
“fileSize” : 0,
“ok” : 1,
“operationTime” : Timestamp(1641978491, 616),
“$clusterTime” : {
“clusterTime” : Timestamp(1641978491, 616),
“signature” : {
“hash” : BinData(0,”PPsrhnJIPunsfMQpXCbKRFmeS8U=”),
“keyId” : NumberLong(“7015467819726798850”)
}
}
}
mongos>mongos> sh.status()sh.status()
— Sharding Status —
sharding version: {
“_id” : 1,
“minCompatibleVersion” : 5,
“currentVersion” : 6,
“clusterId” : ObjectId(“608a2217e1b722d5ac04c74f”)
}
shards:
{ “_id” : “shard2”, “host” : “shard2/192.168.1.167:22002,192.168.1.168:22002”, “state” : 1 }
{ “_id” : “shard3”, “host” : “shard3/192.168.1.167:22003,192.168.1.168:22003”, “state” : 1 }
active mongoses:
“4.2.8” : 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:
512 : Success
databases:
{ “_id” : “config”, “primary” : “config”, “partitioned” : true }
config.system.sessions
shard key: { “_id” : 1 }
unique: false
balancing: true
chunks:
shard2 512
shard3 512
too many chunks to print, use verbose if you want to force print
{ “_id” : “rf_db”, “primary” : “shard2”, “partitioned” : true, “version” : { “uuid” : UUID(“dd83579d-2fc8-49df-889e-8fa6cb1adce9”), “lastMod” : 1 } }
rf_db.pho
shard key: { “files_id” : 1, “n” : 1 }
unique: false
balancing: true
chunks:
shard2 1
{ “files_id” : { “$minKey” : 1 }, “n” : { “$minKey” : 1 } } –>> { “files_id” : { “$maxKey” : 1 }, “n” : { “$maxKey” : 1 } } on : shard2 Timestamp(1, 0)
rf_db.pho2
shard key: { “files_id” : 1, “n” : 1 }
unique: false
balancing: true
chunks:
shard2 1
{ “files_id” : { “$minKey” : 1 }, “n” : { “$minKey” : 1 } } –>> { “files_id” : { “$maxKey” : 1 }, “n” : { “$maxKey” : 1 } } on : shard2 Timestamp(1, 0)mongos>
是Ojbect超过16M了。
继续请教一下,object超过16M之后无法创建chunks索引,该如何处理呢?
可以尝试找到单个文件超过16M的文档并将其删除,再创建,是否可行呢?
从sh.status来看,只有shard2存在一个chunk而已。range分片默认会在primary shard创建一个chunk。当数据进来的时候会进行数据平衡。默认chunk是64m.
你现在rf_db.pho&rf_db.pho2是多大。
db.pho.stats()
db.pho2.stats()
你刚开始是未分片,然后进行分片吗?从没有分片转成分片时,有大小限制的。
现在不能传图片了。
以下格式不好看。
以下是具体链接
https://docs.mongodb.com/upcoming/reference/limits/
Sharding Existing Collection Data Size
根据shard key的平均值+chunk 大小来决定未分片集合的最大大小限制如下:
Average Size of Shard Key Values
512 bytes
256 bytes
128 bytes
64 bytes
Maximum Number of Splits
32,768
65,536
131,072
262,144
Max Collection Size (64 MB Chunk Size)
1 TB
2 TB
4 TB
8 TB
Max Collection Size (128 MB Chunk Size)
2 TB
4 TB
8 TB
16 TB
Max Collection Size (256 MB Chunk Size)
4 TB
8 TB
16 TB
32 TB
感谢回复。确实如您所说,最开始不是分片,现在需要增加分片。
db.pho数据为22T,db.pho2为60G。
现在需要为db.pho增加chunks索引时,报错。
执行:sh.shardcol1ection(“db.pho.churks” , {“files_id”: 1,”n”:1 } )
返回:”code”:10334,
“errmisg” : “esowobj size:42819740(0.280509C) is inwalid. size must be between 0 and 16795(13ns) First element: operationTime:timestamp(15013221,22)..
详细日志:
[ShardRegistry] warning: log line attempted (41816kB) over max size (10kB), printing beginning and end … Assertion: BSONObjectTooLarge: BSONObj size: 30896244 (0x1D77074) is invalid. Size must be between 0 and 16793600(16MB) First element: splitKeys: [ { files_id: ObjectId(‘609340a641337455d8999886’), n: 0 }
搜索资料,这是数据库同步有问题了吗?有建议说只能重建数据库,但是我的库比较大。
能否手工设置到一个同步时间段,舍弃这个时间段之前的数据,然后让均衡器来均衡这个时间段之后的数据呢?
通过增大chunksize得到解决
感谢您的回复。
目前rf_db.pho 数据为22T。rf_db.pho2为60G。
确实如您所说,最开始分片是失败的,现在添加分片后未正常写入分片数据,因此我对rf_db.pho.chunks 添加索引,但是在报错。还想继续请教一下。
执行:sh.shardcol1ection(“rf_db.pho.chunks” , {“files_id”: 1,”n”:1 } )
返回:”code”:10334,
“errmisg” : “esowobj size:42819740(0.280509C) is inwalid. size must be between 0 and 16795(13ns) First element: operationTime:timestamp(15013221,22)..
详细日志提示:[ShardRegistry] warning: log line attempted (41816kB) over max size (10kB), printing beginning and end … Assertion: BSONObjectTooLarge: BSONObj size: 30896244 (0x1D77074) is invalid. Size must be between 0 and 16793600(16MB) First element: splitKeys: [ { files_id: ObjectId(‘609340a641337455d8999886’), n: 0 }
搜索了一下,大家意思是这个是数据同步异常,需要重建副本。但我的数据比较大。是否有其他处理办法呢?或者能否手工设置一个同步的时段,让均衡器将该同步时段之后的数据用来做均衡?
这部分资料较少,未找到有帮助的,所以再来请教。