文章目录

  • 介绍
  • 概述
  • 架构
  • FE (Frontend)
  • BE (Backend)
  • MySQL Client
  • Broker
  • 编译安装
  • 安装docker
  • 通过docker编译
  • 部署注意事项
  • 部署
  • 部署FE
  • 部署BE
  • FS_Broker


介绍

概述

Apache Doris由百度大数据部研发(之前叫百度Palo,2018年贡献到Apache社区后,更名为Doris ),在百度内部,有超过200个产品线在使用,部署机器超过1000台,单一业务最大可达到上百TB。

Apache Doris是一个现代化的MPP(Massively Parallel Processing,即大规模并行处理)分析型数据库产品。仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析。

Apache Doris的分布式架构非常简洁,易于运维,并且可以支持10PB以上的超大数据集。Apache Doris可以满足多种数据分析需求,例如固定历史报表,实时数据分析,交互式数据分析和探索式数据分析等。

Dokan的技术架构图_docker


Dokan的技术架构图_docker_02

架构

Dokan的技术架构图_apache_03


Doris的架构很简洁,只设FE(Frontend)、BE(Backend)两种角色、两个进程,不依赖于外部组件,方便部署和运维,FE、BE都可线性扩展。

FE (Frontend)

FE负责存储、维护集群元数据;负责接收、解析查询请求,规划查询计划,调度查询执行,返回查询结果。主要有三个角色:
(1)Leader和Follower:主要是用来达到元数据的高可用,保证单节点宕机的情况下,元数据能够实时地在线恢复,而不影响整个服务。
(2)Observer:用来扩展查询节点,同时起到元数据备份的作用。如果在发现集群压力非常大的情况下,需要去扩展整个查询的能力,那么可以加observer的节点。observer 不参与任何的写入,只参与读取。

BE (Backend)

BE负责 物理数据 的存储和计算;依据FE生成的物理计划,分布式地执行查询。数据的可靠性由BE保证,BE会对整个数据存储多副本或者是三副本。副本数可根据需求动态调整。

MySQL Client

Doris借助MySQL协议,用户使用任意MySQL的ODBC/JDBC以及MySQL的客户端,都可以直接访问Doris。

Broker

Broker为一个独立的无状态进程。封装了文件系统接口,提供Doris读取远端存储系统中文件的能力,包括HDFS,S3,BOS等。

编译安装

环境:CentOS7,jdk8,python2,gcc7.5.0

安装docker

确保python版本是python2:

[root@scentos szc]# python -V
Python 2.7.5

然后通过yum安装docker:

[root@scentos szc]# yum update -y
[root@scentos szc]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@scentos szc]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@scentos szc]# yum install docker-ce -y

启动docker并设置为开机启动:

[root@scentos szc]# systemctl start docker && systemctl enable docker

查看docker版本:

[root@scentos szc]# docker version
Client: Docker Engine - Community
Version:           20.10.16
API version:       1.41
Go version:        go1.17.10
Git commit:        aa7e414
Built:             Thu May 12 09:19:45 2022
OS/Arch:           linux/amd64
Context:           default
Experimental:      true

Server: Docker Engine - Community
Engine:
  Version:          20.10.16
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.10
  Git commit:       f756502
  Built:            Thu May 12 09:18:08 2022
  OS/Arch:          linux/amd64
  Experimental:     false
containerd:
  Version:          1.6.4
  GitCommit:        212e8b6fa2f44b9c21b2798135fc6fb7c53efc16
runc:
  Version:          1.1.1
  GitCommit:        v1.1.1-0-g52de29d
docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

通过docker编译

第一步,下载源码并解压:

[root@scentos szc]# wget http://archive.apache.org/dist/incubator/doris/0.15.0-incubating/apache-doris-0.15.0-incubating-src.tar.gz
[root@scentos szc]# tar -zxvf apache-doris-0.15.0-incubating-src.tar.gz

第二步,通过docker拉取镜像:

[root@scentos szc]# docker pull apache/incubator-doris:build-env-for-0.15.0

第三步,通过docker运行doris镜像,并指定挂载目录:

[root@scentos apache-maven-3.8.5]# docker run -it -v /root/.m2:/root/.m2 -v /home/szc/apache-doris-0.15.0-incubating-src/:/root/apache-doris-0.15.0-incubating-src/ apache/incubator-doris:build-env-for-0.15.0

第四步,修改apache-doris-0.15.0-incubating-src/vim fe/pom.xml文件,在标签里,添加阿里仓库:

