背景
生产Doris集群是0.15.3版本,今天在创建SQL_BLOCK_RULE 的sqlHash规则时,导致Doris集群的FE节点同步元数据时出现空指针异常,集群3个FE节点全部挂掉且无法正常启动的情况。
异常操作行为及报错信息
1.创建SQL_BLOCK_RULE的sqlHash规则:
CREATE SQL_BLOCK_RULE test_rule_1
PROPERTIES(
"sqlHash"="60c546559e91250393023573061921e0",
"global"="false",
"enable"="true"
)
2.报错信息:
这个问题是由于在创建SQL_BLOCK_RULE时,SqlBlockRule类中的read方法读取规则时,出现了Null值,写入Doris的元数据后,导致Doris的元数据异常引起导致的。
解决方案
1.(重要)首先,停止掉集群所有的数据接入任务,防止接入任务同步修改元数据。
2.修改SqlBlockRule的源码,对读取规则方法做判空处理:
3.下载对应版本的源码,修改源码后,使用sh build.sh --clean --fe --ui
对FE重新编译打包 ,详细流程请参考:Doris编译,注意:只需要对FE做编译即可。
4.将重新打包好的palo-fe.jar
包,替换掉集群上的fe目录下的palo-fe.jar
5.(重点)备份所有节点meta_dir
目录,同时在相同路径下新建一个空的meta_dir
。
6.找到集群FE的master节点,在fe.conf中添加metadata_failure_recovery=true
配置。注意:如果你的FE节点有3个,不确定哪个是FE的master时,那么可以通过查看meta_dir/image
下的image文件,这个文件的后缀越大,则表示元数据更新。
7.在该FE节点下执行sh bin/start_fe.sh
启动FE。这一步如果没有报错,那该FE节点基本就会是以master的角色启动了,你可以在日志中看到类似transfer from XXXX to MASTER
的日志输出。
8.启动完成后,最好连接一下FE,然后通过一些查询和导入命令检查一下节点是否能够正常访问,如果不能,则可以仔细阅读官方文档,按照官网元数据恢复文档用备份的元数据再重试一次。
9.如果正常访问,则此时可以通过show frontends
查看到之前添加的所有FE节点。
10.(重要)通过stop_fe.sh
命令停掉当前FE节点,同时将fe.conf中的metadata_failure_recovery=true
注释掉或者删除,然后再次重启这个FE节点。
11.再次连接到该FE,使用 alter system drop follower FeIp:9010
命令将其他FE节点全部删除掉。
12.使用 alter system add follower FeIp:9010
将重新启动的FE节点添加到集群中;
13.在其他FE节点使用sh bin/start_fe.sh --helper FeIp:9010 --daemon
命令启动FE。
14.正常启动,开启所有接入任务。