文章目录
  1. 1. 文档更新说明
  2. 2. 前言
  3. 3. 问题
  4. 4. 解决方案
    1. 4.1. 脚本
    2. 4.2. 定时器
  5. 5. 结论

文档更新说明

  • 最后更新 2018年01月16日
  • 首次更新 2018年01月16日

前言

  好久没更新博客了(简单说就是没有开发新的iOS项目,老项目需求也不多),从去年下半年底开始就一边做iOS开发,一边做公司相关区块链项目开发和维护.区块链这个领域还是比较前沿,入门门槛比较高,相关中文资料非常少,还有一大堆坑.目前接触的最多的还是智能合约方面,应用级别,后面也会往更深入的方向研究.

问题

  回归正题,在使用Geth客服端ipc链接做相关开发的时候,遇到的最最大的问题就是网络同步异常(Synchronisation failed),😂这个太蛋疼了.不管怎么在Geth的启动参数上做手脚,Geth在同步节点的过程中,隔一段时间就会出现同步失败,运气好的时候很快就可以重新链接到其他远程节点继续同步,但是运气不好的话,同步会落后当前网络一大截(比如上个星期六日两天一共落后4000block).

解决方案

  每次出现网络同步失败并且很久没有重新同步时,我们的做法就是重启一下客户端.为了”彻底”解决这个问题的方案,我写一个自动管理的脚本代替人工操作,这样我周末出去玩就不用被领导半路叫回来重启服务器了😒.   

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh
# 文件名: check_eth_node.sh
# 简单解释一下,先监控geth的日志文件,发现同步失败就重启一下客户端
# 这里我们用的是supervisorctl管理工具
tail_result=`tail -n 1 {日志文件路径}`
FAILPATTERN="Synchronisation failed"
if [ $? -ne 0 ]
then
echo "tail exec failed!" $?
else
if [[ $tail_result == *$FAILPATTERN* ]]
then
echo "Synchronisation failed, restart geth now!"
/usr/local/bin/supervisorctl restart geth
if [ $? -ne 0 ]
then
echo "restart failed." $?
fi
fi
fi
echo "excute time:" `date`

定时器

在shell里面并没有包括定时器,而是通过linux下的定时器模块crontab来实现定时功能.

0 0-23 * * * check_eth_node.sh >> cronlog.log

这样就可以实现每小时执行一次脚本了.

结论

  实际使用过程中发现这个方案还是挺有效果的,有出现这个问题的同学可以自己试一试.

文章目录
  1. 1. 文档更新说明
  2. 2. 前言
  3. 3. 问题
  4. 4. 解决方案
    1. 4.1. 脚本
    2. 4.2. 定时器
  5. 5. 结论