17.Mongodb预分片(pre-split)/autosplit(chunk/jumbochunk相关)

可以参考分片集群的介绍  这里

关于balancer的介绍(split对性能影响的测试)  这里

零、使用经验

问题一、预分片的话chunk数如何确定?

目前有40亿条数据,长期来看要存200亿+数据;每条数据0.5KB;现在总共是分了1000个集合。200亿数据均分下去的话每个集合存2000万条数据,存储占用为1000万KB=10000M。chunk数=10000M/64M = 156个。考虑到倾斜numInitialChunks为200即可。 以这个依据决定预分片是大致合理的。

注:哈希分片才能用numInitialChunks,如果是范围分片的话,则需要手动splitAt

问题二、jumbo chunk带来的问题。

①如果这些jumbo chunk是高频访问的,就会引起但shard的性能瓶颈;②另外就是chunk无法迁移,会引起shard间的是数据不均匀。(很好理解,就是这个分片的数据太多了会有瓶颈。

不过头4.4+之后可以通过设置来使得jumbo chunk可以被移动(这里),一定程度能缓解其带来的问题(例如:一个shard上有好多个jumbochunk,至少可以一定一部分到其他shard上去了)。但是总的来讲还是要尽量避免jumbo chunk产生的。

一、为什么要预先分片

        有的时候mongodb的读写量并不是很大,但是cpu负载相对较高;另外有时候在迁移数据的时候发现整体的进度好慢。这个时候可能就需要留意两种情况了:一个是mongodb是否频繁的balance;另一个是否有频繁的split操作。通过手动预分片我们可以尽量的避免这种频繁balance和split对cpu和IO资源的消耗。

二、chunk数/chunk范围/jumbochunk的查看

        还是那句话,建立反馈机制非常重要。最理想的情况就是你的每一个操作都有迹可循、都能看到操作前后的不同。

(1)sh.status()  查看chunk的信息 (考虑到输出信息太多,所以不是很推荐)

我们可以通过sh.status()查看各个集合分片情况,包括是否分片(分片键/分片方式等信息)、balancing是否打开、chunks的信息(包括每个分片有多少chunks/每个chunks的起止范围)。如下图所示:

(2)通过config库的chunks表查看chunk信息(推荐)

#很简单。看一下其中的数据组成就知道怎么看了
db.chunks.find().pretty()

{
        "_id" : "db_imsdk_roaming.collection_11-appid_MinKey",
        "ns" : "db_imsdk_roaming.collection_11",
        "min" : {
                "appid" : { "$minKey" : 1 }
        },
        "max" : {
                "appid" : NumberLong("-6148914691236517204")
        },
        "shard" : "cmgo-g1ydokzz_0",
        "lastmod" : Timestamp(1, 0),
        "lastmodEpoch" : ObjectId("60ed93131763e87001393b56"),
        "history" : [
                {
                        "validAfter" : Timestamp(1626182419, 123),
                        "shard" : "cmgo-g1ydokzz_0"
                }
        ]
}


#筛选jumbo chunk,就可以看到有多少个jumbochunk了
use config
db.chunks.find({"jumbo":true})

想查看某集合的chunk情况执行如下指令就可以了:

db.chunks.find({ns:"db_pre_split.coll_0"})
#如果只想查看起止范围就指定min/max字段
db.chunks.find({ns:"db_pre_split.coll_0"},{min:1,max:1})
#如果只是想查看chunk数量就直接统计一把
db.chunks.find({ns:"db_pre_split.coll_0"},{min:1,max:1}).count()

(3)db.coll_name.getShardDistribution()

每个分片有多少chunk/预估每个chunk的文档数/预估每个chunk的存储占用 等信息。

db.collection_event_track_986.getShardDistribution()

 

(4)查看chunk块大小的函数

AllChunkInfo = function(ns, est){
	var chunks = db.getSiblingDB("config").chunks.find({"ns" : ns}).sort({min:1}); //this will return all chunks for the ns ordered by min
	//some counters for overall stats at the end
	var totalChunks = 0;
	var totalSize = 0;
	var totalMsgNum = 0;
	var totalEmpty = 0;
	print("                     ChunkID,                             Shard,ChunkSize,ObjectsInChunk"); // header row
	// iterate 
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焱齿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值