概述
1.1 Doris的简介
Apache Doris 是一款基于 MPP 架构的高性能、实时的分析型数据库,以高效、简单、统一的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。
Apache Doris最早是诞生于百度的Palo项目,2017年正式对外开源,2018年捐赠给 Apache 基金会进行孵化,如今在中国乃至全球范围内都拥有着广泛的用户群体,截止目前,Apache Doris 已经在全球超过4000家中大型企业的生产环境中得到应用。
1.2 Doris的使用情景
数据源经过各种数据集成和加工处理后,通常会入库到实时数据仓库 Apache Doris 和离线湖仓(Hive, Iceberg, Hudi中),Apache Doris 被广泛应用在以下场景中。
1.3 Doris的架构
Apache Doris 的整体架构非常简单,如下图所示,只有两类进程:
Frontend(FE):主要负责用户请求的接入、查询解析规划、元数据的管理、节点管理相关工作。
Backend(BE):主要负责数据存储、查询计划的执行。
FE和BE进程可以自由地横向扩展,单集群可以支持到数百台机器,数十 PB 的存储容量,并且都通过一致性协议来保证服务的高可用和数据的高可靠。
1.4 Doris的部署方式
Apache Doris可以通过manager组件在物理机或虚拟机上部署,也可以手工在在物理机或虚拟机上部署,也可以通过operator在Kubernetes上部署。本文介绍通过operator方式来部署Doris集群。
2 环境
- 一个华为云Kubernetes集群(Turbo类型):
-
一个华为云NAS服务SFS Turbo实例:
-
一个华为云负载均衡器ELB:
3 部署
3.1 Kubernetes中部署CRD和operator服务
部署CRD,命令如下:
wget https://raw.githubusercontent.com/apache/doris-operator/master/config/crd/bases/doris.apache.com_dorisclusters.yaml
# 必须带上参数--server-side
# 否则出现:The CustomResourceDefinition "dorisclusters.doris.selectdb.com" is invalid: metadata.annotations: Too long: must have at most 262144 bytes
kubectl apply -f doris.apache.com_dorisclusters.yaml --server-side
部署operator服务,命令如下:
wget https://raw.githubusercontent.com/apache/doris-operator/master/config/operator/operator.yaml
kubectl apply -f operator.yaml
kubectl get pod -n doris
3.2 Kubernetes中创建存储类storageclass
参数everest.io/share-access-to是VPC的ID。
参数everest.io/share-export-location是sfs turbo实例的共享路径:自定义子目录,sfs turbo实例的共享路径是在sfs实例的详细页查询,自定义子目录可以是任意路径。
参数everest.io/volume-id是sfs turbo实例的ID。
只需要修改以上三个参数。
在本文,storageclass的名称叫做sfsturbo-subpath-sc。
apiVersion: storage.k8s.io/v1
allowVolumeExpansion: true
kind: StorageClass
metadata:
name: sfsturbo-subpath-sc
mountOptions:
- lock
parameters:
csi.storage.k8s.io/csi-driver-name: sfsturbo.csi.everest.io
csi.storage.k8s.io/fstype: nfs
everest.io/archive-on-delete: "true"
everest.io/share-access-to: xxxxxxxxxxxxxxxxxx # VPC ID
everest.io/share-expand-type: bandwidth
everest.io/share-export-location: xxxxx.sfsturbo.internal:/mydir # sfs turbo实例的共享路径:自定义子目录
everest.io/share-source: sfs-turbo
everest.io/share-volume-type: STANDARD
everest.io/volume-as: subpath
everest.io/volume-id: xxxxxxxxxxxxx # sfs turbo实例的ID
provisioner: everest-csi-provisioner
reclaimPolicy: Delete
volumeBindingMode: Immediate
3.3 Kubernetes中部署Doris集群
从github下载模板CR文件。
wget https://github.com/apache/doris-operator/blob/master/doc/examples/doriscluster-sample-storageclass.yaml
- storageClassName字段:用于指定kubernetes存储类,此处设置为上一步创建的sfsturbo-subpath-sc。
- accessModes字段:使用了华为云NAS服务作为后端存储,该值必须是ReadWriteMany。
- adminUser字段:用于初始化doris fe的管理员账号密码。
最终要使用的描述doris集群的CR的yaml文件如下:
apiVersion: doris.selectdb.com/v1
kind: DorisCluster
metadata:
labels:
app.kubernetes.io/name: doriscluster
app.kubernetes.io/instance: doriscluster-sample-storageclass
app.kubernetes.io/part-of: doris-operator
name: doriscluster-sample-storageclass1
spec:
adminUser:
name: root
password: doris@123
feSpec:
replicas: 3
image: selectdb/doris.fe-ubuntu:2.1.1
limits:
cpu: 2
memory: 4Gi
requests:
cpu: 2
memory: 4Gi
persistentVolumes:
- mountPath: /opt/apache-doris/fe/doris-meta
name: fetest
persistentVolumeClaimSpec:
# when use specific storageclass, the storageClassName should reConfig, example as annotation.
storageClassName: sfsturbo-subpath-sc
accessModes:
- ReadWriteMany
resources:
# notice: if the storage size less 5G, fe will not start normal.
requests:
storage: 10Gi
- mountPath: /opt/apache-doris/fe/log
name: felog
persistentVolumeClaimSpec:
# when use specific storageclass, the storageClassName should reConfig, example as annotation.
storageClassName: sfsturbo-subpath-sc
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
beSpec:
replicas: 3
image: selectdb/doris.be-ubuntu:2.1.1
limits:
cpu: 2
memory: 4Gi
requests:
cpu: 2
memory: 4Gi
persistentVolumes:
- mountPath: /opt/apache-doris/be/storage
name: betest
persistentVolumeClaimSpec:
# when use specific storageclass, the storageClassName should reConfig, example as annotation.
storageClassName: sfsturbo-subpath-sc
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
- mountPath: /opt/apache-doris/be/log
name: belog
persistentVolumeClaimSpec:
# when use specific storageclass, the storageClassName should reConfig, example as annotation.
storageClassName: sfsturbo-subpath-sc
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
执行以下命令将CR写入到kubernetes集群中:
kubectl apply -f doriscluster-sample-storageclass.yaml
最终可以看见3个FE和3个BE:
3.4 云上负载均衡器暴露Doris FE
为Doris FE服务的8030端口创建HTTP路由,并且在ELB开启7层会话保持或者4层会话保持。
-
7层会话保持:
-
4层会话保持:
3.5 多FE情景下不开启会话保持必然发生的现象
访问FE的web界面,发生几次点击就会出现账号登出现象。可见FE实例之间是不共享WEB信息。
4 公网访问Doris FE的WEB UI
浏览器输入云上负载均衡器的公网IP,在WEB UI中输入账号密码登录后,即可看见Doris集群的信息,下图显示本次部署的doris集群的BE服务正常运行。
5 小结
本文介绍通过operator的方式在云上kubernetes中部署使用PV的doris集群,并通过云上负载均衡器暴露FE服务。需要再次提醒大家注意的是,部署CRD时需要带上参数--server-side,多FE情景下负载均衡器需要开启7层或4层会话保持。