Apache Doris 代码仓库地址:apache/incubator-doris 欢迎大家关注加星
如上图,Doris 的整体架构分为两层。多个 FE 组成第一层,提供 FE 的横向扩展和高可用。多个 BE 组成第二层,负责数据存储与管理。本文主要介绍 FE 这一层中,元数据的设计与实现方式。
FE 分为 Leader,Follower 和 Observer 三种角色。 默认一个集群,只能有一个 Leader,可以有多个 Follower 和 Observer。其中 Leader 和 Follower 组成一个 Paxos 选择组,如果 Leader 宕机,则剩下的 Follower 会自动选出新的 Leader,保证写入高可用。Observer 同步 Leader 的数据,但是不参加选举。如果只部署一个 FE,则 FE 默认就是 Leader。
第一个启动的 FE 自动成为 Leader。在此基础上,可以添加若干 Follower 和 Observer。
最常见的就是突然某个FE宕机了,使用启动命令启动不了,严重情况下还可能引起其他FE宕机,常见的异常信息如下:
repImpl=com.sleepycat.je.rep.impl.RepImpl@68fa4d19 props={REFRESH_VLSN=17921230, PORT=9010, HOSTNAME=172.22.197.238, P_NODETYPE1=ELECTABLE, NODE_NAME=172.22.197.238_9010_1611290318143, P_NODETYPE0=SECONDARY, P_NODENAME1=172.22.197.240_9010_1608972313975, P_PORT1=9010, P_NODENAME0=172.22.197.238_9010_1611290318143, P_PORT0=9010, P_HOSTNAME1=172.22.197.240, GROUP_NAME=PALO_JOURNAL_GROUP, P_HOSTNAME0=172.22.197.238, ENV_DIR=/hdd_data01/doris-meta/bdb, P_NUMPROVIDERS=2}
at com.sleepycat.je.rep.InsufficientLogException.wrapSelf(InsufficientLogException.java:315) ~[je-7.3.7.jar:7.3.7]
at com.sleepycat.je.dbi.EnvironmentImpl.checkIfInvalid(EnvironmentImpl.java:1766) ~[je-7.3.7.jar:7.3.7]
以下操作之前首先要做好FE节点的元数据备份,以防止误操作,导致元数据损坏造成不可修复的问题,切记!切记!切记!
具体步骤:
metadata_failure_recovery=true
配置项删除,或者设置为 false,这个非常重要),注意要修改image/VERSION 里的name,拷贝过来的是master的名称,改成该节点的名称具体步骤:
针对这种情况,首先要查看所有FE节点的元数据,找到http://image.xxx,这里序号最大的一个FE节点,作为主节点
# ll /hdd_data01/doris-meta/
total 16
drwxr-xr-x 2 root root 12288 Aug 3 14:33 bdb
drwxr-xr-x 2 root root 4096 Aug 3 14:09 image
# ll /hdd_data01/doris-meta/image/
total 16192
-rw-r--r-- 1 root root 16569647 Aug 3 14:09 image.107356508
-rw-r--r-- 1 root root 83 Apr 16 12:58 ROLE
-rw-r--r-- 1 root root 94 Apr 16 12:58 VERSION
然后按照下面的步骤执行:
metadata_failure_recovery=true
sh bin/start_fe.sh daemon
启动这个 FE启动单节点 FE
一节中的描述。在 fe.log 应该会看到 transfer from XXXX to MASTER
等字样,也可以通过Web页面来查看show frontends;
命令,应该可以看到之前所添加的所有 FE,并且当前 FE 是 master。metadata_failure_recovery=true
配置项删除,或者设置为 false
,然后重启这个 FE(重要)在某些极端情况下,磁盘上 image 文件可能会损坏,但是内存中的元数据是完好的,此时我们可以先从内存中 dump 出元数据,再替换掉磁盘上的 image 文件,来恢复元数据,整个不停查询服务的操作步骤
curl -u $root_user:$password http://$master_hostname:8030/dump
meta_dir/image
目录下的 image 文件,重启 OBSERVER FE 节点, 验证 image_mem 文件的完整性和正确性(可以在 FE Web 页面查看 DB 和 Table 的元数据是否正常,查看fe.log 是否有异常,是否在正常 replayed journal)meta_dir/image
目录下的 image 文件,重启 FOLLOWER FE 节点, 确认元数据和查询服务都正常meta_dir/image
目录下的 image 文件,重启 Master FE 节点, 确认 FE Master 切换正常, Master FE 节点可以通过 checkpoint 正常生成新的 image 文件注意:如果 Image 文件很大,整个操作过程耗时可能会很长,所以在此期间,要确保 Master FE 不会通过 checkpoint 生成新的 image 文件。 当观察到 Master FE 节点上 meta_dir/image
目录下的 image.ckpt
文件快和 image.xxx
文件一样大时,可以直接删除掉image.ckpt
文件。