<repository>
                    <id>aliyun</id>
                    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                </repository>

最后,切换jdk8,编译doris:

[root@8122c5f919fe apache-doris-0.15.0-incubating-src]# alternatives --set java java-1.8.0-openjdk.x86_64
[root@8122c5f919fe apache-doris-0.15.0-incubating-src]# alternatives --set javac java-1.8.0-openjdk.x86_64
[root@8122c5f919fe apache-doris-0.15.0-incubating-src]# export JAVA_HOME=/usr/lib/jvm/java-1.8.0
[root@8122c5f919fe apache-doris-0.15.0-incubating-src]# ./build.sh --clean --be --fe --ui

编译后的结果如下:

Dokan的技术架构图_Doris_04


在挂载的宿主机CentOS7目录里,会出现output目录:

Dokan的技术架构图_Dokan的技术架构图_05


将output目录拷贝出来即可:

[root@scentos apache-doris-0.15.0-incubating-src]# cp -r output/ ../doris-0.15.0/
[root@scentos apache-doris-0.15.0-incubating-src]# cd ..
[root@scentos szc]# cd doris-0.15.0/

再修改可打开文件数,对应文件:/etc/security/limits.conf

* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

重启生效

部署注意事项

(1)FE的磁盘空间主要用于存储元数据,包括日志和image。通常从几百MB到几个GB不等。
(2)BE的磁盘空间主要用于存放用户数据,总磁盘空间按用户总数据量* 3(3副本)计算,然后再预留额外40%的空间用作后台compaction以及一些中间数据的存放。
(3)一台机器上可以部署多个BE实例,但是只能部署一个FE。如果需要3副本数据,那么至少需要3台机器各部署一个BE实例(而不是1台机器部署3个BE实例)。多个FE所在服务器的时钟必须保持一致(允许最多5秒的时钟偏差)
(4)测试环境也可以仅适用一个BE进行测试。实际生产环境,BE实例数量直接决定了整体查询延迟。
(5)所有部署节点关闭Swap。
(6)FE 节点数据至少为1(1个Follower)。当部署 1个Follower和1个Observer 时,可以实现读高可用。当部署3个Follower时,可以实现读写高可用(HA)。
(7)Follower的数量必须为奇数,Observer数量随意。
(8)根据以往经验,当集群可用性要求很高时(比如提供在线业务),可以部署3个Follower和 1-3个Observer。如果是离线业务,建议部署1个Follower和1-3个 Observer。
(9)Broker是用于访问外部数据源(如 HDFS)的进程。通常,在每台机器上部署一个broker实例即可。

默认端口:

Dokan的技术架构图_Dokan的技术架构图_06


当部署多个FE实例时,要保证FE的http_port 配置相同。部署前请确保各个端口在应有方向上的访问权限。

部署

部署FE

创建存放元数据的目录:

[root@scentos doris-0.15.0]# mkdir doris-meta

修改配置文件:

[root@scentos doris-0.15.0]# vim fe/conf/fe.conf

修改元数据目录路径和IP地址:

meta_dir = /home/szc/doris-0.15.0/doris-meta
.....
priority_networks = 192.168.31.141/24

启动fe:

[root@scentos doris-0.15.0]# fe/bin/start_fe.sh --daemon

部署BE

创建两个数据存储目录:

[root@scentos doris-0.15.0]# mkdir doris_storage1
[root@scentos doris-0.15.0]# mkdir doris_storage2

修改be配置文件:

[root@scentos doris-0.15.0]# vim be/conf/be.conf

绑定IP,修改数据存储路径和存储介质:

priority_networks = 192.168.31.141/24
.....
storage_root_path = storage_root_path = /home/szc/doris-0.15.0/doris_storage1,medium:SSD;/home/szc/doris-0.15.0/doris_storage2,medium:SSD

如果没有安装MySQL,需要安装,然后通过MySQL连接FE(首次登录无密码):

[root@scentos szc]# mysql -h scentos -P 9030 -uroot

设置密码:

mysql> SET PASSWORD FOR 'root' = PASSWORD('root');
Query OK, 0 rows affected (0.06 sec)

添加be:

mysql> ALTER SYSTEM ADD BACKEND "scentos:9050";
Query OK, 0 rows affected (0.06 sec)

查看be状态:

