合并的过程可以通过内部表进行查看,通常合并的时间是取决于两次合并之间的数据变化量。两次合并之间的数据变化大,合并的时间会更长。同时,合并的线程数,合并时的集群压力,是否轮转合并等都影响合并的时间长短。
观察合并的过程可以通过如下语句查询:
obclient> SELECT * FROM __all_zone WHERE name LIKE '%merge%';
参数 | 说明 |
---|---|
is_merge_error | 合并是否出错。 |
last_merged_version | 集群所有 Zone 和最后合并版本。 |
merge_status | 合并状态 IDLE,ERROR,TIMEOUT,MERGING。 |
all_merged_version | 所有 Zone 合并的版本。 |
is_merge_timeout | 合并是否超时。 |
last_merged_time | 最后合并的时间。 |
last_merged_version | 最后合并的版本。 |
merge_start_time | Zone 开始的合并时间。 |
如果合并时间比较长,并且两次合并之间的增量很大,可以通过一下语句查看内部表来查看合并进度:
obclient> SELECT * FROM __all_virtual_partition_sstable_image_info;
字段名称 | 类型 | NULL | 描述 |
---|---|---|---|
zone | varchar(256) | NO | zone 名称 |
svr_ip | varchar(32) | NO | IP 地址 |
svr_port | bigint(20) | NO | 端口号 |
major_version | bigint(20) | NO | 大版本号 |
min_version | bigint(20) | NO | 小版本号 |
ss_store_count | bigint(20) | NO | SSStore 总数量 |
merged_ss_store_count | bigint(20) | NO | 合并完成的 SSStore 总数量 |
modified_ss_store_count | bigint(20) | NO | 修改过的 SSStore 总数量 |
macro_block_count | bigint(20) | NO | 宏块总数量 |
use_old_macro_block_count | bigint(20) | NO | 重用的宏块数量 |
merge_start_time | timestamp(6) | NO | 合并开始时间 |
merge_finish_time | timestamp(6) | NO | 合并结束时间 |
merge_process | bigint(20) | NO | 合并进度 |
rewrite_macro_old_micro_block_count | bigint(20) | NO | 重用的微块数量 |
rewrite_macro_total_micro_block_count | bigint(20) | NO | 写入的微块数量 |
除了通过内部表查看合并进度,也可以通过日志查看 Partiton 粒度的合并,每个 Partition 开始和成功合并的记录:
egrep "begin to merge partition|succ to merge partition" observer.log
通过内部表 __all_virtual_partition_sstable_image_info
除了可以查看 progress,也可以查看 Macro Block 级别的进度。Macro Block 为 2 MB 大小,因此比 Partition 级别的粒度更细。在合并中如果遇到单一 Partition 非常大的情况,可以观察这个内部表的 macro_block_count
和 use_old_macro_block_count
这两列,当他们的值在不断变化,表示合并仍然在进行。