本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Doris镜像构建
entrypoint.sh 脚本文件
#!/bin/bash
set -e
initFe(){
echo "start doris fe"
[ -d "${FE_META}" ] || mkdir -p ${FE_META}
sed -i "s|^[[:space:]]*\$LIMIT \$JAVA \$JAVA_OPTS org.apache.doris.PaloFe.*| exec \$LIMIT \$JAVA \$JAVA_OPTS org.apache.doris.PaloFe \${HELPER} \"\$@\"|g" ${DORIS_DIR}/fe/bin/start_fe.sh
echo "priority_networks = ${FE_NETWORK}" >> ${DORIS_DIR}/fe/conf/fe.conf
exec bash ${DORIS_DIR}/fe/bin/start_fe.sh
}
initBe(){
echo "start doris be"
[ -d "${BE_DATA}" ] || mkdir -p ${BE_DATA}
sed -i "s@^storage_root_path.*@storage_root_path = ${DORIS_DIR}/be/data@g" ${DORIS_DIR}/be/conf/be.conf
echo "priority_networks = ${BE_NETWORK}" >> ${DORIS_DIR}/be/conf/be.conf
sed -i "s|^[[:space:]]*\$LIMIT \${DORIS_HOME}/lib/palo_be.*| exec \$LIMIT \${DORIS_HOME}/lib/palo_be \"\$@\"|g" ${DORIS_DIR}/be/bin/start_be.sh
#ENV FE_HOST, add be to fe
#ENV BE_HOST
COUNT=$(mysql -h${FE_HOST} -P9030 -uroot -e"SHOW PROC '/backends'\G;" | grep ${BE_HOST} | wc -l)
if [ $COUNT -lt 1 ];
then
mysql -h${FE_HOST} -P9030 -uroot -e"ALTER SYSTEM ADD BACKEND \"${BE_HOST}:9050\";"
fi
exec bash ${DORIS_DIR}/be/bin/start_be.sh
}
printUsage() {
echo -e "Usage: [ fe | be ]\n"
printf "%-13s: %s\n" "fe" "Doris master."
printf "%-13s: %s\n" "be" "Doris worker."
}
case "$1" in
(fe)
initFe
;;
(be)
initBe
;;
(help)
printUsage
exit 1
;;
(*)
printUsage
exit 1
;;
esac
Dockerfile
FROM centos:7
MAINTAINER pony
WORKDIR /opt
ADD ./DORIS-0.11.33.1-release.tar.gz ./jdk1.8.tar.gz /opt/
ENV DORIS_DIR /opt/output
ENV FE_LOG ${DORIS_DIR}/fe/log
ENV FE_META ${DORIS_DIR}/fe/palo-meta
ENV FE_TMP ${DORIS_DIR}/fe/temp_dir
ENV BE_LOG ${DORIS_DIR}/be/log
ENV BE_DATA ${DORIS_DIR}/be/data
ENV JAVA_HOME /opt/jdk1.8.0_271
ENV PATH $PATH:$JAVA_HOME/bin
# set the time zone
RUN rm -f /etc/localtime; ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# install mysql client
RUN yum install -y mariadb.x86_64 mariadb-libs.x86_64 && yum clean all
COPY ./startup.sh /opt/startup.sh
VOLUME [ "${FE_LOG}","${FE_META}","${FE_TMP}","${BE_LOG}","${BE_DATA}" ]
EXPOSE 8030 8040
ENTRYPOINT ["/bin/bash","-x","entrypoint.sh"]
#CMD ["be/fe"]
其中DORIS-0.11.33.1-release.tar.gz、jdk1.8.tar.gz 根据实际需要去官网下载相应的版本
构建镜像
docker build -t doris:v1 ./
编排文件
doris-docker-compose.yml
version: '3'
services:
fe:
image: pony/doris:v4
container_name: fe
hostname: fe
restart: always
command: ["fe"]
environment:
FE_NETWORK: 192.17.1.30/24
deploy:
resources:
limits:
cpus: '2.00'
memory: 5G
reservations:
cpus: '0.25'
memory: 100M
volumes:
- /root/doris/fe/log:/opt/output/fe/log:rw
- /root/doris/fe/palo-meta:/opt/output/fe/palo-meta:rw
- /root/doris/fe/temp_dir:/opt/output/fe/temp_dir:rw
ports:
- "8030:8030"
networks:
bdpnet:
ipv4_address: 192.17.1.30
be01:
image: pony/doris:v4
container_name: be01
hostname: be01
restart: always
command: [ "be" ]
depends_on:
- fe
environment:
FE_HOST: fe
BE_HOST: be01
BE_NETWORK: 192.17.1.31/24
deploy:
resources:
limits:
cpus: '2.00'
memory: 5G
reservations:
cpus: '0.25'
memory: 100M
volumes:
- /root/doris/be01/log:/opt/output/be/log:rw
- /root/doris/be01/data:/opt/output/be/data:rw
ports:
- "8041:8040"
networks:
bdpnet:
ipv4_address: 192.17.1.31
be02:
image: pony/doris:v4
container_name: be02
hostname: be02
restart: always
command: [ "be" ]
depends_on:
- fe
environment:
FE_HOST: fe
BE_HOST: be02
BE_NETWORK: 192.17.1.32/24
deploy:
resources:
limits:
cpus: '2.00'
memory: 5G
reservations:
cpus: '0.25'
memory: 100M
volumes:
- /root/doris/be02/log:/opt/output/be/log:rw
- /root/doris/be02/data:/opt/output/be/data:rw
ports:
- "8042:8040"
networks:
bdpnet:
ipv4_address: 192.17.1.32
#docker network create -d bridge --subnet 192.17.1.0/24 --gateway 192.17.1.1 bdpnet
networks:
bdpnet:
external: true
#volumes:
# fe:
# be01:
# be02:
启动doris集群
docker-compose -f doris-docker-compose.yml up -d
关键技术点
优先网络
在Kubernetes多网卡等容器化编排环境中因为有多网卡的存在,通过固定IP的形式部署Doris集群,同一个主机可能存在多个不同的 ip。当前Doris实例并不能自动识别可用 IP。所以当遇到部署主机上有多个IP时,必须通过优先网络(priority_networks)来强制指定正确的 IP(即容器编排是传入的IP地址)。否则doris实例会随机去绑定一个ip,这样以来在当前Doris实例故障恢复时就不能再与当前Doris集群建立连接。
集群实例宕机恢复机制
通过强制指定优先网络和磁盘挂载来实现Doris集群中的实例宕机故障恢复