raft 算法中的 term 一直在增长的问题

2018-09-03 11:26:02 +08:00
 linbingqinag

raft 算法中的 term 值随着选举次数一直在增加,到某一天到达了 uint64 的上限,想问下有什么办法可以阻止这个现象,目前的想法是在 leader 做同步的时候重置到一个指定的数值,不知道是否可行

2629 次点击
所在节点    程序员
17 条回复
hellotitan
2018-09-03 11:48:44 +08:00
好问题,占坑等大佬
Monad
2018-09-03 11:55:03 +08:00
max(uint64) = 18446744073709551616 ≈ 1.8 * 10^19
以 5GHZ 的 CPU 每条指令都是加一的话 需要跑约 3689348814 秒 约等于 116 年
116 年要是都不停下的进程 可以考虑拍照留恋 :)
JohnSmith
2018-09-03 12:03:11 +08:00
1.term 减小会导致算法变复杂(raft 算法设计严重依赖 term 自增
2.raft 通过 prevote 指令优化 term 无意义自增
3.如楼上所说,并且 term 不是频繁变动的参数,没太大必要做优化
flikecn
2018-09-03 12:05:59 +08:00
prevote 机制可以解决,etcd 的 raft lib 已经实现了。
hyperdak288
2018-09-03 12:23:41 +08:00
这让我想起以前同学公司讨论的事,一个有且只有 100 条数据的表,主键应该用 int 还是 bigint,这个事他们讨论了一天
linbingqinag
2018-09-03 13:30:25 +08:00
@flikecn 嗯,可以的,我看看
sy20030260
2018-09-03 13:32:24 +08:00
好久没见这样高质量的讨论,马一下
XiaoxiaoPu
2018-09-03 13:36:49 +08:00
uint64 不够还有 uint128,可以用到宇宙毁灭了
linbingqinag
2018-09-03 13:42:25 +08:00
@XiaoxiaoPu 如果新加入的节点是作恶节点,并且开始 term 修改为了 int64/int128 的最大值,那么他有可能是作为 leader,当他下线的时候此时 follower+1, 已经超过了最大的值,程序岂不是要死了?
sampeng
2018-09-03 13:49:08 +08:00
为什么会有作恶的?
linbingqinag
2018-09-03 13:54:10 +08:00
@sampeng 代码是放在一个共享的环境中,每个节点的持有人都是可以看到并且修改的,由于 leader 是有某些利益的,所以会有一部分的作恶
linbingqinag
2018-09-03 13:54:41 +08:00
@linbingqinag 类似于去中心化的结构
linbingqinag
2018-09-03 13:55:32 +08:00
目前觉得 prevote 是比较好的解决办法
sampeng
2018-09-03 14:06:34 +08:00
@linbingqinag 怎么听着这么像挖矿。。。
linbingqinag
2018-09-03 14:12:24 +08:00
wangdashuai
2018-09-03 14:24:31 +08:00
是不是吧 raft 和区块链弄混了。raft 中的节点都是自己的节点,不会作恶。raft 并不解决拜占庭将军问题 。
Reficul
2018-09-04 09:18:52 +08:00
raft 并不防攻击啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/485570

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX