注:Usage Scenario功能从v1.8.1版本开始支持。
Usage Scenario功能,是指对于Pegasus的表,可以指定其使用场景。针对不同的场景,通过优化底层RocksDB的配置,以获得更好的读写性能。
我们知道,RocksDB的LSM-Tree设计具有明显的写放大效应。数据先是写入到memtable中,当memtable满了,就会flush到sstable中,并放在level-0层。当level-0层的文件个数达到预设的限制时,就会触发compaction操作,将level-0层的所有文件merge到level-1层。同理,当level-1层的数据量达到预设的限制时,也会触发level-1层的compaction,将挑选一些文件merge到level-2层。这样,数据会从低层往高层逐层上移。
RocksDB是一个可配置性很强的引擎,上面的各种行为都可以通过配置参数来调节,并且有很多参数都是可以动态修改的。这里给出几个比较关键的配置参数:
Pegasus在提供读写服务的时候,需要考虑这些因素:
level0_slowdown_writes_trigger
的限制,使写操作的延迟陡增;甚至进一步达到level0_stop_writes_trigger
的限制,使写操作失败,影响系统的稳定性和服务的可用性。所幸的是,RocksDB针对这个问题也给出了一些解决方案,譬如在RocksDB-FAQ中给出的方案:
Q: What's the fastest way to load data into RocksDB? A: A fast way to direct insert data to the DB: 1. using single writer thread and insert in sorted order 2. batch hundreds of keys into one write batch 3. use vector memtable 4. make sure options.max_background_flushes is at least 4 5. before inserting the data, disable automatic compaction, set options.level0_file_num_compaction_trigger, options.level0_slowdown_writes_trigger and options.level0_stop_writes_trigger to very large. After inserting all the data, issue a manual compaction. 3-5 will be automatically done if you call Options::PrepareForBulkLoad() to your option
而我们的思路正是:通过针对不同业务场景,设置不同的RocksDB参数,调节RocksDB的行为,以提供更好的读写性能。具体来说:
rocksdb.usage_scenario
来指定当前的业务场景。set_usage_scenario()
方法。目前支持三种场景:
write_buffer_size
以降低sstable的产生速度。通过shell的set_app_envs命令来设置,譬如设置temp表为bulk_load模式:
>>> use temp >>> set_app_envs rocksdb.usage_scenario bulk_load
Table环境变量不会立即生效,大约需要等几十秒后才能在所有replica上生效。
我们提供了一个脚本工具scripts/pegasus_set_usage_scenario.sh来方便地设置,用法:
$ ./scripts/pegasus_set_usage_scenario.sh This tool is for set usage scenario of specified table(app). USAGE: ./scripts/pegasus_set_usage_scenario.sh <cluster-meta-list> <app-name> <normal|prefer_write|bulk_load>
该工具会调用shell命令设置Table环境变量,然后还会检测是否在所有replica上都已经生效,只有所有都生效了才算执行完成。
bulk_load模式通常用于灌数据,但是在灌数据过程中因为消耗大量的CPU和IO,对读性能会产生较大影响,造成读延迟陡增、超时率升高等。如果业务对读性能要求比较苛刻,可以考虑读写分离的双集群方案。
假设两个集群分别为A和B,最初线上流量访问A集群,灌数据流程:
关于如何Manual Compact,请参考Manual-Compact功能。