Apache Doris由百度大数据部研发(之前叫百度Palo,2018年贡献到Apache社区后,更名为Doris ),在百度内部,有超过200个产品线在使用,部署机器超过1000台,单一业务最大可达到上百TB。
Apache Doris是一个现代化的MPP(Massively Parallel Processing,即大规模并行处理)分析型数据库产品。仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析。
Apache Doris的分布式架构非常简洁,易于运维,并且可以支持10PB以上的超大数据集。Apache Doris可以满足多种数据分析需求,例如固定历史报表,实时数据分析,交互式数据分析和探索式数据分析等。
Doris的架构很简洁,只设FE(Frontend)、BE(Backend)两种角色、两个进程,不依赖于外部组件,方便部署和运维,FE、BE都可线性扩展。
FE负责存储、维护集群元数据;负责接收、解析查询请求,规划查询计划,调度查询执行,返回查询结果。主要有三个角色:
(1)Leader和Follower:主要是用来达到元数据的高可用,保证单节点宕机的情况下,元数据能够实时地在线恢复,而不影响整个服务。
(2)Observer:用来扩展查询节点,同时起到元数据备份的作用。如果在发现集群压力非常大的情况下,需要去扩展整个查询的能力,那么可以加observer的节点。observer 不参与任何的写入,只参与读取。
BE负责 物理数据 的存储和计算;依据FE生成的物理计划,分布式地执行查询。数据的可靠性由BE保证,BE会对整个数据存储多副本或者是三副本。副本数可根据需求动态调整。
Doris借助MySQL协议,用户使用任意MySQL的ODBC/JDBC以及MySQL的客户端,都可以直接访问Doris。
Broker为一个独立的无状态进程。封装了文件系统接口,提供Doris读取远端存储系统中文件的能力,包括HDFS,S3,BOS等。
环境:CentOS7,jdk8,python2,gcc7.5.0
确保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
第一步,下载源码并解压:
[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>aliyunid>
<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
编译后的结果如下:
在挂载的宿主机CentOS7目录里,会出现output目录:
将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实例即可。
默认端口:
当部署多个FE实例时,要保证FE的http_port 配置相同。部署前请确保各个端口在应有方向上的访问权限。
创建存放元数据的目录:
[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
创建两个数据存储目录:
[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)
首先需要编译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)