sofastack / sofa-jraft

A production-grade java implementation of RAFT consensus algorithm.
https://www.sofastack.tech/projects/sofa-jraft/
Apache License 2.0
3.58k stars 1.15k forks source link

RheaKV 是怎么平衡region的? #1061

Closed ye-xiaowei closed 9 months ago

ye-xiaowei commented 9 months ago

我看到在region超出限制之后split,但是产生的分片是继承原来的成员配置的。

如果添加了新的Store , 按理说会把部分region调度到这个节点上。我翻阅了文档貌似没有这部分的描述,也没看到怎么指定一个region的副本数。也可能是我眼拙没有找到。

fengjiachun commented 9 months ago

region 自动平衡

你看到的 region split,实际上只会被 pd server 调度到,rheakv 节点接收 pd 的指令并处理,如果你看到这里,会看到 rheakv 节点还会执行 processTransferLeader,这个就是重新平衡节点负载的功能了,利用 jraft 的 transfer leader 能力

如何被调度的(PD server 负责调度)

判断什么时候需要 split: SplittingJudgeByApproximateKeysHandler 什么时候执行 region 负载平衡: RegionLeaderBalanceHandler

指定副本数? 不确定我真的理解了你这个问题,尝试按我的理解回答

  • 如果是初始化期间就指定各个 region 副本,那么你在配置文件里就可以了,参考这里
  • 如果是运行时增加节点,添加一个新的 store,那么这个 store 连接到 pd server 后并持续会持续发送心跳,pd 会根据心跳中上报的信息进行调度,就是上面的 RegionLeaderBalanceHandler
ye-xiaowei commented 9 months ago

感谢耐心的答复。可能是我对 RheaKV 理解的不到位,我是这么理解的:

Store 加入的时候是没有任何 region 副本的(没有在配置文件中指定),PD是否会调度一些 region 到这个空的 Store 上呢?

比如说:3节点,副本数为3,有2个region。

node0 node1 node2
region0 region0 region0
region1 region1 region1

扩容之后,期望的结果可能让加入的 Store 均衡一部分 region

node0 node1 node2 node3 node4
region0 region0 region0
region1 region1 region1

RegionLeaderBalanceHandler 好像是让 leader 的分布均匀,region 本身所在的 node 是不变的。

fengjiachun commented 9 months ago

感谢耐心的答复。可能是我对 RheaKV 理解的不到位,我是这么理解的:

Store 加入的时候是没有任何 region 副本的(没有在配置文件中指定),PD是否会调度一些 region 到这个空的 Store 上呢?

比如说:3节点,副本数为3,有2个region。

node0 node1 node2 region0 region0 region0 region1 region1 region1 扩容之后,期望的结果可能让加入的 Store 均衡一部分 region

node0 node1 node2 node3 node4 region0 region0 region0
region1 region1 region1 RegionLeaderBalanceHandler 好像是让 leader 的分布均匀,region 本身所在的 node 是不变的。

哦,抱歉漏了回复副本迁移的问题,是的,目前确实是没有实现副本迁移的功能,只能做到 leader 平衡

fengjiachun commented 9 months ago

副本迁移现在只能手动执行,使用 CliService