在华为云通过operator部署Doris v2.1集群

概述

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层会话保持。

相关推荐
鹤落晴春16 小时前
【K8s】Pod调度、configMaps
云原生·容器·kubernetes
张忠琳16 小时前
【runc 1.4.2】(Part 2)runc 1.4.2 超深度分析 — CLI层:main.go、命令文件、runner、信号处理、TTY
云原生·kubernetes·runc
江华森21 小时前
JumpServer v4.10.16-ce 华为云 ECS 实战部署全记录
华为云
Plastic garden1 天前
K8s知识(3) Pod亲和性,调度
云原生·容器·kubernetes
张忠琳1 天前
【client-go v0.36.1】(store Part 1)Store 超深度分析 — 模块定位、接口层次、类结构、KeyFunc体系、构造初始化
云原生·kubernetes·informer·store·client-go
云智慧AIOps社区1 天前
云智慧Cloudwise 亮相华为云 × 霞光社中企私享会,Qreel 重构 AI 短剧出海新范式
人工智能·华为云·ai短剧·短剧创作
码农翻身1 天前
英伟达向左,华为云向右:AI数据中心该走哪条路?
人工智能·华为云
PPIO派欧云1 天前
PPIO亮相华为云创想者大会:以Agentic Cloud加速中国AI走向全球
人工智能·华为云
开发者联盟league1 天前
使用jenkins pipeline将项目打包运行在k8s上报错kubectl: Permission denied
java·kubernetes·jenkins