mysql> SHOW PROC '/backends';
+-----------+-----------------+----------------+----------+---------------+--------+----------+----------+---------------+---------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------------------------+--------------------------------------------------------------------+---------+----------------------------------------------------------------+
| BackendId | Cluster         | IP             | HostName | HeartbeatPort | BePort | HttpPort | BrpcPort | LastStartTime | LastHeartbeat | Alive | SystemDecommissioned | ClusterDecommissioned | TabletNum | DataUsedCapacity | AvailCapacity | TotalCapacity | UsedPct | MaxDiskUsedPct | Tag                      | ErrMsg                                                             | Version | Status                                                         |
+-----------+-----------------+----------------+----------+---------------+--------+----------+----------+---------------+---------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------------------------+--------------------------------------------------------------------+---------+----------------------------------------------------------------+
| 11001     | default_cluster | 192.168.31.141 | scentos  | 9050          | -1     | -1       | -1       | NULL          | NULL          | false | false                | false                 | 0         | 0.000            | 1.000 B       | 0.000         | 0.00 %  | 0.00 %         | {"location" : "default"} | java.net.ConnectException: Connection refused (Connection refused) |         | {"lastSuccessReportTabletsTime":"N/A","lastStreamLoadTime":-1} |
+-----------+-----------------+----------------+----------+---------------+--------+----------+----------+---------------+---------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------------------------+--------------------------------------------------------------------+---------+----------------------------------------------------------------+
1 row in set (0.02 sec)

然后启动be:

[root@scentos doris-0.15.0]# be/bin/start_be.sh --daemon

查看MySQL中的backends状态,其中Alive字段为true,表示be启动成功:

mysql> SHOW PROC '/backends';
+-----------+-----------------+----------------+----------+---------------+--------+----------+----------+---------------------+---------------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------------------------+--------+---------------------+--------------------------------------------------------------------------------+
| BackendId | Cluster         | IP             | HostName | HeartbeatPort | BePort | HttpPort | BrpcPort | LastStartTime       | LastHeartbeat       | Alive | SystemDecommissioned | ClusterDecommissioned | TabletNum | DataUsedCapacity | AvailCapacity | TotalCapacity | UsedPct | MaxDiskUsedPct | Tag                      | ErrMsg | Version             | Status                                                                         |
+-----------+-----------------+----------------+----------+---------------+--------+----------+----------+---------------------+---------------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------------------------+--------+---------------------+--------------------------------------------------------------------------------+
| 10002     | default_cluster | 192.168.31.141 | scentos  | 9050          | 9060   | 8040     | 8060     | 2022-05-14 12:27:16 | 2022-05-14 12:27:22 | true  | false                | false                 | 0         | 0.000            | 219.981 GB    | 282.097 GB    | 22.02 % | 22.02 %        | {"location" : "default"} |        | 0.15.0-rc04-Unknown | {"lastSuccessReportTabletsTime":"2022-05-14 12:27:22","lastStreamLoadTime":-1} |
+-----------+-----------------+----------------+----------+---------------+--------+----------+----------+---------------------+---------------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------------------------+--------+---------------------+--------------------------------------------------------------------------------+
1 row in set (0.01 sec)

FS_Broker

首先需要编译Broker源码,在docker中进入fs_brokers/apache_hdfs_broker目录,执行build.sh编译:

[root@8122c5f919fe apache-doris-0.15.0-incubating-src]# cd fs_brokers/apache_hdfs_broker/
[root@8122c5f919fe apache_hdfs_broker]# ./build.sh

完成后,将broker的output目录拷贝出来:

[root@scentos doris-0.15.0]# cp -r ../apache-doris-0.15.0-incubating-src/fs_brokers/apache_hdfs_broker/output/ ./apache_hdfs_broker
[root@scentos doris-0.15.0]# mv ./apache_hdfs_broker ./hdfs_broker

启动broker:

[root@scentos doris-0.15.0]# ./hdfs_broker/bin/start_broker.sh --daemon

在MySQL中添加broker:

mysql> ALTER SYSTEM ADD BROKER broker_name "scentos:8000";

查看broker状态,其中Alive字段为true,表示连接成功:

mysql> SHOW PROC '/brokers';
+-------------+----------------+----------+------+-------+---------------------+---------------------+--------+
| Name        | IP             | HostName | Port | Alive | LastStartTime       | LastUpdateTime      | ErrMsg |
+-------------+----------------+----------+------+-------+---------------------+---------------------+--------+
| broker_name | 192.168.31.141 | scentos  | 8000 | true  | 2022-05-14 12:44:18 | 2022-05-14 12:44:53 |        |
+-------------+----------------+----------+------+-------+---------------------+---------------------+--------+
1 row in set (0.00 sec)