doris on k8s

背景

Doris 官網(wǎng)上有 Kubernetes 部署的文檔,無奈根據(jù)官網(wǎng)的文檔,構(gòu)建完鏡像無法成功啟動。故參考官網(wǎng)做了一些改動,成功啟動 FE、BE 節(jié)點。此探索為臨時部署方案,還需再完善、優(yōu)化。

版本說明與限制

組件 版本
Doris 1.2.4.1
Docker 20.10.23
Kubernetes 1.22.12

使用限制:只支持一個 FE 節(jié)點,BE 節(jié)點可以彈性擴縮容,支持掛載卷,防止數(shù)據(jù)丟失。FE、BE 服務(wù)掛掉后重新啟動,需要短暫等待,節(jié)點狀態(tài)正常后方可訪問。

部署流程

部署非常簡單,創(chuàng)建拷貝 yaml 文件內(nèi)容,即可啟動。若需修改版本,參考下文自定義鏡像。以下為示例,詳情可以查看 GitHub doris-k8s

啟動 FE 服務(wù)

fe-pvc-local.yaml

apiVersion: v1
kind: Service              
metadata: 
  name: doris-fe     
  namespace: default       
  labels: 
    app: doris-fe

spec: 
  type: NodePort           
  ports: 
    - name: http
      port: 8030           
      protocol: TCP
      targetPort: 8030       
      nodePort: 32130
    - name: tcp
      port: 9020           
      protocol: TCP
      targetPort: 9020       
      nodePort: 32220
    - name: tcp2
      port: 9030           
      protocol: TCP
      targetPort: 9030       
      nodePort: 32230
    - name: tcp1
      port: 9010           
      protocol: TCP
      targetPort: 9010       
      nodePort: 32210
  selector: 
    app: doris-fe
---
kind: StatefulSet
apiVersion: apps/v1
metadata:
  name: doris-fe
  namespace: default 
  labels:
    app: doris-fe
spec:
  serviceName: "doris-fe-service"
  replicas: 1
  selector:
    matchLabels:
      app: doris-fe
  template:
    metadata:
      labels:
        app: doris-fe
    spec:
      hostNetwork: false
      dnsPolicy: ClusterFirst
      containers:
        - name: doris-fe
          env:
          - name: FE_IPADDRESS
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
          - name: FE_PORT
            value: "9030"
          - name: FE_EDIT_PORT
            value: "9010"
          image: "zyzcenter/apache-doris:1.2.4.1-fe"
          imagePullPolicy: Always
          command: [ "/bin/bash", "-ce", "/opt/apache-doris/fe/bin/start_fe.sh --daemon;tail -f /dev/null" ]
          lifecycle:
            postStart:
              exec:
                command:
                  - bash
                  - -c
                  - '/opt/apache-doris/fe/bin/check_register_fe.sh'
          volumeMounts:
          - mountPath: /opt/apache-doris/fe/doris-meta
            name: volume-fe
          livenessProbe:
            httpGet:
              path: /api/bootstrap
              port: 8030
            initialDelaySeconds: 300
            periodSeconds: 30
            timeoutSeconds: 5
            failureThreshold: 3      
          ports:
            - containerPort: 8030
              protocol: TCP
            - containerPort: 9020
              protocol: TCP
            - containerPort: 9030
              protocol: TCP
            - containerPort: 9010
              protocol: TCP
          resources:
            limits:
              cpu: 2
              memory: 4G
            requests:
              cpu: 200m
              memory: 1G
  volumeClaimTemplates:
  - metadata:
      name: volume-fe
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "local"
      resources:
        requests:
          storage: 5Gi

啟動腳本:

kubectl create -f fe-pvc-local.yaml

啟動 BE 服務(wù)

be-pvc-local.yaml

kind: StatefulSet
apiVersion: apps/v1
metadata:
  name: doris-be
  namespace: default 
  labels:
    app: doris-be
