流量控制是指通过一些手段来控制读写请求的速度。
为什么要做流量控制?主要是减小集群压力,提升稳定性。如果集群的写流量太大,就会消耗大量的系统资源(CPU、IO等),从而影响读请求的延迟。有些业务对读性能要求比较高,如果对写流量不加控制,就无法保证服务质量。
从流控的作用位置来看,可分为:
从流控的粒度来看,可分为:
目前Java客户端提供了流控工具,参见Java客户端文档#流量控制。
从v1.11.2版本开始,Pegasus支持Server端表级流控,目前只针对写操作。另外,从v1.12.0版本开始增加了基于吞吐量的限流。
实现原理:
replica.write_throttling
和replica.write_throttling_by_size
环境变量。其中replica.write_throttling
是基于qps的限流,replica.write_throttling_by_size
是基于吞吐量的限流。write_throttling流控目前支持两种操作类型:
环境变量replica.write_throttling
/replica.write_throttling_by_size
的value格式:
{delay_qps_threshold}*delay*{delay_ms},{reject_qps_threshold}*reject*{delay_ms_before_reject}
注:
示例:
$ ./run.sh shell >>> use temp OK >>> set_app_envs replica.write_throttling 1000*delay*100,2000*reject*200 set app envs succeed >>> get_app_envs get app envs succeed, count = 1 ================================= replica.write_throttling = 1000*delay*100,2000*reject*200 ================================= >>>
上面我们设置了temp
表的write_throttling配置为1000*delay*100,2000*reject*200
,这个配置的意思是:当QPS超过1000时,就开始执行delay操作;当QPS超过2000时,就开始执行reject操作。
待补充。