TiFlash 存算分离两个 Write节点的 Region 分布不均匀

可以看到,昨天 20点之后,两台机器的 Score 得分开始不一样, store-18195849145 的Score 还是变低。从Local磁盘大小来说确实store-18195849145 的使用量更少,但是实际上 Remote 的数据,store-18195849150已经远远比store-18195849145更少了,还一直在进行 balance 从18195849150到18195849145搬移数据.

1 个赞

这里贴一下群里的反馈总结:

  1. 为什么会导致分布倾斜?
    PD 目前没有对象存储使用量的上报口。如果 tiflash 把对象存储的使用量当作 used size 上报,当对象存储的存储量接近本地盘容量的话,会导致 PD 停止调度 region 到那个 store 上。无法达到减少 write node 硬件成本的目的。
    目前 write node 上报的 store 的使用量按照本地盘算,确实可能会导致调度不均衡。
  2. 最终会达到稳态么?
    TiFlash 的数据分为 Delta 层(新写入的小数据块)和 Stable 层。Delta 层的数据写入后累积达到阈值(一般 100w 行左右)会 Compact 为 Stable 层。Delta 层的数据也会上传 S3,但是本地数据需要等 Compact 为 Stable 层的时候才会清理。Stable 层的数据在上传 S3 之后会清理本地数据。本地的 delta 数据涨到一定程度后,维持在一个稳定的位置。
    也就是如果数据一直都有大量写入,最终两者会是均衡的,但是如果两者写入速度有差异,一个先写完,另外一个写的比较慢,两者 Local 盘数据量有差异,就会导致这个差异一直存在,两者永远不会均衡。

解决方案:
设置两个 tiflash write node,并且表的 tiflash 副本也设置为 2 副本,并且设置 LOCATION LABELS。

alter database db_name.table_name set tiflash replica 2 LOCATION LABELS "host";
  • 优点: 既能保证数据不倾斜,也可以保证高可用,在滚动重启 Write Node 时不会引起业务查询报错
  • 缺点: 内存使用量翻倍,Remote 存储容量也会翻倍,成本更高。
1 个赞

这里再补充一下,还有个前提条件,需要对 Write Node 设置Labels,否则 LOCATION LABELS 并不会生效。只有设置了不同的 Labels,才能真正保证同一个 Region 的两个副本一定分散到两个节点上。
最终效果如下:虽然两个 Write 节点的 Store Score 还是不一样,但是 Region 是平均分配的。

1 个赞

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。