话说,前两天为了防止见证人节点因为内存(shared_memory.bin
)写满而炸掉,我特意调整了一下shared-file-size
这个数值,然后一通夸耀自己未雨绸缪。
(图源 :pixabay)
结果昨天早晨发现,自己的见证人丢了好多个块,登录一看,一堆类似这样的出错信息:
241893ms chain_plugin.cpp:347 operator() ] No P2P data (block/transaction) received in last 30 seconds... peer_count=19
241893ms chain_plugin.cpp:349 operator() ] Checking for new P2P data once per 3 seconds...
以为停掉重启就会安然无恙,结果重启后提示我:
Error: {"code":13,"name":"St9bad_alloc","message":"std::bad_alloc","stack":[{"context":{"level":"warn","file":"block_log.cpp","line":425,"method":"read_head","hostname":"","timestamp":"2022-01-23T01:08:51"},"format":"rethrow ${what}: ","data":{"what":"std::bad_alloc"}},{"context":{"level":"warn","file":"database.cpp","line":248,"method":"open","hostname":"","timestamp":"2022-01-23T01:08:51"},"format":"rethrow","data":{"args.data_dir":"/home/xxxxxx/.hived/blockchain","args.shared_mem_dir":"/home/xxxxxx/.hived/blockchain","args.shared_file_size":"23622320128"}}]}
别问我这是啥意思,我也不懂,总之就是一件事:我的HIVE见证人节点炸了!
而且不但节点炸了,还炸的比较彻底,无论我是用--force-open
还是--replay-blockchain
抑或是删除block_log.index
以及shared_memory.bin
后再replay都行不通——也就是说我的block_log
文件受损了。
修复受损block_log
我很有经验,先用truncate
剪裁block_log文件,然后再从@gtg 提供的block_log完成修复,剩下的就是replay了。
先说节点为什么炸掉,这让我百思不得其解,毕竟我备份节点以及我本地机器上的节点也都做了相同调整,但是并没有任何异常,只能说是灵异事件吧。
再说回到replay,因为我有主备两个节点,所以每次replay都很悠闲,所以我就懒得再内存中replay了,使用ssd慢慢操作就好了,急什么。
不过随着区块链数据量的增加,再SSD上进行replay操作的事件越来越长,上次搞过一次,感觉用了接近2天。
replay主要对CPU和磁盘IO要求特别高,如果不换更高配的设备,这两项没啥好办法提高。但是想提升replay速度也不是不可能的,那就是在内存中replay HIVE节点,这样就把磁盘IO操作转换成内存读写,解决掉一大瓶颈,速度自然就上来了。
其实如何在内存中replay HIVE节点,我两年多前就和大家分享过,但是有些过时,所以重新简单整理分享一下。
首先是准备/dev/shm,这个相当于ramdisk,可以理解成在内存中开辟的磁盘。当前我使用的VPS是32G内存,默认的/dev/shm为16G,不够大,所以用如下指令调整为22G:
sudo mount -o remount,size=22G /dev/shm
然后,在HIVE的配置文件中将shared-file-dir = "blockchain"
修改为:shared-file-dir = /dev/shm
。也就是说将HIVE区块链的内存文件shared_memory.bin
放到ramdisk上,也就是说放到真正的内存中。
还有就是把配置文件中shared-file-size = 25G
改成shared-file-size = 20G
,这个保证区块链内容够用就好,回头弄好后可以再改大。
然后使用如下指令Replay区块链:
hived --replay-blockchain
事实证明,在内存中replay就是比在磁盘(ssd)中replay快得多得多,上次在磁盘上replay用了近2天的时间,这次用了十多个小时就搞好了。
尽管可以继续让hive的内存文件shared_memory.bin
继续放在内存中,但是为了维护方便,我决定还是把它切换到磁盘上。
切换回去的步骤如下:
使用
Ctrl+C
关闭程序
复制/dev/shm/shared_memory.bin
到blockchain目录(根据你自己的设置)
修改shared-file-dir = "blockchain"
然后为了保证hive的内存文件足够大,再修改shared-file-size = 25G
。同时使用如下指令将/dev/shm
恢复至默认大小:
sudo mount -o remount,size=16G /dev/shm
当然,也可以采取重启大法,不过重启之前记得节点已经正确关闭,否则可能又需要修复&replay啦!
(图源 :pixabay)
目前节点运行一切正常,准备观察几天看看还会不会发生崩溃事件,按说灵异事件应该很难再次发生,否则就闹鬼了。哎,监控&处理措施还是不到位呀。