Apache Doris 架构梳理与三节点集群部署记录

Doris 的组件少到只有 FE 和 BE 两种角色、两个进程,不依赖外部组件,部署和运维都简单,但能撑住 PB 级分析查询。这篇按三台机器的规划把 1.0.0 集群拉起来,顺带记下容易出问题的地方。

一、它是什么,由哪些角色组成

Apache Doris 出自百度大数据部门,早期叫 Palo,2018 年捐给 Apache 社区后改名。它是一个 MPP(大规模并行处理)分析型数据库,亚秒级响应,支持 10PB 以上的数据集,适合固定报表、实时分析、交互式分析和探索式分析。百度内部超过 200 个产品线在用,部署机器 1000 台以上,单一业务最大上百 TB。

doris01
doris02
  • FE(Frontend):存集群元数据,接收解析查询、生成计划、调度执行、返回结果。Leader 和 Follower 保证元数据高可用,单点宕机可在线恢复;Observer 不参与写入,只扩查询节点、备份元数据。
  • BE(Backend):存算一体,按 FE 的物理计划分布式执行。数据可靠性由 BE 保证,默认三副本,副本数可动态调。
  • MySQL 协议:用任意 MySQL 客户端或 ODBC/JDBC 就能连。
  • Broker:无状态独立进程,封装文件系统接口,让 Doris 能读 HDFS、S3、BOS 上的文件。

二、规格和节点规划

doris03

这次三台机器,FE 和 BE 混部:

  • 192.168.66.151:FE(LEADER) + BE + Broker,1.0.0 二进制包
  • 192.168.66.152:FE(FOLLOWER) + BE + Broker
  • 192.168.66.153:FE(OBSERVER) + BE + Broker

官方的经验值:10~100 台最能发挥性能,其中 3 台部署 FE;最少 4 台(1 FE + 3 BE,一台 BE 上混部 Observer FE)也能平稳跑。一台机器可以跑多个 BE,但只能跑一个 FE;要 3 副本就得 3 台机器各跑一个 BE,而不是 1 台跑 3 个。FE 之间时钟偏差不超过 5 秒,所有节点关闭 Swap。FE 磁盘放元数据(几百 MB 到几个 GB),BE 磁盘按「数据量 × 3 副本 + 40% 余量」算。Follower 数量必须是奇数:1 个只保证读高可用,3 个才有读写高可用;Observer 数量随意,在线业务建议 3 Follower + 1~3 Observer,离线业务 1 + 1~3。

三、部署 FE

所有节点先装 JDK,节点 1 解压安装包后拷给其它节点:

rpm -ivh jdk-8u281-linux-x64.rpm
#在节点1上进行解压安装,然后拷贝给另外的节点即可
[root@doris-fe_be01 soft]# tar -zxvf apache-doris-1.0.0-incubating-bin.tar.gz -C  /usr/local/
[root@doris-fe_be01 soft]# cd /usr/local/
[root@doris-fe_be01 local]# mv apache-doris-1.0.0-incubating-bin apache-doris

CentOS 自带的 MariaDB 要先卸掉再装 MySQL 客户端:

#卸载掉默认的MariaDB
rpm -e --nodeps mariadb mariadb-libs mariadb-server
#安装MySQL YUM源
rpm -ivh https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm
#导入公钥
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
#安装MySQL客户端
yum install mysql-community-client

建元数据目录,改 fe.conf:

#创建元数据和日志存储目录,FE节点都需要创建
mkdir -p /data/fe/{doris-meta,log}
#修改配置
[root@doris-fe_be01 ~]# vim /usr/local/apache-doris/fe/conf/fe.conf 
doris04

配置里三件事:JAVA_OPTS 默认最大堆 4GB,生产建议 8G 以上;meta_dir 单独指定目录、最好单独一块 SSD,别留在安装目录下;机器有多个 IP(内外网、虚拟机、docker)时必须显式绑定。

写 systemd 单元托管 FE 进程:

cat > /usr/lib/systemd/system/doris-fe.service <<EOF
[Unit]
Description=Doris FE Service
Documentation=https://doris.apache.org
After=network.target network-online.target
Wants=network-online.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/java/jdk1.8.0_281-amd64"
User=root
Group=root
ExecStart=/usr/local/apache-doris/fe/bin/start_fe.sh --daemon
ExecStop=/usr/local/apache-doris/fe/bin/stop_fe.sh
ExecReload=/bin/kill --signal HUP
KillMode=control-group
KillSignal=SIGTERM
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=default.target
EOF
systemctl daemon-reload && systemctl restart doris-fe.service && systemctl enable doris-fe.service &&systemctl status doris-fe.service

FE 高可用用类 Raft 的 bdbje 协议做选主、日志复制和故障切换:Follower 是可投票成员,多数派确认,能容忍少数派故障;Observer 异步订阅日志、不投票,状态落后于 Follower。所有变更都由选出的 master 执行,非 master 节点同步到最近一次变更的 LSN 后可以直读,满足顺序一致性。所有 FE 的 http_port 要一致。

root 默认无密码,先改密码,再把另外两个 FE 加进来:

#连接到FE
[root@doris-fe_be01 ~]# mysql -h 192.168.66.151 -P 9030 -uroot
#默认root无密码,通过以下命令修改 root密码 。
mysql> SET PASSWORD FOR 'root' = PASSWORD('admin123456');
mysql> ALTER SYSTEM ADD FOLLOWER "192.168.66.152:9010";
mysql> ALTER SYSTEM ADD OBSERVER "192.168.66.153:9010";

安装目录拷到其它 FE 节点,改配置绑各自 IP,建同样的启动文件并拉起:

cat > /usr/lib/systemd/system/doris-fe.service <<EOF
[Unit]
Description=Doris FE Service
Documentation=https://doris.apache.org
After=network.target network-online.target
Wants=network-online.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/java/jdk1.8.0_281-amd64"
User=root
Group=root
ExecStart=/usr/local/apache-doris/fe/bin/start_fe.sh --helper 192.168.66.151:9010 --daemon
ExecStop=/usr/local/apache-doris/fe/bin/stop_fe.sh
ExecReload=/bin/kill --signal HUP
KillMode=control-group
KillSignal=SIGTERM
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=default.target
EOF
systemctl daemon-reload && systemctl restart doris-fe.service && systemctl enable doris-fe.service &&systemctl status doris-fe.service

检查集群成员:

[root@doris-fe_be01 ~]# mysql -h 192.168.66.151 -P 9030 -uroot -p
mysql> SHOW PROC '/frontends'G
doris05

四、部署 BE

BE 的 storage_root_path 默认在 be/storage 下要手动建目录,多路径用英文分号 ; 分隔(最后一个不加);priority_networks 每台改成自己的 IP;PPROF_TMPDIR 指到独立目录。

#创建数据和日志存储目录,BE节点都需要创建
mkdir -p /data/be/{doris-storage1,doris-storage2,log}
[root@doris-fe_be01 ~]# vim /usr/local/apache-doris/be/conf/be.conf
doris06

配置和目录拷到其它 BE 节点、各自改好 IP 后,在 FE 上把三个 BE 加进集群:

[root@doris-fe_be01 ~]# mysql -h 192.168.66.151 -P 9030 -uroot -p
ALTER SYSTEM ADD BACKEND "192.168.66.151:9050";
ALTER SYSTEM ADD BACKEND "192.168.66.152:9050";
ALTER SYSTEM ADD BACKEND "192.168.66.153:9050";

[[CODE:0089:10]]

确认 BE 状态,Alive 为 true 表示节点存活:

[[CODE:0089:11]]

doris07

五、Web UI 和踩过的坑

浏览器访问 http://FE_IP:FE_HTTP_PORT(默认 8030,Http 协议),账号 root,密码是前面改过的数据库 root 密码。

doris08
  • 测试环境一个 BE 就能跑,生产上查询延迟基本由 BE 数量决定,别按测试规格上线。
  • ALTER SYSTEM ADD BACKEND 执行成功不等于 BE 起来了,要回 SHOW PROC '/backends' 看 Alive。
  • 混部机器上 FE 和 BE 抢内存,BE 的 mem_limit 要留够余量。
© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容