# 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
# 升级步骤
旧集群的 daemon 和 miner 机器都不动它,让它们继续正常提交时空证明和爆块。
另外准备一套 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
确认爆块时间是否正常,在主 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 驱动以及存储读写是否正常。
启动
lotus-winning-worker
(如果旧集群有的话),连接到Debug-Miner
,具体启动方式可以可以参考 安装-lotus-wining-worker。启动
lotus-window-worker
(如果旧集群有的话),连接到Debug-Miner
,具体启动方式可以可以参考 安装-lotus-window-worker。Debug-Miner
和证明 Worker 都启动成功之后,手动触发时空证明,验证时空证明是否能正常调度和计算。yy_lotus-miner proving challenge --really-do-it=true 0
在验证新启动的节点整个流程都能顺利完成之后,此时可以启动
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
然后你可以依次在启动其他你需要的调度服务,再通过日志确认服务是否启动即可。
在确认所有的调度服务都正常启动之后,你就可以关闭旧的集群,平滑升级到此完成。
最后,我们上面启动
Debug-Miner
采用的是手动启动的模式,如果你想要在原语云的控制台管理这个进程,你可以将Debug-Miner
的进程 ID 写入到/opt/QarkClient/lotus-miner/boot.pid
,然后再到原语云的lotus-miner
应用里面点击启动应用,就可以同步该进程的运行状态到lotus-miner
应用了。后续如果 Miner 要重启的话,直接通过原语云控制台操作就好了。