2019年12月2日
本篇文章给大家介绍DCache的CacheServer中,过期线程-ExpireThread和删除线程-DeleteThread的处理流程。
ExpireThread
作用:定时作业,清理过期数据
在cache 配置列表的第2页:
#是否启动过期清除线程
StartExpireThread=Y
#是否清除后端数据库
ExpireDb=Y
#每次清除过期数据的时间间隔(秒)
ExpireInterval=300
#清除频率, 0 表示不限制
ExpireSpeed=0
StartExpireThread | 清除线程的总开关,配置成”Y”或”y”才会开启功能; |
ExpireInterval | 清除时间间隔,每隔300s执行一次 |
ExpireSpeed | 清除频率,即瞬时清除的数据量。假设配置成1000,则下一个ExpireInterval到来时,删除了1000条过期数据后,会休眠10秒再执行删除 |
ExpireDb | 是否清除后端数据库,在清除缓存的同时,删除数据库中的记录(这里只是将数据的标识置位delSetBit,由Delete线程删除) |
说明:
每一条数据在Set到内存时都可以设置过期时间(在msyql中对应表中的字段为sDCacheExpireTime),ExpireThread就会以此为依据,判断是否设置清理标识。
DeleteThread
作用:定时清理内存(和数据库)中已被标记为delete的数据
脏数据:未同步到后端数据库的内存数据。
配置解析
#是否启动删除线程
StartDeleteThread=Y
#delete线程操作时间间隔(秒)
DeleteInterval=300
#delete线程删除速度,0表示不限速
DeleteSpeed=0
StartDeleteThread | server启动时判断,是否启动删除线程 |
DeleteInterval | delete线程初始化后读取,每个 DeleteInterval 秒,执行一次 |
DeleteSpeed | 每个周期删除的记录数,达到该值后会休眠10s(usleep(10000)) |
还有一部分配置与其他线程共享:
#屏蔽回写时间段(例:0900-1000;1600-1700)
SyncBlockTime=0000-0000
#解除屏蔽回写的脏数据比率
SyncUNBlockPercent=60
#回写db的按天日志文件名后缀
DbDayLog=db
#是否存在DB,Y/N
DBFlag=Y
#DbAccess的obj名称
ObjName=DCache.TestDbAccessServer.DbAccessObj
SyncBlockTime | 屏蔽删除的时间段,在这个时间段内,不执行删除线程;如果有多个时间段,分号”;”分隔 |
SyncUNBlockPercent | 当 脏数据 和 要删除的数据比率大于 SyncUNBlockPercent 时, 解除屏蔽时间(SyncBlockTime失效),正常执行删除 |
DbDayLog | 与db相关的操作,会写到独立的日志文件中,例如:DCache.TestAppSSMMKVCacheServer1-1_db_20191129.log |
处理逻辑总结
- StartDeleteThread=N,不开启删除线程
- 如果在屏蔽时间(SyncBlockTime)段,则不执行删除
- 如果在屏蔽时间段内,但脏数据+应删除数据的比率大于 SyncUNBlockPercent 时,也会执行删除操作
- 每DeleteInterval秒执行一次删除线程
- 如果本周期内 瞬时删除的记录数超过DeleteSpeed,则立即休眠10秒,再执行删除;DeleteSpeed=0时,无此限制
- 如果要删除的数据正处于迁移状态,则删除该主key,继续下一条记录
- 当该条记录的 deleteTime 不为0,且当前时间大于deleteTime时,才会执行删除
- 在DBFlag=Y时,当该记录的mkey在本分片时,只有主节点会执行 删除db中的信息。调用 dbAcess服务(_dbaccessPrx ),删除mysql中的数据
- 删除cache内的数据
- 删除待清理链表中的主key(earseDeleteKey),继续下一条记录
总结
DCache具备自动清理过期数据的能力,异步流程:
- 先由过期线程定期轮询,判断数据是否过期;过期的数据就会被设置标识位(此时未删除!)
- 删除线程会定期获取hash桶中的设置了标识位的数据,之后会调用dbAcess服务清理后端数据库,并清理本地内存和hash桶。
这两个线程都可以灵活配置轮询时间和清理频率(每个批次处理的数据量),除此之外还提供了丰富的配置能力,供开发人员根据业务实际情况进行调整:
- 当过期的数据量较大时,可以通过调整DeleteInterval和DeleteSpeed,来减轻后端数据库的压力
- 当业务高峰时,为保证内存的高效处理,可以设置SyncBlockTime参数来屏蔽内存清理行为
- 当内存压力较大时,可以调整SyncUNBlockPercent参数,来强制删除内存数据。