# Lotus 集群平滑升级

提示:

本教程仅适用原语云用户,且该功能需 lotus-v1.15.0 之后的版本才支持。

# 应用场景

当 Miner 的有效存储空间大于 3PiB 的时候,时空证明的 48 个 dealine 就排满了,意味着时空证明一天 24 小时都没有中断了。此时如果集群停机/重启升级的话,万一升级过程不顺利,可能会影响你的时空证明提交。

原语云针对上述场景开发了平滑升级的功能,我们对 lotus-miner 的相关服务做了重构,允许在旧集群正常运行的情况下,启动一个 Debug 模式的 Miner,并且不会导致时空证明和爆块证明的重复计算。

# 实现思路

我们允许你在启动 lotus-miner 的时候传入一个 --cluster-detect 参数,这参数的默认值是 true,如果你传入 false 的话,则集群会以 debug 模式启动。这样 miner 就不会启动封装任务调度,时空证明调度,爆块证明调度服务。

同时,我们提供一个 lotus-miner service 命令:

yy_lotus-miner service
NAME:
   lotus-miner service - interact with the storage scheduling service pipeline

USAGE:
   lotus-miner service command [command options] [arguments...]

COMMANDS:
   list     list the scheduling service running state
   start    start the specified(sealing/window/winning) scheduling service
   help, h  Shows a list of commands or help for one command

OPTIONS:
   --help, -h     show help (default: false)
   --version, -v  print the version (default: false)

你可以启动 Miner 之后,手动触发一次或多次时空证明证明挑战,确认时空证明和爆块流程没有问题之后,在动态启动任务封装/时空证明/爆块证明调度服务:

# 1. 启动封装任务调度服务
yy_lotus-miner service start --really-do-it sealing
# 2. 启动时空证明调度服务
yy_lotus-miner service start --really-do-it window
# 3. 启动爆块证明调度服务
yy_lotus-miner service start --really-do-it winning

# 升级步骤

  1. 旧集群的 daemon 和 miner 机器都不动它,让它们继续正常提交时空证明和爆块。

  2. 另外准备一套 daemon 和 miner 机器,将 daemon 和 miner 的元数据导出(如果导出麻烦也可以拷贝),再启动一个 daemon 和一个 Miner 节点,Miner 需要以调试模式启动:

    nohup yy_lotus-miner run \
    --listen=xxx.xxx.xxx.xxx:2345 \
     --cluster-detect=false \ # 加上这个参数启用 debug 模式
    --storage-api=local \
    --winning-post=false \
    --winning-worker=true \
    --window-post=false \
    --window-worker=true \
    --sealing-mgr=true \
    --sector-store=true \
    --deals-mgr=false > /yuanyu/lotus-miner/log/error.log 2>&1 &
    

    启动成功后会打印类似下面的日志,表示终止了封装/时空证明/爆块证明的调度服务启动:

    INFO	modules	modules/storageminer.go:463	Abort winning post service running for node task 
    INFO	storageminer	storage/miner.go:311	starting up miner t01000, worker addr t3qepcc4re5hcbzyvixfjvaq752cekebegbj2a3m5d3c3u5nfqw4zntgvsmih3omys45a3vibdh4de3srygxdq
    WARN	storedask	storedask/storedask.go:172	no previous ask found, miner will not accept deals until a price is set
    INFO	modules	modules/storageminer.go:275	Abort proving service running for node task 
    INFO	modules	modules/storageminer.go:281	Abort sealing service running for node task 
    
  3. 确认爆块时间是否正常,在主 Miner 的日志(我们这里假设 Debug-Miner 的数据目录在 /yuanyu/lotus-miner-debug)中直接查找 winning PoSt warmup 日志,日志会显示爆块的时间,以及对应证明 Worker 的主机名称和IP地址:

    grep "winning PoSt warmup" /yuanyu/lotus-miner-debug/log/error.log 
    # 如果成功会有类似下面输出
    winning PoSt warmup successful	{"worker": "local-prover", "address": "192.168.2.100:2345", "took": 2.384338841}
    

    爆块的时间在 5 秒以内都算是正常的,如果大于这个值,则建议重启 Miner 试试,如果如果重启多次还是出现爆块时间偏长,建议检查您的 GPU 驱动以及存储读写是否正常。

  4. 启动 lotus-winning-worker(如果旧集群有的话),连接到 Debug-Miner,具体启动方式可以可以参考 安装-lotus-wining-worker

  5. 启动 lotus-window-worker(如果旧集群有的话),连接到 Debug-Miner,具体启动方式可以可以参考 安装-lotus-window-worker

  6. Debug-Miner 和证明 Worker 都启动成功之后,手动触发时空证明,验证时空证明是否能正常调度和计算。

    yy_lotus-miner proving challenge --really-do-it=true 0
    
  7. 在验证新启动的节点整个流程都能顺利完成之后,此时可以启动 Debug-Miner 相应的调度服务:

    yy_lotus-miner service start --really-do-it window
    

    上述命令执行后会弹出一个确认的交互命令:

    lotus-miner service start --really-do-it window
    @Alert: Make sure to stop all the other running miner with window scheduler started OR this will LEAD to repeated window PoSt submission. 
    Please double-check the above tips, Are you sure to continue [Y/N]: 
    

    启动成功之后,在 Miner 的日志里面会输出时空证明调度服务器的启动日志:

    INFO	storageminer	storage/miner_service.go:55	window scheduler service started
    INFO	storageminer	storage/wdpost_sched.go:127	restarting window post scheduler
    

    然后你可以依次在启动其他你需要的调度服务,再通过日志确认服务是否启动即可。

  8. 在确认所有的调度服务都正常启动之后,你就可以关闭旧的集群,平滑升级到此完成。

  9. 最后,我们上面启动 Debug-Miner 采用的是手动启动的模式,如果你想要在原语云的控制台管理这个进程,你可以将 Debug-Miner 的进程 ID 写入到 /opt/QarkClient/lotus-miner/boot.pid,然后再到原语云的 lotus-miner 应用里面点击启动应用,就可以同步该进程的运行状态到 lotus-miner 应用了。后续如果 Miner 要重启的话,直接通过原语云控制台操作就好了。

上次更新: 2022/4/20 21:06:17