Doris镜像构建及容器编排

424 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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集群中的实例宕机故障恢复