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