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

能否对新加入的参与者提供自认证机制。或者预留自认证机制接口,让用户自己实现 #1085

Closed zxuanhong closed 4 months ago

zxuanhong commented 4 months ago

Your question

  1. 能否预留一个接口,对新加入的参与者提供自认证机制。而不必通过CliService加入

  2. 比如集群初始化生产或者配置时配置全局token,只要新接入的节点提供这个token并且有效,那就自动加入

  3. 这样设计对与大规模集群管理特别方便,比如k8s中自动扩容缩容。

  4. 大致设想是这样的:

  5. 集群配置是否开启自认证------>如果开启----->集群启动检查是否配置校验token(或者预留校验接口用户自己实现,预留默认实现)----> 如果没有配置token那就生成一个。

  6. 新加入集群参与者如果携带token,那就自动加入成功。否则手动CliService加入

  7. 我记得atomix针对集群加入有两种方式:主引导模式(与现在jraft一样),还有组播发现模式

Environment

fengjiachun commented 4 months ago

这里说的 “加入” 是指加入某个 raft group ?还是什么?

zxuanhong commented 4 months ago

@fengjiachun 加入某个阀组。也就是新增加一个节点自动加入group 作为参与者

fengjiachun commented 4 months ago

这里说的 “加入” 是指加入某个 raft group ?还是什么?

我认为应该在上层做这些,而且通过 CliService 调度就可完成,”认证“ 部分可能我没理解,似乎不要 core 层的支持,上层就做掉了

zxuanhong commented 4 months ago

@fengjiachun 目前好像也没节点这个概念吧。所谓的节点也都是作为peer的,他必定属于某个raft 组。没有再上抽一层之说(也就是所有group 可利用节点资源)

zxuanhong commented 4 months ago

@fengjiachun 更上一层可能就是集群节点概念了,集群节点是所有raft group可利用资源。但是我看一些系统是通过gossip协议来确定集群节点关系的。

zxuanhong commented 4 months ago

@fengjiachun 就是如果通过认证后,那么系统核心层面自动触发CliService调度。但是我感觉自己抽一层上去也可以实现。目前我就是在kv基础上启动一个管理raft group(这个raft group所有物理节点都参与,有点类似pd.但是就想一起部署).通过管理group去调度kv store。我在管理group去保留了这个校验token。数据目录就变成了这样

image image
fengjiachun commented 4 months ago

大概明白你的需求了,不过抱歉,jraft-core 的原则是:它不会做 raft 协议成以上的事情,这个事情需要在上层应用层做

zxuanhong commented 4 months ago

@fengjiachun 我的想法是在raft层提供一种自验证机制。比如我新启动一个节点如果有token就自动加入raft group。因为目前虽然使用了管理节点处理。但是我不确定是否已经加入过集群。

或者有没有一种机制,让知道我加入集群失败了,比如监听到:term 0 start preVote消息。以便我发起一个task,处理这个问题。或者对集群加入时添加必要的监听器。目前没看到这方面的资料。

fengjiachun commented 4 months ago

@fengjiachun 我的想法是在raft层提供一种自验证机制。比如我新启动一个节点如果有token就自动加入raft group。因为目前虽然使用了管理节点处理。但是我不确定是否已经加入过集群。

或者有没有一种机制,让知道我加入集群失败了,比如监听到:term 0 start preVote消息。以便我发起一个task,处理这个问题。或者对集群加入时添加必要的监听器。目前没看到这方面的资料。

可以获取指定的 raft group 成员列表的,现在不在电脑前,晚点给你找一下

zxuanhong commented 4 months ago

@fengjiachun

  1. 应用层去处理,还是有问题。我发现走不通了。一个新加入的节点,我必须要能提交任务到已经存在的raft集群,然后由集群leader去操作允许加入集群(也就是提交加入申请)。但是目前发现新启动的节点由于没有成功加入集群,因此无法发起任务。感觉还是要在raft层去支持这种自动加入校验机制
  2. 说得更直白点,怎么友好处理jraft group 新的参与者自动加入(要有一定校验机制)。方便服务器自动动态缩容扩容
fengjiachun commented 4 months ago

@fengjiachun

  1. 应用层去处理,还是有问题。我发现走不通了。一个新加入的节点,我必须要能提交任务到已经存在的raft集群,然后由集群leader去操作允许加入集群(也就是提交加入申请)。但是目前发现新启动的节点由于没有成功加入集群,因此无法发起任务。感觉还是要在raft层去支持这种自动加入校验机制
  2. 说得更直白点,怎么友好处理jraft group 新的参与者自动加入(要有一定校验机制)。方便服务器自动动态缩容扩容

raft 协议本身不存在所谓动态扩缩容,动态的节点增删完全可以通过 CliService 实现,这是很多 jraft 用户实践过的,我不理解为什么会不可以?似乎是沟通不完全在一个频道上,或者你可以在 slack 单独找到我,我们可以详细聊下让我理解你的问题,很多用户实践过的问题我们就不在这里继续讨论了,这个 issue 就先关闭了

zxuanhong commented 4 months ago

@fengjiachun 我知道CliService完全能做到,但是就是缺乏一点校验。总不能我已启动一个节点我就自动调用CliService申请加入吧。我总得先向现有集群申请是否有权加入。也就是向现有集群发起加入申请,然后由现有集群管理者CliService发起加入申请。说得直白点,我们有些项目是政府自由机房,网络共享的,需要一点安全处理

zxuanhong commented 4 months ago

@fengjiachun 大致这样逻辑,好的我先考虑下看能否解决,不能在slack联系

image
fengjiachun commented 4 months ago

总不能我已启动一个节点我就自动调用CliService

一般 raft 节点不应该自动调用 CliService ,而是通过一个中心化的管控系统,或者说控制面,你在这个控制面做校验是可以的吗

fengjiachun commented 4 months ago

slack 上的讨论结果我来同步一下,从安全校验方面考虑,使用 TLS,通过证书认证即可