OB转储与合并
一:基于 LSM Tree 的实践:分层转储
为了优化转储越来越慢的问题,引入了“分层转储”机制:
1. 多层compaction策略:新增 L0 层:被冻结的 MemTable 会直接 flush 为 Mini SSTable,可同时存在多个Mini SSTable。
2. 架构变化: 3层 Vs 4层
1. 3层架构:
memtable + minor sstable(L1) + major sstable (L2)
2. 4层架构:
memtable + mini sstable(L0) + minor sstable(L1) + major sstable (L2)
3. 参数 minor_compact_trigger 控制L0层 Mini SSTable 总数
4. 参数 major_compact_trigger 控制 memtable dump flush 次数达到时触发 major compaction
二:定时合并
由major_freeze_duty_time参数控制定时合并时间,默认值晚上凌晨两点。
可以修改参数控制合并时间:
alter system set major_freeze_duty_time='02:00'
三:自动触发合并
当租户的 MemStore内存使用率达到freeze_trigger_percentage参数的值,
并且转储的次数已经达到了minor_freeze_times参数的值,会自动触发合并。
四:手动合并
可以在"root@sys"用户下,通过以下命令发起手动合并(忽略当前MemStore的使用率)
alter system major freeze;
五:轮转合并
通过参数 enable_merge_by_turn 开启或者关闭轮转合并。
以ZONE为单位轮转合并,只有一个ZONE合并完成后才开始下一个ZONE的合并;合并整体时间变长。
某一个ZONE的合并开始之前,会将这个ZONE上的Leader服务切换到其它ZONE;切换动作对长事务有影响。
六:可通过以下几项控制每日合并的策略:
eg:
alter system set enable_manual_merge = false; -- 关闭手动合并
alter system set enable_merge_by_turn = true; -- 开启轮转合并
alter system set zone_merge_order = 'z1,z2,z3'; -- 设置合并顺序,只对轮转合并有效。
alter system set zone_merge_order = ''; -- 取消自定义合并顺序
eg:
alter system set enable_manual_merge = true; -- 打开手动合并
alter system start merge zone='z1'; --手动调度z1开始合并
由参数zone_merge_timeout定义超时合并时间阈值;默认值为'3h'(3个小时)。
七:手动触发转储
ALTER SYSTEM MINOR FREEZE; --当什么选项都不指定时,默认对所有observer上的所有租户执行转储。
手动触发的转储次数不受参数minor_freeze_times的限制,即手动触发的转储次数即使超过设置的次数,也不会触发合并(Major Freeze)。
八:转储场景的常用配置方法
1. 减小freeze_trigger_percentage的值(比如40),使MemStore尽早释放,进一步降低MemStore写满的概率。
2. 增大minor_freeze_times的值,尽量避免峰值交易时段触发合并(Major Freeze),将合并的时机延后到交易低谷时段的每日合并(major_freeze_duty_time)。