晕,见证人节点真的炸掉了 & 在内存中replay HIVE节点

话说,前两天为了防止见证人节点因为内存(shared_memory.bin)写满而炸掉,我特意调整了一下shared-file-size这个数值,然后一通夸耀自己未雨绸缪。

image.png
(图源 :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啦!

image.png
(图源 :pixabay)

目前节点运行一切正常,准备观察几天看看还会不会发生崩溃事件,按说灵异事件应该很难再次发生,否则就闹鬼了。哎,监控&处理措施还是不到位呀。

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now