写入限流
GreptimeDB 企业版支持按数据库限制每秒写入的行数。同一数据库中的所有表共享 限流额度,每个数据库可以独立配置。该功能适用于单机和分布式部署。
限流机制
限流分为两部分:在本地决定是否接受一个写入批次,以及在分布式模式下将 数据库的行数额度分配给各个 Frontend。本地令牌桶负责写入准入,Metasrv 根据心跳反馈重新分配额度。
客户端写入在准入检查时消耗行数额度,此时尚未向存储节点分发写入请求。 写入协议转换后生成的行也计入目标数据库的额度。Flow 生成的内部写入不消耗 限流额度。
下图展示了分布式部署中的处理流程。每个 Frontend 上的每个数据库都遵循 相同的反馈机制,虚线箭头表示心跳消息:
突发写入和大批次
每个 Frontend 或单机实例使用令牌桶限流,桶容量等于该节点一秒的有效行数 额度。额度随时间补充。
只要桶内至少有一个完整的行令牌,就可以接受一个批次,即使该批次超过剩余 额度。超出的部分会形成债务,由后续补充的额度偿还。在重新获得足够额度 之前,后续写入会被拒绝。这使大于限流额度的批次仍能完成写入,但大批次可能 导致之后较长一段时间内的写入被拒绝。
例如,当额度固定为每秒 1,000 行时,一个满桶可以接受 3,000 行的批次,并产生 2,000 行的债务。在债务偿还完毕且至少补充一个新令牌之前,后续写入会被拒绝。
写入通过准入检查后,即使后续存储处理失败,已消耗的额度也不会退还。 关闭后重新开启限流不会清除尚未偿还的债务。