热点数据分布

在oceanbase数据库中那些操作可以解决热点数据跟负载分布不均衡问题

4 个赞

你的意思是多台Observer的话,其中有一台负载相比于其它Observer比较大,是么,怎么解决这个问题,是吧

1 个赞

学习了

一、自动均衡策略(系统内置,需正确配置)

OceanBase 通过后台任务自动感知并调整负载分布,前提是相关开关启用且参数合理:

  • 启用分区再平衡(Rebalance)
    设置租户级参数 enable_rebalance = true。这是所有自动均衡的前提。开启后,系统会周期性检查各 LS 上 Tablet 数量、资源占用等指标,并触发迁移任务,使 Tablet 分布趋于均匀。
  • 启用分区迁移(Transfer)
    配合 enable_transfer = true,允许系统将 Tablet 从高负载 LS 迁移至低负载 LS。该操作本质是变更 Tablet 的主副本(Leader)所在日志流,不改变数据内容,对业务透明。
  • 调整均衡调度频率与阈值
    可调参如 partition_balance_schedule_interval(默认 2 小时),缩短检查周期可加快响应;partition_balance_threshold 控制触发迁移的负载差阈值(如 Tablet 数偏差 >15% 才启动)。
  • 利用多副本特性分散读压力
    通过设置 read_consistency = weak 或使用 /*+ READ_CONSISTENCY(WEAK) */ Hint,使读请求可路由到 Follower 副本,减轻 Leader 负载。注意:该方式适用于最终一致性可接受的查询场景。

二、人工干预手段(DBA 主动介入)

当自动机制滞后、或需精准控制时,可通过以下命令直接干预:

  • 手动迁移 Tablet(TRANSFER PARTITION)
    使用 ALTER SYSTEM TRANSFER PARTITION ... TO LS <ls_id> 将指定 Tablet 的 Leader 迁移至目标日志流。这是最常用、最直接的热点缓解手段,适用于已定位到具体热点表或分区的情形。
  • 调整 Unit 分布与资源配额
    在负载偏高的 Zone 增加 Unit 数量(ALTER RESOURCE POOL ... UNIT_NUM = N),或为高负载租户分配更多 CPU/内存资源,提升其服务能力。本质是水平扩容,不改变数据分布逻辑。
  • 修改 Primary Zone 策略
    通过 ALTER TENANT ... PRIMARY_ZONE = 'zone1;zone2;zone3' 设定多 Zone 轮询模式,使新创建的 Tablet Leader 更均匀地分布在多个 Zone,避免初始分布倾斜。
  • 强制刷新缓存与计划(谨慎使用)
    若热点由 SQL 执行计划固化(如绑定错误索引)引起,可清空计划缓存(ALTER SYSTEM FLUSH PLAN CACHE)或重新收集统计信息(DBMS_STATS.GATHER_TABLE_STATS),促使优化器生成更优路径,间接降低单点压力。

三、设计与使用层面的规避措施

从根本上减少热点风险,需在建模与开发阶段遵循最佳实践:

  • 避免单点写入设计
    不要使用单调递增字段(如自增 ID、时间戳前缀)作为分区键(Partition Key)。推荐使用哈希(HASH)、组合键(如 user_id % 100)或 UUID 衍生字段,使数据写入天然分散到多个分区。
  • 合理选择分区类型与数量
    对高频写入表,优先采用 KEYHASH 分区(而非 RANGE),并确保分区数足够(建议 ≥ 64,避免单分区过热);复制表虽无分区,但可通过 TRANSFER 补救。
  • 控制大事务与批量写入节奏
    避免单事务写入海量行;拆分批量操作为小批次(如每次 ≤ 1000 行),减少单次日志生成量和锁持有时间,缓解 LS 瞬时压力。
  • 监控驱动优化
    依赖 GV$OB_LOG_STAT(LS 级负载)、GV$OB_TABLET_STAT(Tablet 级 IO)、CDB_OB_TABLE_LOCATIONS(位置映射)等视图持续观察,早发现、早干预,而非等问题爆发。

三板斧解决热点/负载不均:

  1. 分区打散:用 Hash 分区按分区键把数据均匀切到不同分区/机器。别用 Range 把热点堆在最新段,分区键选错是根因。
  2. leader 分散:调 Primary Zone,把读写主副本分摊到不同 Zone/节点,别全压一台。
  3. 自动+手动均衡:RootService 自动迁移 Unit、再平衡;热点明显时手动 ALTER SYSTEM REBALANCE 或把热分区迁到空闲节点。小维表用复制表(Duplicated Table)免跨节点查。

学习了