MST
星途 面试题库

面试题:Hbase中Major Compaction触发后对数据一致性和读写性能的复杂影响

当Hbase中的Major Compaction被触发后,从数据一致性角度分析它是如何保证数据准确性的,同时说明在触发过程中以及完成后对读写性能分别会产生怎样的复杂影响,并且如何通过配置参数来尽量降低对业务的干扰。
17.2万 热度难度
数据库Hbase

知识考点

AI 面试

面试题答案

一键面试

数据一致性保证

  1. 合并数据:Major Compaction会将多个StoreFile合并成一个大的StoreFile。在合并过程中,HBase会按照时间戳对数据进行排序。对于相同RowKey、ColumnFamily和Qualifier的数据,保留时间戳最新的版本。这样就确保了最终存储的数据是最新且准确的,从数据一致性角度保证了每个单元格的数据是最新有效的版本。
  2. 删除过期数据:HBase中的数据可以设置TTL(生存时间)。Major Compaction过程中,会识别并删除那些已经过期的数据。通过这种方式,避免了过期数据对数据一致性的干扰,确保数据集中仅保留有效的数据。

对读写性能的影响

  1. 触发过程中
    • 读性能
      • 增加读放大:Major Compaction期间,由于StoreFile在合并,可能会导致读操作需要从更多的文件中读取数据。例如,原本可以从一个较小的StoreFile中快速读取到的数据,现在可能需要从多个正在合并的StoreFile中读取,这增加了读操作的I/O开销,降低了读性能。
      • 可能出现短暂卡顿:当正在进行合并的StoreFile与读操作所涉及的文件重叠时,可能会出现短暂的读操作等待,因为合并操作可能会占用磁盘I/O资源,导致读操作无法及时获取所需数据,从而造成卡顿。
    • 写性能
      • I/O资源竞争:Major Compaction会占用大量的磁盘I/O资源来进行文件的读取和写入合并操作。而写操作同样需要磁盘I/O资源将数据写入MemStore(之后再刷写到StoreFile),这就导致写操作和Compaction操作竞争I/O资源,写性能会显著下降。
      • 写入延迟增加:由于I/O资源竞争,写入操作可能需要等待Compaction操作释放部分I/O资源后才能继续进行,从而导致写入延迟大幅增加。
  2. 完成后
    • 读性能
      • 读性能提升:合并后StoreFile数量减少,读操作时需要遍历的文件数量减少,I/O开销降低,读性能得到提升。例如,之前需要从10个小的StoreFile中读取数据,合并后只需要从1个大的StoreFile中读取,减少了文件切换和I/O寻址时间,提高了读效率。
    • 写性能
      • 写性能恢复:Major Compaction完成后,I/O资源竞争问题得到缓解,写操作不再与Compaction操作竞争I/O资源,写性能逐渐恢复到正常水平。但如果写入数据量较大,新生成的StoreFile可能很快又会触发下一轮的Compaction,写性能可能再次受到影响。

通过配置参数降低对业务干扰

  1. 设置Compaction时间窗口
    • 参数:可以通过hbase.hregion.majorcompaction参数设置Major Compaction的周期,单位为毫秒。例如,将其设置为一周的毫秒数(一周 = 7 * 24 * 60 * 60 * 1000),可以让Major Compaction在一周的特定时间进行,尽量避开业务高峰期。
    • 效果:通过合理安排Compaction时间,减少对业务读写操作的直接影响,确保业务高峰期系统性能不受Compaction的干扰。
  2. 调整I/O资源分配
    • 参数hbase.regionserver.optionalcacheflushinterval参数可以控制MemStore刷写的时间间隔,适当增大这个参数值,可以减少在Major Compaction期间MemStore刷写的频率,从而减少I/O资源竞争。例如,默认值为1小时,可以适当调整为2 - 3小时(但要注意不能过大,以免占用过多内存)。
    • 效果:降低了写操作和Major Compaction操作同时竞争I/O资源的可能性,缓解了对写性能的影响。同时,也可以通过hbase.hstore.compaction.max参数限制一次Compaction合并的StoreFile数量,避免I/O资源过度消耗,从而减少对读性能的影响。例如,将其设置为较小的值(如3 - 5),可以降低每次Compaction的I/O压力。
  3. 启用异步Compaction
    • 参数:在HBase 2.0及以上版本,可以通过配置hbase.hstore.compaction.use.async.compaction=true启用异步Compaction。
    • 效果:异步Compaction将Compaction操作放到单独的线程池中执行,减少对主线程的阻塞,降低对读写操作的影响。特别是对于读操作,不会因为Compaction操作而出现长时间等待,提高了系统整体的并发性能。