Doris 3.0存算分离|标准部署篇

文摘   2024-10-27 00:00   重庆  

  导读   本文主要分享Apache Doris 3.0存算分离架构的标准部署实践。

全文目录:

  1. 前提概要

  2. 环境信息

  3. 前置准备

  4. FoundationDB安装

  5. OpenJDK 17安装

  6. Meta Service安装

  7. 集群安装

  8. 快速体验

  9. 常见FAQ



一、前提概要

Doris 存算分离架构部署方式示意图如下,共需要 3 个模块参与工作:

  • FE:负责接收用户请求,负责存储库表的元数据,目前是有状态的,未来会和 BE 类似,演化为无状态。
  • BE:无状态化的 Doris BE 节点,负责具体的计算任务。BE 上会缓存一部分 Tablet 元数据和数据以提高查询性能。
  • MS:存算分离模式新增模块,程序名为 doris_cloud,可通过启动不同参数来指定为以下两种角色之一
    • Meta Service:元数据管理,提供元数据操作的服务,例如创建 Tablet,新增 Rowset,Tablet 查询以及 Rowset 元数据查询等功能。
    • Recycler:数据回收。通过定期对记录已标记删除的数据的元数据进行扫描,实现对数据的定期异步正向回收(文件实际存储在 S3 或 HDFS 上),而无须列举数据对象进行元数据对比。

Meta Service 是一种无状态化的服务,依赖了一个高性能分布式事务 KV(即 FoundationDB)来存储元数据,大幅简化了元数据管理流程,同时提供强大的横向的扩展能力。

Doris 存算分离架构依赖于两个外部开源项目,为确保部署顺利,请在开始前预先安装以下依赖:

  • FoundationDB (FDB)
  • OpenJDK17: 需要安装到所有部署 Meta Service 的节点上。

二、环境信息

2.1 硬件信息

  • CPU架构:X86_64

2.2 软件信息

  • Doris版本:3.0.0
  • JDK版本:OpenJDK17
  • FoundationDB:7.1.38
  • 系统:Linux VM-10-6-centos

三、前置准备

动手先,先梳理下安装步骤。

Doris 存算分离模式部署按照模块与分工"自下而上"部署:

  1. 官方手册文档浏览:https://doris.apache.org/zh-CN/docs/dev/compute-storage-decoupled/before-deployment
  2. 存算分离模式机器规划。
  3. 部署 FoundationDB 以及运行环境(JDK17)等基础的依赖,这一步骤不需要 Doris 的编译产出即可完成。
  4. 部署 Meta Service以及 Recycler
  5. 部署 FE 以及 BE

注意:一套 FoundationDB + Meta Service + Recycler 基础环境可以支撑多个存算分离模式的 Doris 实例(即多套 FE + BE )。

四、FoundationDB安装

通常情况下,需要至少 3 台机器组成一个双副本、允许单机故障的 FoundationDB 集群。如果仅出于开发/测试需要,使用一台机器即可。

本文先以一台测试为例。

4.1 安装包下载

每台机器都需先安装 FoundationDB 服务。可通过以下地址选择一个版本下载 FoundationDB 安装包,目前通常推荐使用 7.1.38 版本。

对于 CentOS (Red Hat) 和 Ubuntu 用户,以下是下载链接:

  • clients-x86_64.rpm
  • server-x86_64.rpm
  • clients-amd64.deb
  • server-amd64.deb

如果需要更高速的下载,也可使用如下镜像链接:

  • clients-x86_64.rpm
  • server-x86_64.rpm
  • clients-amd64.deb
  • server-amd64.deb
-- client
wget https://selectdb-doris-1308700295.cos.ap-beijing.myqcloud.com/toolkit/fdb/foundationdb-clients-7.1.38-1.el7.x86_64.rpm

-- server
wget https://selectdb-doris-1308700295.cos.ap-beijing.myqcloud.com/toolkit/fdb/foundationdb-server-7.1.38-1.el7.x86_64.rpm

4.2 安装部署

可以使用如下命令安装 FoundationDB 程序:

sudo rpm -Uvh foundationdb-clients-7.1.38-1.el7.x86_64.rpm foundationdb-server-7.1.38-1.el7.x86_64.rpm

安装完毕后,在命令行输入 fdbcli 查看是否安装成功。若返回结果显示如下 available 字样,则表示安装成功:

[zhangbinhua@VM-10-6-centos package]$ fdbcli
Using cluster file `/etc/foundationdb/fdb.cluster'.

The database is available.

Welcome to the fdbcli. For help, type `help'
.

安装成功后:

  • 默认将启动一个 FoundationDB 服务。
  • 默认集群信息文件 fdb.cluster将存放在/etc/foundationdb/fdb.cluster,默认集群配置文件 foundationdb.conf 将存放在/etc/foundationdb/foundationdb.conf。
  • 默认将数据和日志分别保存在/var/lib/foundationdb/data/和/var/log/foundationdb。
  • 默认将新建一个 FoundationDB 的 user 和 group,数据和日志的路径默认已具备 FoundationDB 的访问权限。

五、OpenJDK 17安装

OpenJDK 17 需安装到所有的节点上,可通过以下链接获取安装OpenJDK 17:

https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4267845be086888add4f/12/GPL/openjdk-17.0.1_linux-x64_bin.tar.gz

wget https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4267845be086888add4f/12/GPL/openjdk-17.0.1_linux-x64_bin.tar.gz

然后,将下载好的 OpenJDK 安装包直接解压到安装路径即可:

tar xf openjdk-17.0.1_linux-x64_bin.tar.gz

启动 Meta Service 或者 Recycler 之前

export JAVA_HOME=/opt/jdk-17.0.1

六、 Meta Service安装

相比 3.0.0 之前的版本,编译完成的二进制包中(产出)多了 ms 目录。

ms目录将同时用于 Meta Service 和 Recycler 两种进程。需要注意的是,尽管 Meta Service 和 Recycler 在本质上属于同一程序,但目前需要分别为它们准备独立的二进制文件,以及工作目录。Meta Service 和 Recycler 两个工作目录除了配置完全一致,使用不同启动参数启动。

要准备两份二进制文件/工作目录,只需使用以下命令从ms目录中拷贝二进制文件至一个新的 Recycler 工作目录re,然后在ms和re的conf子目录下,对端口号等参数按需进行必要修改即可。详细的配置启动会在本文后续章节介绍。

cp -r ms re

6.1 Meta Service配置

# 通常情况下,只需在
./apache-doris-3.0.0-bin-x64/ms/conf 
目录下的默认配置文件 
doris_cloud.conf中修改 brpc_listen_port 
和 fdb_cluster 两个参数。
(Meta Service 配置只需一个配置文件。)

brpc_listen_port = 5000
fdb_cluster = xxx:yyy@127.0.0.1:4500

上述 brpc_listen_port = 5000 是 Meta Service 的默认端口。其中,fdb_cluster 是 FoundationDB 集群的连接信息,通常可从 FoundationDB 所部署机器上的 /etc/foundationdb/fdb.cluster 文件中获得。

6.2 Recycler配置

除了端口外,Recycler 的其他默认配置均与 Meta Service 相同。Recycler 的 bRPC 端口一般采用 5100。

# 通常情况下,只需在
./apache-doris-3.0.0-bin-x64/re/conf  
目录下的默认配置文件 
doris_cloud.conf中修改 brpc_listen_port 
和 fdb_cluster 两个参数。
(Recycler 配置只需一个配置文件。)

brpc_listen_port = 5100
fdb_cluster = xxx:yyy@127.0.0.1:4500

上述 brpc_listen_port = 5100 是 Recycler 的默认端口。其中,fdb_cluster 是 FoundationDB 集群的连接信息,通常可从 FoundationDB 所部署机器上的 /etc/foundationdb/fdb.cluster 文件中获得。

6.3 MS服务启动

Meta Service 和 Recycler 依赖 JAVA 运行环境,并使用 OpenJDK 17。在启动前这两个服务前,请确保已正确设置 export JAVA_HOME 环境变量。

doris_cloud 部署的 bin 目录下提供了启停脚本,调用对应的启停脚本即可完成启停。

6.3.1 启停 Meta Service

# 确保为jdk17的环境
export JAVA_HOME=${path_to_jdk_17}
# 进入meta-service目录
cd ./apache-doris-3.0.0-bin-x64/ms/bin
# 后台启动meta-service
bin/start.sh --meta-service --daemon
# 停止meta-service
bin/stop.sh

此时再查看下ms/log确认

# 滚动打印 finish to collect fdb metric 表示ms启动成功!
tail -100f meta_service.INFO

6.3.2 启停 Recycler

# 进入recycler目录
cd ./apache-doris-3.0.0-bin-x64/re/bin
# 后台启动recycler
bin/start.sh --recycler --daemon
# 停止recycler
bin/stop.sh

此时再查看下re/log确认

# 滚动打印 Periodically log for recycler 表示ms启动成功!
tail -100f recycler.INFO

在成功部署并启动 Meta Service 和 Recycler 之后,Doris 存算分离模式的底座便已完成搭建。

七、集群安装

前文部署的一套 FoundationDB + Meta Service + Recycler 基础环境可以支撑多个存算分离集群,一个存算分离集群又称为一个数仓实例(Instance)。

在存算分离架构下,数仓实例的节点构成信息由 Meta Service 维护(注册 + 变更)。FE、BE 和 Meta Service 交互以实现服务发现和身份验证。创建存算分离集群主要涉及与 Meta Service 的交互,Meta Service 提供了标准的 HTTP 接口进行资源管理操作。

Doris 存算分离模式采用服务发现的机制进行工作,创建存算分离集群可以归纳为以下步骤:

  1. 注册存储后端:注册声明数仓实例以及它的存储后端。
  2. 注册FE/BE:注册声明数仓实例中的 FE 和 BE 节点组成,分别包含哪些机器,以及如何组成集群。
  3. 安装FE/BE:配置并启动所有的 FE 和 BE 节点。

7.1 注册存储后端

本文以基于 S3 的存算分离模式 Doris 集群为例。

存储后端是 Doris 在存算分离模式中所使用的远程共享存储,可配置一个或多个存储后端,可将不同表存储在不同存储后端上。

基于对象存储的所有属性均为必填项,其中:

  • 使用 MinIO 等支持 S3 协议的对象存储时,需要自行测试连通性以及 AK / SK 的正确性。具体做法可参考使用 AWS CLI 验证 MinIO 是否工作。
  • Bucket 字段的值为 Bucket 名称,不包含 s3:// 等 schema。
  • external_endpoint 保持与 endpoint 值相同即可。
  • 如果使用非云厂商对象存储,region 和 provider 可填写任意值。
# 示例
curl -s "127.0.0.1:5000/MetaService/http/create_instance?token=greedisgood9999" -d \
'{
  "instance_id": "sample_instance_id",
  "name": "sample_instance_name",
  "user_id": "sample_user_id",
  "vault": {
    "obj_info": {
      "ak": "ak_xxxxxxxxxxx",
      "sk": "sk_xxxxxxxxxxx",
      "bucket": "sample_bucket_name",
      "prefix": "sample_prefix",
      "endpoint": "cos.ap-beijing.myqcloud.com",
      "external_endpoint": "cos.ap-beijing.myqcloud.com",
      "region": "ap-beijing",
      "provider": "COS"
    }
  }
}'

7.2 注册FE/BE

7.2.1 添加FE

存算分离模式下,FE 以及 BE 的节点管理使用的接口相同,仅参数配置不同, 可通过 Meta Service add_cluster 接口先进行 FE 以及 BE 的初始节点添加。

add_cluster 接口的参数列表如下:

以下为添加一个 FE 的示例,cloud_unique_id自定义为

1:sample_instance_id:zbh_cloud_unique_id_sql_server00

# 示例
# 添加 FE
curl '127.0.0.1:5000/MetaService/http/add_cluster?token=greedisgood9999' -d '{
    "instance_id":"sample_instance_id",
    "cluster":{
        "type":"SQL",
        "cluster_name":"RESERVED_CLUSTER_NAME_FOR_SQL_SERVER",
        "cluster_id":"RESERVED_CLUSTER_ID_FOR_SQL_SERVER",
        "nodes":[
            {
                "cloud_unique_id":"1:sample_instance_id:zbh_cloud_unique_id_sql_server00",
                "ip":"172.21.16.21",
                "edit_log_port":12103,
                "node_type":"FE_MASTER"
            }
        ]
    }
}'

# 示例
# 创建成功后,可以通过 get_cluster 返回值 进行确认
curl '127.0.0.1:5000/MetaService/http/get_cluster?token=greedisgood9999' -d '{
    "instance_id":"sample_instance_id",
    "cloud_unique_id":"1:sample_instance_id:cloud_unique_id_sql_server00",
    "cluster_name":"RESERVED_CLUSTER_NAME_FOR_SQL_SERVER",
    "cluster_id":"RESERVED_CLUSTER_ID_FOR_SQL_SERVER"
}'

7.2.2 添加BE

用户可创建一个或多个计算集群,一个计算集群由任意多个 BE 节点组成。创建计算集群操作也可通过 Meta Service add_cluter 接口进行。

接口描述详见前文 “添加 FE” 章节。

用户可根据实际需求调整计算集群的数量及其所包含的节点数量,不同的计算集群需要使用不同的 cluster_name 和 cluster_id。

如下是创建包含 1 个 BE 的 计算集群:

# 示例
# 添加 BE
curl '127.0.0.1:5000/MetaService/http/add_cluster?token=greedisgood9999' -d '{
    "instance_id":"sample_instance_id",
    "cluster":{
        "type":"COMPUTE",
        "cluster_name":"cluster_name0",
        "cluster_id":"cluster_id0",
        "nodes":[
            {
                "cloud_unique_id":"1:sample_instance_id:cloud_unique_id_compute_node0",
                "ip":"172.21.16.21",
                "heartbeat_port":9455
            }
        ]
    }
}'


# 示例
# 创建成功后,通过 get_cluster 进行确认
curl '127.0.0.1:5000/MetaService/http/get_cluster?token=greedisgood9999' -d '{
    "instance_id":"sample_instance_id",
    "cloud_unique_id":"1:sample_instance_id:cloud_unique_id_compute_node0",
    "cluster_name":"cluster_name0",
    "cluster_id":"cluster_id0"
}'

7.3 安装FE/BE

7.3.1 FE/BE 配置

相较于存算一体模式,存算分离模式下的 FE 和 BE 增加了部分配置,其中:

  • meta_service_endpoint:Meta Service 的地址,需在 FE 和 BE 中填写。
  • cloud_unique_id:根据创建存算分离集群发往 Meta Service add_cluster 请求中的实际值填写即可;Doris 通过该配置的值确定是否在存算分离模式下工作。可自定义!

fe.conf

# 示例
meta_service_endpoint = 127.0.0.1:5000
cloud_unique_id = 1:sample_instance_id:zbh_cloud_unique_id_sql_server00

be.conf

下述示例中, meta_service_use_load_balancer 和 enable_file_cache 均可复制,其他配置项需根据实际情况填写。

file_cache_path 是一个 JSON 数组(根据实际缓存盘的个数配置),其各个字段含义如下:

  • path:缓存数据存放路径,类似于存算一体模式下的 storage_root_path
  • total_size:期望使用的缓存空间上限
  • query_limit:单个查询在缓存未命中时最多可淘汰的缓存数据量(为了防止大查询将缓存全部淘汰);因缓存需要存放数据,所以最好使用 SSD 等高性能磁盘作为缓存存储介质。
# 示例
meta_service_endpoint = 127.0.0.1:5000
cloud_unique_id = 1:sample_instance_id:zbh_cloud_unique_id_compute_node0
meta_service_use_load_balancer = false
enable_file_cache = true
file_cache_path = [{"path":"/mnt/disk1/doris_cloud/file_cache","total_size":104857600000,"query_limit":10485760000}, {"path":"/mnt/disk2/doris_cloud/file_cache","total_size":104857600000,"query_limit":10485760000}]

7.3.2 FE/BE 启停

Doris 存算分离模式下,BE/FE 启停方式和存算一体模式下的启停方式一致。存算分离模式属于服务发现的模式,不需通过 alter system add/drop frontend/backend 等命令操作节点。

# BE启动示例
bin/start_be.sh --daemon
bin/stop_be.sh

启动成功后jps可以查看对应新增be进程,并查看./log/be.INFO日志,正常启动日志如下:

#  FE启动示例
bin/start_fe.sh --daemon
bin/stop_fe.sh

启动成功后jps可以查看对应新增fe进程,并查看./log/fe.log日志,正常启动日志如下:

7.4 测试验证

上述启动后观察日志,如果上述配置均正确,则说明已进入正常工作模式,可通过 MySQL 客户端连接 FE 进行访问验证。

# MySQL 客户端连接 FE 
mysql -uroot -h 10.16.10.6 -P 9030 -p

# 查看存储后端
SHOW STORAGE VAULT\G

在成功注册FE/BE、安装FE/BE和注册存储后端之后,单节点的Doris存算分离集群构建完成,需要构建多节点Doris存算分离集群的小伙伴可以结合官方文档进行部署。

八、快速体验

MySQL 客户端连接 FE 测验。

8.1 查看计算集群

-- 通过 show clusters 查看当前仓库拥有的所有计算集群。
show clusters;

8.2 创建表

存算分离模式下,建表时在 PROPERTIES 中需要指定 storage_vault_name,则数据会存储在指定 vault name 所对应的存储后端上。建表成功后,该表不允许再修改 storage_vault,即不支持更换存储后端。storage_vault_name 可以通过 SHOW STORAGE VAULT 查看存储后端的结果进行选择。

-- 创建测试库
create database test;

-- 选择测试库
use test;

-- 创建测试表
CREATE TABLE `test_table` (
  `id` BIGINT NULL,
  `test` VARCHAR(256) NULL
) ENGINE=OLAP
UNIQUE KEY(`id`)
COMMENT '测试表'
DISTRIBUTED BY HASH(`id`) BUCKETS 10
PROPERTIES (
"replication_num" = "1",
"storage_vault_name" = "built_in_storage_vault"
);

8.3 数据写入

-- 生产不建议 INSERT INTO VALUES,仅测试用
INSERT INTO test_table VALUES (1,'TEST01'),(2,'TEST02'),(3,'TEST03');

8.4 查询测试

-- 查验数据完整性
SELECT * FROM test_table;

-- 查询数据准确性
SELECT id,test FROM test_table ORDER BY id LIMIT 1;

九、常见FAQ

Q1:FE启动报:

WARN (main|1) [CloudEnv.getClusterIdAndRole():178] 
failed to get local fe's type, sleep 5 s, try again.

A1:需要调整fe.conf中的priority_networks配置,例如修改为 127.0.0.1/32

至此,Doris 3.0 存算分离|单节点标准部署实践Over。




往期推荐

走进开源,拥抱开源

大数据平台开发规范示例

大数据仓库开发规范示例

Flink CDC 1.0至3.0回忆录

【Apache Doris】Manager 极致丝滑地运维管理

【Apache Doris】如何一键实现MySQL万表整库同步?

【Apache Doris】如何实现高并发点查?(原理+实践全析)

为什么Apache Doris适合做大数据的复杂计算,MySQL不适合?

如何正确地使用ChatGPT(角色扮演+提示工程)

超强满血不收费的AI绘图教程来了(在线Stable Diffusion一键即用)

 

点击下方蓝字关注一臻数据

大数据技能圈
分享大数据前沿技术,实战代码,详细文档
 最新文章