Apache Doris 是一个基于 MPP(大规模并行处理)架构的高性能、实时的分析型数据库。在 Doris 中,FE(Frontend)、BE(Backend)和 Broker 组件有特定的启动和关闭顺序,下面详细介绍一下。
一、启动顺序
通常按照 FE -> BE -> Broker 的顺序启动,以下是对该顺序的详细解释:
- 启动 FE
- FE 是 Doris 的前端节点,负责元数据管理、查询规划、权限管理等功能,是整个系统的核心控制节点。
- 只有 FE 正常启动并完成初始化后,才能为后续的 BE 和 Broker 提供元数据服务和管理接口。如果 FE 未启动,BE 和 Broker 无法与集群建立有效的连接和通信。
- 启动 FE 的命令示例(以单节点为例):
./bin/start_fe.sh --daemon
- 启动 BE
- BE 是 Doris 的后端节点,负责数据存储和查询执行。
- 在 FE 启动并正常运行后,BE 需要向 FE 进行注册,获取元数据信息,了解集群的拓扑结构和数据分布情况。只有成功注册到 FE 后,BE 才能参与到数据存储和查询处理的工作中。
- 启动 BE 的命令示例:
./bin/start_be.sh --daemon
- 启动 Broker
- Broker 是 Doris 提供的外部存储访问服务,用于读取和写入 HDFS、S3 等外部存储系统的数据。
- 当 FE 和 BE 都正常运行后,才需要启动 Broker。因为 Broker 主要是为 FE 和 BE 提供外部数据访问的支持,在 FE 进行查询规划和 BE 执行查询时,如果涉及到外部存储的数据,会调用 Broker 进行数据的读写操作。
- 启动 Broker 的命令示例(以 HdfsBroker 为例):
./bin/start_broker.sh --daemon
二、关闭顺序
关闭顺序与启动顺序相反,即 Broker -> BE -> FE,以下是详细说明:
- 关闭 Broker
- 由于 Broker 主要是为 FE 和 BE 提供外部数据访问支持,在关闭系统时,首先关闭 Broker 不会影响 FE 和 BE 本身的数据存储和元数据管理。
- 关闭 Broker 可以避免在后续关闭 FE 和 BE 过程中,可能出现的 Broker 与 FE、BE 之间的通信异常问题。
- 关闭 Broker 的命令示例(以 HdfsBroker 为例):
./bin/stop_broker.sh
- 关闭 BE
- BE 负责数据存储和查询执行,在关闭 Broker 后,关闭 BE 可以确保数据的一致性和完整性。
- 在 BE 关闭过程中,会将内存中的数据刷新到磁盘,并进行必要的清理工作。关闭 BE 后,系统将不再进行数据的存储和查询处理。
- 关闭 BE 的命令示例:
./bin/stop_be.sh
- 关闭 FE
- FE 是整个系统的核心控制节点,最后关闭 FE 可以确保在关闭过程中,对整个集群的状态进行有序管理。
- FE 会在关闭前记录必要的元数据信息,保证下次启动时能够正常恢复。
- 关闭 FE 的命令示例:
./bin/stop_fe.sh
遵循上述启动和关闭顺序,可以确保 Doris 集群的稳定运行和数据的安全性。
三、集群启停脚本
集群角色规划:
节点(node1) | 节点(node2) | 节点(node3) |
---|---|---|
FE(leader) | fe(follower) | fe(observer) |
BE | BE | BE |
BROKER | BROKER | BROKER |
3.1 集群启动脚本
#! /bin/bash
echo "------正在启动Doris集群------"
SERVERS="node1 node2 node3"
MASTER="node1"
DORIS_HOME="/opt/module/apache-doris-0.15.0"
start_fe() {
for SERVER in $SERVERS
do
echo "------正在启动${SERVER}上的FE进程------"
# Start MASTER role
if [ "$SERVER" = "$MASTER" ]; then
ssh $SERVER "${DORIS_HOME}/fe/bin/start_fe.sh --daemon;jps -m"
else
# if not MASTER role, start it's Follower or Observer
ssh $SERVER "${DORIS_HOME}/fe/bin/start_fe.sh --helper $MASTER:9010 --daemon; jps -m"
fi
done
}
start_be() {
echo "------正在启动${SERVER}上的BE进程------"
for SERVER in $SERVERS
do
ssh $SERVER "${DORIS_HOME}/be/bin/start_be.sh --daemon; ps -aux |grep _be"
done
}
start_broker() {
echo "------正在启动${SERVER}上的Broker进程------"
for SERVER in $SERVERS
do
ssh $SERVER "${DORIS_HOME}/apache_hdfs_broker/bin/start_broker.sh --daemon; jps -m"
done
}
echo "------启动FE集群------"
start_fe
echo "------启动BE集群------"
start_be
echo "------启动Broker节点------"
start_broker
3.2 集群关闭脚本
#! /bin/bash
echo "------正在关闭Doris集群------"
SERVERS="node1 node2 node3"
MASTER="node1"
DORIS_HOME="/opt/module/apache-doris-0.15.0"
stop_broker() {
echo "------正在关闭${SERVER}上的Broker进程------"
for SERVER in $SERVERS
do
ssh $SERVER "${DORIS_HOME}/apache_hdfs_broker/bin/stop_broker.sh"
done
}
stop_be() {
echo "------正在关闭${SERVER}上的BE进程------"
for SERVER in $SERVERS
do
ssh $SERVER "${DORIS_HOME}/be/bin/stop_be.sh"
done
#检查be进程是否关闭
ps -aux|grep _be
}
stop_fe() {
for SERVER in $SERVERS
do
echo "------正在关闭${SERVER}上的FE进程------"
ssh $SERVER "${DORIS_HOME}/fe/bin/stop_fe.sh"
done
}
echo "------关闭Broker节点------"
stop_broker
echo "------关闭BE集群------"
stop_be
echo "------关闭FE集群------"
stop_fe