sofastack / sofa-jraft

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

添加 Learner 角色,只用于同步数据不参与投票 #115

Closed fengjiachun closed 5 years ago

en-hui commented 1 month ago

请问这个任务是否已完成,如何查看该功能的使用方式

killme2008 commented 1 month ago

查看用户指南 https://www.sofastack.tech/projects/sofa-jraft/jraft-user-guide/

搜索 learner

killme2008 commented 1 month ago

看这个吧,网站好像 n 年没更新了

https://github.com/sofastack/sofastack.tech/blob/master/content/zh/projects/sofa-jraft/jraft-user-guide/index.md#13-%E5%8F%AA%E8%AF%BB%E6%88%90%E5%91%98learner

en-hui commented 1 month ago

在使用JRaft RheaKV时,用法也是一样的吗? 使用Learner角色时,能不能让Learner的数据同步是异步的。 例如如下场景: 异地灾备,为了跨城数据备份,需要在多个城市使用Learner做数据同步;但为了不影响主服务集群的响应速度,采取异步同步,然后异步可能丢少量数据等注意事项?

fengjiachun commented 1 month ago

在使用JRaft RheaKV时,用法也是一样的吗? 使用Learner角色时,能不能让Learner的数据同步是异步的。 例如如下场景: 异地灾备,为了跨城数据备份,需要在多个城市使用Learner做数据同步;但为了不影响主服务集群的响应速度,采取异步同步,然后异步可能丢少量数据等注意事项?

用法一样

en-hui commented 1 month ago

@fengjiachun 您好 我还有一个问题: 假设我启动6台服务,A、B、C为正常节点,E、F、G为learner节点

我写入部分数据后,A、B、C均挂掉,我想让E、F、G改为正常节点提供服务

我手动停掉E、F、G,修改服务setInitialServerList为A、B、C设置为learner(服务之后启动希望能追赶数据),E、F、G不加learner后缀,启动E、F、G后,无法正常选主,客户端查询报错无法连接B节点,我应该如何做呢

我的场景为A、B、C为城市1,E、F、G为城市2 城市1直接停电导致只能使用城市2的备份数据

fengjiachun commented 1 month ago

我写入部分数据后,A、B、C均挂掉,我想让E、F、G改为正常节点提供服务

需要明白的是,E,F,G 可能并没有包含全部数据,因为 E,F,G 不参与形成多数派; 在你接受可以丢失少量数据的前提下,分别这样调用 E,F,G 三个节点试试:

 CliService#resetPeer(groupId, E, [E, F, G]);
 CliService#resetPeer(groupId, F, [E, F, G]);
 CliService#resetPeer(groupId, G, [E, F, G]);

相关 API 代码: https://github.com/sofastack/sofa-jraft/blob/e63ce9be24ef0a3eb41c4c08d464536985d3e60f/jraft-core/src/main/java/com/alipay/sofa/jraft/CliService.java#L76

fengjiachun commented 1 month ago

我手动停掉E、F、G,修改服务setInitialServerList为A、B、C设置为learner(服务之后启动希望能追赶数据),E、F、G不加learner后缀,启动E、F、G后,无法正常选主,客户端查询报错无法连接B节点,我应该如何做呢

这个失败的原因应该是 InitialServerList 只为初始化使用,E,F,G 节点是有自己的元数据的,优先从自己元数据读取,只有在新集群才会读取 InitialServerList