-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Supports learner mode. #1
Conversation
* learner_should_not_recive_log_after_leader_change. * learner_should_not_vote_for_logentry.
也就是说不允许从节点拥有从节点的场景,这个场景有需求吗? |
发生切主后,Learner 不再会收到集群新的日志。 |
可以实现,可以把 add learner 操作封装成一条新类型的日志,apply == 添加learner。 |
如果需要的话我可以给 learner 加上 replicator。 |
ConfigurationEntry learner_entry; | ||
learner_entry.id = LogId(meta->last_included_index(), meta->last_included_term()); | ||
learner_entry.conf = learner_conf; | ||
_config_manager->set_snapshot(entry, learner_entry); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Learner 不用两阶段,所以 learner 只用到了 peer,没有用到 old peer。
解决一下冲突 |
1. 功能概览
关键细节:
2024.3.2 讨论结果:
目前支持的功能:
支持的单测:
2. 当前的改造方式
概览
主要方式是在 ConfigurationManager 中加入了用于管理 Learner 的元数据和接口,均类似于配置变更的内容。
而添加 Learner 也类似于配置变更,需要将变更操作封装成一条普通的日志,该日志 apply 时,如果当前节点是主节点,则添加/删除一个 learner 类型的 replicator,如果是从节点,则忽略。
与配置变更不同的是,Learner 变更无需两阶段,所以只使用了 LogEntry 中的 peers 成员,old_peers 必须为空。
Node 上新增了一个接口,用于为当前节点添加 Learner。
调用该接口时,如果当前节点是 Leader,即可成功添加一个新的 learner 类型的 replicator,并向其同步日志。
Learner 对应的 replicator 不会对日志投票,这样可以不修改 ballot_box 的代码,只需要给 replicator 添加一个标志位,表示该 replicator 是 learner 即可,该标志位在 replicator 启动时设置。
对 Learner 节点的支持
Node 节点中新增了一个 STATE_LEARNER 状态,Node 启动时可以以 Learner 状态启动。
STATE_LEARNER 状态的节点不会发起选举:
STATE_LEARNER 状态的节点也不会参与选举,进行投票(通常情况下也不会收到 RequestVoteRPC):
braft 中的 Learner 不需要存储主节点的信息,主节点给 Learner 发送 AppendEntriesRPC 时,learner 会自动更新 leader ip。
3. TODO