背景
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