事情的起因是:同事发现主机的内存占用过高,然后决定重启这个主机,在重启完主机后就发现nacos集群起不来了(没有上docker)。内存占用高是nacos与我们自己得服务设置得虚拟机大小太大了。我们得服务是没有自己设置,但是nacos设置-Xms2g -Xmx2g -Xmn1g。

1.时间不一致:

分布式一致性算法都对系统时间差是有要求的。不论是raft还是paxos,它们都要求主机间的时间差较小。nacos集群使用raft保证一致性,时差太大会报错,带jraft字样,还是比较好确认的。
解决方式

# 查看当前时间
date "+%Y-%m-%d %H:%M:%S"
# 设置时间
date -s "2007/04/14 13:58:00"

产生原因猜测:
重启或者关机会导致时间差。这问题最好的解决方式是要有一台时间服务器。

2.主机黑名单:

MySQL在检测到一个主机短时间内多次错误之后会将主机拉入黑名单拦截掉。日志标志是这样的: message from server: "Host '192.168.1.111' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'"。这条日志非常靠前,因为启动过程中会校验,它只会有一个NO DATASOURCE SET的日志记录误导我们。
解决方式:

# 可以根据mysqladmin flush-hosts命令清除黑名单,也可以如下处理(mysql控制台):
flush hosts

产生原因猜测:
当时在mysql执行SHOW PROCESSLIST 发现有六个连接到nacos数据库,处于sleep状态。猜测有俩个原因,一是我的服务没有使用合适的MySQL驱动,二是nacos重启没有断开连接导致一直错误最后被拉入黑名单了。

注:kill id 可以清除连接。mysql高版本的驱动对应高版本数据库。

3.工作区不干净

nacos会将选举结果等等缓存到data目录,不清除会导致集群机器全部启动也无法正常提供服务。客户端会有服务处于下线状态的日志。
解决方式:

# 清除缓存,重要的数据已经持久化到数据库了
rm -rf status/ data/ logs/ work/

总结

最重要的是日志,可以看到所有的错误在日志里面都是有迹可循的。当时,日志太长也确实恶心人,容易被误导。

标签: 经验

添加新评论