主备HBase集群同步致ZooKeeper zxid耗尽,能否减少setdata操作?
HBase主备同步期间,/hbase/replication/xxx路径下的节点主要用来记录各复制peer的WAL进度,频繁的setdata操作正是因为主集群在持续向ZK同步这些进度,进而导致ZK zxid快速耗尽。以下是几种可行的优化手段:
调整复制进度刷新间隔
修改HBase配置项hbase.replication.status.check.interval,默认值是30秒,可根据业务对数据一致性的容忍度适当调大(比如120秒、300秒)。间隔越长,ZK收到的setdata请求越少,但要注意不能过长,避免出现故障时恢复数据的丢失量超出可接受范围。开启批量更新复制进度
如果你使用的是HBase 2.x及以上版本,可开启hbase.replication.batch.updates.enabled为true。这个配置会让复制模块把多个peer的进度更新打包成一次ZK操作,直接减少setdata的调用次数。清理冗余复制节点
检查/hbase/replication/路径下的节点,删除已经停用的备集群对应的peer节点、过期的复制队列。这些冗余节点的存在会导致主集群持续无效的setdata操作,清理后能直接降低请求量。切换复制进度存储介质
部分新版本HBase支持将复制进度存储到HBase内部表而非ZK,通过配置hbase.replication.state.storage.impl为org.apache.hadoop.hbase.replication.state.TableBasedReplicationStateStorage,完全绕开ZK的setdata操作。注意这个配置需要确认版本兼容性,上线前务必做充分测试。ZK层面临时缓解(非根治)
可以调整ZK的txnLogSizeLimit参数,增大事务日志的容量,延缓zxid耗尽的时间,但这只是临时方案,核心优化还是要从HBase复制配置入手。
内容的提问来源于stack exchange,提问作者user20299694

