title: Backup Request layout: page menubar: administration_menu

背景

在当前的Pegasus实现中,由于向secondary读取会导致不一致的情况发生,所以目前Pegasus仅仅支持对primary副本的读取。但是在某些情况下(例如:负载均衡、热点写入等)经常会导致primary不稳定。所以我们希望在primary不稳定时能够读取secondary,通过牺牲部分强一致性来降低请求的长尾并提高系统的可用性。backup request便是用来实现此功能的。

设计实现

backup reqeust的实现原理比较简单:当client向primary发送请求后,如果经过一段时间延时后(通常是p999),如果其response仍然没有返回,则随机选择一台secondary并向其发送backup request。最后获取最快返回来的response进行处理。

这里发送secondary请求的延时我们建议选择p999,因为backup request操作是用来实现消除长尾的,并不是提升集群性能的。如果将该值设置过低,则会由于backup request的请求量过大而导致集群压力增大(假设选择p50作为其延时,这样便会有50%的请求向secondary发送请求,系统负载便会增大50%)。

如何使用

在Pegasus java client中,我们增加了一个接口,通过该接口可以打开某个表的backup reqeust功能。其实现如下:

public PegasusTableInterface openTable(String tableName, int backupRequestDelayMs) throws PException;

相比于老版本的openTable接口,我们增加了一个backupRequestDelayMs参数。这个参数便是上文所指的时延,即:向primary发送请求,如果过了backupRequestDelayMs毫秒response仍没有返回,则向secondary发送backup request。需要注意的是,backupRequestDelayMs <= 0代表禁用backup reqeust功能。

另外在老版本的openTable接口中,backup request功能默认是关闭的。

性能测试

set/get operation:

test caseenable backup requestqpsread/write propotionread avgread p95read p99read p999read p9999write avgwrite p95write p99write p999write p9999
3-clients 15-threadsno1 : 37076880.6512836149132428.0727.0138495.0988671.02495.07108015405176319.09023.036319.0531455.0
3-clients 15-threadsyes, delay 138ms1 : 369871010.1412488662884403.0 7747.0138751.0153599.02476.1043804447536859.09119.013759.0185855.0
3-clients 100-threadsno1 : 0140607707.989609781474.02731.05511.0167551.0
3-clients 100-threadsyes, delay 5ms1 : 0774291288.014619342935.03487.06323.071743.0-------------------
3-clients 30-threadsno30 : 187198306.9600544730426513.0805.04863.028271.01369.46698746729382661.05795.022319.051359.0
3-clients 30-threadsyes, delay 5ms30 : 188541298.22470022339127493.0711.04483.018479.01467.61309637289973263.06411.017439.050975.0

Multi-get/Batch-Set operation:

test caseenable backup requestqpsread/write porpotionread avgread p95read p99read p999read p9999write avgwrite p95write p99write p999write p9999
3-clients 7-threadsno20 : 124113200.37956913733476277.0410.02317.021647.02034.19237684633824283.06427.018271.062687.0
3-clients 7-threadsyes, deley 2ms20 : 123756197.48540031650361268.0351.02173.05759.02187.1990777646274531.06551.021551.063999.0
3-clients 15-threadsno20 : 130980236.7482510418767348.0526.03535.025695.05361.38005367126214087.020223.040639.090815.0
3-clients 15-threadsyes, delay 3ms20 : 130483244.1182599024727386.0540.03105.013287.05377.99215533936514119.019535.031311.0103103.0