前言
前几天又接到一个数据库运维的任务,客户那边是一个 5 节点(两个主表服务器,三个从表服务器)的分布式数据库集群,这次问题是第二个节点所在的服务器(备用主表服务器)硬件坏了,修完之后重装了一个系统,整个服务器就是从零开始光秃秃的一台崭新服务器了。这也是分布式数据库的好处,高可用!坏了一台无所谓,数据有副本,不会丢,整个集群的服务依然跑着好好的,不过毕竟坏了一个节点,所以需要我这个运维去跑一趟,把坏了的那个节点重新加入,继续把保险装上。
正文
我先在公司私有云环境搭建了一个模拟坏境(敲重点,现场调试前,要提前搭环境),然后重置第二个节点所在的服务器(相当于重装系统),好了,现场环境已经复现了。
通过新增节点的步骤,一阵脚本操作,非常顺利,现在新的节点加上了,但这个节点只是一个从表服务器,接下来需要把它变成主表服务器的角色,说白了就是在从表服务器本身提供的 5 个服务之外,额外启动两个主表服务器的服务,就 ok 了。
接下来是思路的重点!
我接触这个分布式数据库也还不久,第一个额外的服务是隶属于 hadoop 的 NameNode 服务,第一印象只是:起不来,不知道为啥。查了下资料,需要手动同步 namenode 的日志,ok,同步完之后就可以了。
第二个额外的服务是隶属于 Zookeeper 的 QuorumPeerMain 服务,第一印象同样是:起不来,不知道为啥。也百度不出结果,但也不是没有收获,我知道了 zookeeper 的日志所在的目录,再次启动集群时,我一直盯着日志文件,报错信息终于出现了:
2021-10-12 13:17:03,570 [myid:4] - ERROR [main:QuorumPeerMain@94] - Unexpected exception, exiting abnormally java.lang.RuntimeException: My id 4 not in the peer list at org.apache.zookeeper.server.quorum.QuorumPeer.startLeaderElection(QuorumPeer.java:479) at org.apache.zookeeper.server.quorum.QuorumPeer.start(QuorumPeer.java:411) at org.apache.zookeeper.server.quorum.QuorumPeerMain.runFromConfig(QuorumPeerMain.java:156) at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:116) at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:79)
原来我新增节点的操作把 zookeeper 里的 myid 顺延成了 4 (原来是 2),好了,找到问题就好办了,找到新节点的 myid 配置文件,把 4 改成 2。重新启动数据库集群,一切 ok!
这里有个很重要的点就是:程序出现错误时,如果不能本机源代码调试,要学会找错误日志,利用日志的提示信息就指导自己的下一步。
值得一提的是:百度、问人终究只是快餐,需要掌握的技能一定要利用好第三方技术的官方文档(包括书籍),这是我系统学习某个技术时的经验。最近的一次服务器机房网络问题就是通过系统学习网络知识解决的,知识系统掌握之后,问题解决起来就不会摸不着头脑,而且思路会非常清晰!