在eos同步mongodb的过程中, 如果mongodb产生异常, 比如查询延迟太大, 会产生handle_mongo_exception, 然后主动关闭eos, 作为一致性保护措施, 可以理解eos的用心.
另一个问题, mongodb数据库的查询不像mysql这样严格, 如果查询了一个错误的字段, mysql会立即返回错误, mongodb的做法是全表扫描, 这样实在过分, 也间接导致了eos同步的超时.
为了解决上述问题, 这里采用粗暴但安全的手段, 定时重启eos和mongo, 下面贴一下脚本
start_eos.sh
#!/bin/sh
echo start eos ...
/usr/local/bin/nodeos -d /mnt/eos 2>&1 | tee ./eos.log &
start_mongo.sh
#!/bin/sh
echo start mongo ...
/root/mongodb-linux-x86_64-rhel70-4.0.4/bin/mongod -f /etc/mongod.conf
stop_eos.sh
#!/bin/sh
./pkill_proc.sh nodeos
stop_mongo.sh
#!/bin/sh
./pkill_proc.sh mongod
停止并等待某后台进程结束的子脚本
pkill_proc.sh
#!/bin/sh
echo -n "stop $1 "
pkill $1
while :
do
echo -n "."
sleep 1
count=`ps -ef | grep -w "$1" | grep -v "grep"|grep -v "pkill" | wc -l`
if [ $count -eq 0 ]; then
break
fi
done
echo " "
重新启动eos和mongo
restart_eos_mongo.sh
#!/bin/sh
cd /root
./stop_eos.sh
./stop_mongo.sh
./start_mongo.sh
if [ $? -eq 0 ]; then
./start_eos.sh
else
echo start mongo failed
fi
定时重启
crontab -e
0 */1 * * * /root/restart_eos_mongo.sh