spec:
  serviceName: "doris-be-service"
  replicas: 1
  selector:
    matchLabels:
      app: doris-be
  template:
    metadata:
      labels:
        app: doris-be
    spec:
      hostNetwork: false
      dnsPolicy: ClusterFirst
      terminationGracePeriodSeconds: 120            
      containers:
        - name: doris-be
          env:
            - name: BE_IPADDRESS
              valueFrom:
                 fieldRef:
                   fieldPath: status.podIP
            - name: BE_PORT
              value: "9050"
            - name: FE_MASTER_IP
              value: "doris-fe.default.svc.cluster.local"
            - name: FE_MASTER_PORT
              value: "9030"
            - name: POD_NAME
              valueFrom:
                 fieldRef:
                   fieldPath: metadata.name  
          image: "zyzcenter/apache-doris:1.2.4.1-be"
          imagePullPolicy: Always
          command: [ "/bin/bash", "-ce", "/opt/apache-doris/be/bin/start_be.sh --daemon;tail -f /dev/null" ]
          lifecycle:
            preStop:
              exec:
                command:
                  - bash
                  - -c
                  - '/opt/apache-doris/be/bin/cancel_be.sh;sleep 10'
          volumeMounts:
          - mountPath: /opt/apache-doris/be/storage
            name: volume-be
          livenessProbe:
            httpGet:
              path: /api/health
              port: 8040
            initialDelaySeconds: 300
            periodSeconds: 30
            timeoutSeconds: 5
            failureThreshold: 3 
          ports:
            - containerPort: 9060
              protocol: TCP
            - containerPort: 9070
              protocol: TCP
            - containerPort: 8040
              protocol: TCP
            - containerPort: 9050
              protocol: TCP
            - containerPort: 8060
              protocol: TCP
          resources:
            limits:
              cpu: 2
              memory: 2G
            requests:
              cpu: 200m
              memory: 1G
  volumeClaimTemplates:
  - metadata:
      name: volume-be
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "local"
      resources:
        requests:
          storage: 10Gi

啟動腳本:

kubectl create -f be-pvc-local.yaml

此文件中,需要配置 FE 節(jié)點的服務(wù)名、端口等信息,若在 fe-pvc-local.yaml 中修改了相關(guān)信息,需要在be-pvc-local.yaml文件中同步修改。

訪問管理頁面

成功啟動 FE、BE 服務(wù)后,可以登錄 Doris 的管理頁面,地址為:集群節(jié)點任意IP:32130,默認用戶為:root,沒有密碼,直接登錄,可以查看 Doris 的節(jié)點、狀態(tài)等。

自定義鏡像

本次部署使用的 Doris 版本是 1.2.4.1,若需要其它版本,需要自行構(gòu)建鏡像。構(gòu)建完鏡像,根據(jù)部署流程流程操作即可,需要修改fe-pvc-local.yaml、be-pvc-local.yaml,把鏡像換成自定義鏡像。

fe鏡像

1. 準備二進制包

1.1 自行構(gòu)建二進制包,或者在官網(wǎng)下載,根據(jù)服務(wù)器配置,選擇合適的版本即可。

下載地址:https://archive.apache.org/dist/doris/1.2/1.2.4.1-rc01/

1.2 解壓二進制包,并且 bin 目錄下,新增腳本。

check_register_fe.sh

#!/bin/bash
current_ip_register='false'
# 定義方法,循環(huán)10次,每次休眠10秒。成功查詢到結(jié)果退出或者10次后退出
run_sql(){
  j=0
  while [ $j -lt 10 ]
  do
    set +e
    results=$(mysql -uroot -h$FE_IPADDRESS -P$FE_PORT -N -e "SHOW PROC '/frontends';")

    if [ -n "$results" ]
    then
      echo "SQL query frontends executed successfully!"

      # 獲取執(zhí)行結(jié)果
      echo "$results" | while read -a row; do
        # Loop through the fields in each row
        row_ip=''
        row_edit_port=''
        row_alive=''
        row_master=''
    i=0
        for item in ${row[*]}
    do
          # Do something with the field value
          if [ 1 -eq $i ]
          then
             row_ip=${item}
          elif [ 3 -eq $i ]
          then
             row_edit_port=${item}
          elif [ 7 -eq $i ]
          then
             row_role=${item}
          elif [ 8 -eq $i ]
          then
             row_master=${item}
          elif [ 11 -eq $i ]
          then
             row_alive=${item}
          fi
    i=$((i+1))
        done

        # 處理每一條記錄
        # 刪除無法連接的fe節(jié)點
        if [ 'false' = $row_alive ]
        then
           echo "節(jié)點:${row_ip} is not alive,remove it!"
           mysql -h${FE_IPADDRESS} -P${FE_PORT} -uroot -e "ALTER SYSTEM DROP ${row_role} '${row_ip}:${row_edit_port}'"
        fi
        # 判斷數(shù)據(jù)庫中當前節(jié)點是否注冊
        if [[ $FE_IPADDRESS = $row_ip ]] && [[ 'true' = $row_alive ]]
        then
           current_ip_register='true'
           echo "當前節(jié)點:${row_ip} 已經(jīng)成功注冊!"
        fi
      done

      # 若當前節(jié)點沒有注冊,則重新注冊
      if [ 'true' != $current_ip_register ]
      then
         echo "當前節(jié)點:${FE_IPADDRESS} 未注冊,開始注冊fe節(jié)點!"
         mysql -h${FE_IPADDRESS} -P${FE_PORT} -uroot -e "ALTER SYSTEM ADD FOLLOWER '${FE_IPADDRESS}:${FE_EDIT_PORT}'"
         echo "查看fe狀態(tài)!"
     sleep 1
         mysql -h${FE_IPADDRESS} -P${FE_PORT} -uroot -e "SHOW PROC '/frontends'"
      fi

      break
    fi

    j=$((j+1))
    echo "第${j}次循環(huán)結(jié)束!"
    sleep 10
  done

  if [ $j -ge 10 ]
  then
    echo "SQL execution failed after 10 tries"
  fi
}
# 執(zhí)行方法
run_sql

