sofastack / sofa-jraft

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

能否通过spi开放集群成员合法性校验,同时允许成员携带额外信息(用户自行实现成员合法性校验时使用) #1090

Closed zxuanhong closed 3 months ago

zxuanhong commented 3 months ago

Your question

  1. 在容器环境,容器的重启可能会导致节点ip变化,如果一直利用ip+port去做成员合法性校验,对容器环境很不友好(当然可以利用域名,但这降低了灵活性,也增加了复杂度)
  2. 在atomix中校验其实不是与ip端口绑定,他是与节点id绑定,同时也能携带节点的一些额外信息。
  3. 希望jraft可以通过spi开放校验逻辑,让用户自行决定怎么校验成员的合法性,同时可以传入冗余信息,以便校验时利用这些冗余信息进行一定的判断。atomix参考代码如下: image
  4. 个人认为这能提jraft的灵活性,特别是在容器环境。同时也不违反raft协议本身。

Environment

fengjiachun commented 3 months ago

这是个不错的功能,不过对于目前的 jraft 不容易实现,在 jraft 中地址信息记录在 Endpoint 对象中,通信层也是直接使用这个 Endpoint 的,没有一个 id 到地址的映射。 不知道使用域名能否解决你的问题

zxuanhong commented 3 months ago

@fengjiachun 其实通信还是ip模式,你注意看atomix,他有nodeid,还有对应的address。域名肯定能,但是这降低了灵活性

zxuanhong commented 3 months ago

@fengjiachun 而且我觉得能在容器化项目大规模应用,这个还真是很需要的功能,虽然可以使用像k8s的dns地址来配置,到其实还是会遇到很大问题。 长远来看还真实必不可少的,很多继续raft协议的项目都有配置nodeid。

fengjiachun commented 3 months ago

如果你已经有设计思路,可以提个方案上来看看讨论下?

zxuanhong commented 3 months ago

@fengjiachun 我抽时间先验证下可行性。

funky-eyes commented 3 months ago

我支持这个改动,我一直期望可以有这样的功能,目前我使用了svc的域名来代替nodeid,避免了容器下ip容易变化的问题,但是这样对部署带来的改动比较多

funky-eyes commented 3 months ago

并且我们也想在安全度上做提升,如何去验证一个想要加入的成员的合法性也是一个问题。

zxuanhong commented 3 months ago

@fengjiachun @funky-eyes 最近有点忙,上周做了一点。估计下星期后才有时间继续

funky-eyes commented 3 months ago

@fengjiachun @funky-eyes 最近有点忙,上周做了一点。估计下星期后才有时间继续

期待,不过向下兼容上我觉得要考虑下,避免升级的时候老的集群信息中没有nodeid起不来或者有其他问题等。

zxuanhong commented 3 months ago

@funky-eyes ok。我需要先在我项目探索下可行性。不过有更好的方案也可以提出来,参考下。

funky-eyes commented 3 months ago

或许你可以把当前的设计方案在issue里画一下,我们一起讨论下看下是否有更优解?

fengjiachun commented 3 months ago

@fengjiachun @funky-eyes 最近有点忙,上周做了一点。估计下星期后才有时间继续

期待,不过向下兼容上我觉得要考虑下,避免升级的时候老的集群信息中没有nodeid起不来或者有其他问题等。

是的,需要向前兼容

zxuanhong commented 3 months ago

@fengjiachun @funky-eyes 很抱歉带来不好的消息。基于内部讨论,目前我们做法要能实现大规模集群。因此内部成员会基于jraft进行大改。比如成员确定这块会使用SWIM协议进行调整(在大规模集群下心跳机制是一种消耗巨大的机制)。目前这种做法与jraft完全背离。因此我将关闭当前issue。望知晓。