此腳本會在容器創(chuàng)建后去執(zhí)行,由于異步執(zhí)行,和 FE 服務(wù)啟動的操作無法確定先后順序,所以會定義循環(huán)操作,若 FE 服務(wù)未啟動,則等待啟動;若已經(jīng)啟動,會去檢查 frontends 狀態(tài),若存在異常退出的 FE 節(jié)點,則執(zhí)行 DROP 操作,若當前節(jié)點未注冊,則手動注冊。

1.3 修改start_fe.sh腳本

在start_fe.sh腳本中,增加以下內(nèi)容:

if [ -d "${DORIS_HOME}/doris-meta/image/" ];then
    echo "覆寫ROLE信息!"
    cur_timestamp=$((`date '+%s'`*1000+`date '+%N'`/1000000))
    echo "name=${FE_IPADDRESS}_${FE_EDIT_PORT}_${cur_timestamp}" > ${DORIS_HOME}/doris-meta/image/ROLE
    echo "role=FOLLOWER" >> ${DORIS_HOME}/doris-meta/image/ROLE
    echo "查看ROLE信息!"
    cat ${DORIS_HOME}/doris-meta/image/ROLE
    echo "刪除bdb的鎖文件!"
    find ${DORIS_HOME}/doris-meta/bdb -name *.lck | xargs rm -f
    echo "以節(jié)點恢復模式啟動"
    echo "metadata_failure_recovery=true" >> ${DORIS_HOME}/conf/fe.conf
else
    echo "首次啟動,初始化!"
fi

若服務(wù)配置了 pvc 掛載,刪除服務(wù)的時候,pvc 默認不刪除。那么,在重新啟動服務(wù)的時候,會發(fā)生 FE 節(jié)點無法注冊,需要人為修改 FE 節(jié)點的 IP、刪除異常退出節(jié)點的加鎖文件、以節(jié)點恢復的模式啟動等操作。

1.4 以上操作完成后,重新打包

tar -zcvf apache-doris-fe-1.2.4.1-bin-x86_64.tar.gz apache-doris-fe-1.2.4.1-bin-x86_64

2. 構(gòu)建鏡像

fe-Dockerfile

# 選擇基礎(chǔ)鏡像
FROM openjdk:8u342-jdk

# 設(shè)置環(huán)境變量
ENV JAVA_HOME="/usr/local/openjdk-8/" \
    PATH="/opt/apache-doris/fe/bin:$PATH"

ADD apache-doris-fe-1.2.4.1-bin-x86_64.tar.gz /opt

ENV LANG=zh_CN.UTF-8 \
LANGUAGE=zh_CN:zh
ENV DORIS_HOME /opt/apache-doris/fe

RUN apt-get update && \
    apt-get install -y default-mysql-client && \
    apt-get clean && \
    mkdir /opt/apache-doris && \
    mv /opt/apache-doris-fe-1.2.4.1-bin-x86_64 /opt/apache-doris/fe && \
    ls /opt/apache-doris/fe && \
    ls /opt/apache-doris/fe/bin

RUN echo 'priority_networks = ${FE_IPADDRESS}/24' >> /opt/apache-doris/fe/conf/fe.conf

CMD ["tail -f /dev/null"]

執(zhí)行以下命令:

# 構(gòu)建鏡像
docker build -f fe-Dockerfile . -t apache-doris:1.2.4.1-fe

# 打tag
docker tag apache-doris:1.2.4.1-fe zyzcenter/apache-doris:1.2.4.1-fe

# 登錄自己的私服倉庫,并push鏡像,保證集群所有節(jié)點都可以拉取鏡像
docker push zyzcenter/apache-doris:1.2.4.1-fe

be鏡像

1. 準備二進制包

1.1 自行構(gòu)建二進制包,或者在官網(wǎng)下載,根據(jù)服務(wù)器配置,選擇合適的版本即可。

下載地址:https://archive.apache.org/dist/doris/1.2/1.2.4.1-rc01/

若 Doris 的版本為 1.2 以上,需要下載 apache-doris-dependencies-1.2.4.1-bin-x86_64.tar.xz,解壓并把java-udf-jar-with-dependencies.jar包拷貝到 BE 二進制包的 lib 目錄下。

1.2 解壓二進制包,并且 bin 目錄下,新增腳本。

cancel_be.sh

#!/bin/bash

echo "======開始下線be!====="
tmp=`mysql -h${FE_MASTER_IP} -P${FE_MASTER_PORT} -uroot -e "ALTER SYSTEM DECOMMISSION BACKEND '${BE_IPADDRESS}:${BE_PORT}'"`
status_sql="select * from information_schema.backends where IP='${BE_IPADDRESS}' and HeartbeatPort='${BE_PORT}'"
result='alive'
echo "=====檢查be狀態(tài)!====="
while [[ -n $result ]]
do
    result=`mysql -h${FE_MASTER_IP} -P${FE_MASTER_PORT} -uroot -e "${status_sql}"`
    echo "正在轉(zhuǎn)移數(shù)據(jù),請稍后!"
done
echo "下線完成!"

此腳本會在容器退出前執(zhí)行,配置了preStop鉤子,暴力退出 BE 節(jié)點,會導致某些數(shù)據(jù)無法訪問,所以在縮容的時候,優(yōu)雅的退出 BE 節(jié)點。因為容器退出操作,并不會等preStop回調(diào),故可能在容器退出的時候,BE 節(jié)點的數(shù)據(jù)還未轉(zhuǎn)移完,可能需要在be-pvc-local.yaml中增加terminationGracePeriodSeconds時間,或者需要手動處理異常退出的 BE 節(jié)點。這個操作目前的處理方式不夠優(yōu)雅,可以自行修改為更優(yōu)雅的處理方式。

1.3 修改start_be.sh,自動注冊到fe節(jié)點

修改start_be.sh,增加以下內(nèi)容:

echo "======開始注冊 be!====="
mysql -h${FE_MASTER_IP} -P${FE_MASTER_PORT} -uroot -e "ALTER SYSTEM ADD BACKEND '${BE_IPADDRESS}:${BE_PORT}'"
echo "=====檢查 be 狀態(tài)!====="
mysql -h${FE_MASTER_IP} -P${FE_MASTER_PORT} -uroot -e "SHOW PROC '/backends';"

在 BE 節(jié)點的容器啟動腳本中,會自動將自身注冊到 FE 服務(wù)節(jié)點中去,以此來實現(xiàn)擴容的需求。

1.4 以上操作完成后,重新打包

tar -zcvf apache-doris-be-1.2.4.1-bin-x86_64.tar.gz apache-doris-be-1.2.4.1-bin-x86_64

2. 構(gòu)建鏡像

be-Dockerfile

# 選擇基礎(chǔ)鏡像
FROM openjdk:8u342-jdk

# 設(shè)置環(huán)境變量
ENV JAVA_HOME="/usr/local/openjdk-8/" \
    PATH="/opt/apache-doris/be/bin:$PATH"

ADD apache-doris-be-1.2.4.1-bin-x86_64.tar.gz /opt

ENV LANG=zh_CN.UTF-8 \
LANGUAGE=zh_CN:zh
ENV DORIS_HOME /apache-doris/be

RUN apt-get update && \
    apt-get install -y default-mysql-client && \
    apt-get clean && \
    mkdir /opt/apache-doris && \
    mv /opt/apache-doris-be-1.2.4.1-bin-x86_64 /opt/apache-doris/be && \
    ls /opt/apache-doris/be && \
    ls /opt/apache-doris/be/bin

RUN echo 'priority_networks = ${BE_IPADDRESS}/24' >> /opt/apache-doris/be/conf/be.conf

CMD ["tail -f /dev/null"]

執(zhí)行以下腳本:

# 構(gòu)建鏡像
docker build -f be-Dockerfile . -t apache-doris:1.2.4.1-be

# 打tag
docker tag apache-doris:1.2.4.1-be zyzcenter/apache-doris:1.2.4.1-be

# 登錄自己的私服倉庫,并push鏡像,保證集群所有節(jié)點都可以拉取鏡像
docker push zyzcenter/apache-doris:1.2.4.1-be
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容