Doris版本:1.1.5
1. 构建FE镜像
创建环境目录如下:
1.下载官方二进制包至docker-build/fe/resource目录下
2.在docker-build/fe/resource目录下创建init_fe.sh脚本,可复制init_fe.sh
3.在docker-build/fe目录下创建Dockerfile文件
# 选择基础镜像
FROM openjdk:8u342-jdk
# 设置环境变量
ENV JAVA_HOME="/usr/local/openjdk-8/" \
PATH="/opt/apache-doris/fe/bin:$PATH"
# 下载软件至镜像内,可根据需要替换
ADD ./resource/apache-doris-fe-1.1.5-bin.tar.gz /opt/
RUN apt-get update && \
apt-get install -y default-mysql-client && \
apt-get clean && \
mkdir /opt/apache-doris && \
cd /opt && \
mv apache-doris-fe-1.1.5-bin /opt/apache-doris/fe
ADD ./resource/init_fe.sh /opt/apache-doris/fe/bin
RUN chmod 755 /opt/apache-doris/fe/bin/init_fe.sh
ENTRYPOINT ["/opt/apache-doris/fe/bin/init_fe.sh"]
4.执行构建
# cd ./docker-build/fe
docker build . -t apache-doris:1.1.5-fe
2. 构建BE镜像
创建环境目录如下:
- 下载官方二进制包至docker-build/be/resource目录下
- 在docker-build/be/resource目录下创建init_be.sh脚本,可复制init_be.sh注意:要将开头的 “#!/bin/env bash” 改为 “#!/bin/bash”
- 在docker-build/be目录下创建Dockerfile文件:
# 选择基础镜像
FROM openjdk:8u342-jdk
# 设置环境变量
ENV JAVA_HOME="/usr/local/openjdk-8/" \
PATH="/opt/apache-doris/be/bin:$PATH"
USER root
# 下载软件至镜像内,可根据需要替换
ADD ./resource/apache-doris-be-1.1.5-bin-x86_64.tar.gz /opt/
RUN apt-get update && \
apt-get install -y default-mysql-client && \
apt-get clean && \
mkdir /opt/apache-doris && \
cd /opt && \
mv apache-doris-be-1.1.5-bin-x86_64 /opt/apache-doris/be
ADD ./resource/init_be.sh /opt/apache-doris/be/bin
RUN chmod 755 /opt/apache-doris/be/bin/init_be.sh
ENTRYPOINT ["/opt/apache-doris/be/bin/init_be.sh"]
4.执行构建
# cd ./docker-build/be
docker build . -t apache-doris:1.1.5-be
以上,fe和be的镜像构建完毕,可以通过docker images命令查看:
3. 部署doris集群
使用一个fe节点和三个be节点
3.1 部署fe节点
IP地址记得改成自己的
docker run -itd --name=fe --env FE_SERVERS="fe1:172.10.70.2:9010" --env FE_ID=1 -p 8030:8030 -p 9030:9030 -v D:\Doris\docker-build\data\fe\doris-meta:/opt/apache-doris/fe/doris-meta -v D:\Doris\docker-build\data\fe\conf:/opt/apache-doris/fe/conf -v D:\Doris\docker-build\data\fe\log:/opt/apache-doris/fe/log --network=doris-network --ip=172.10.70.2 apache-doris:1.1.5-fe
注意将其中-v后的挂载目录换成你自己的在浏览器中验证
3.2 部署be节点
IP地址记得改成自己的,be1,be2,be3的地址为IP+1 +2 +3
docker run --privileged -itd --name=be1 --env FE_SERVERS="fe1:172.10.70.2:9010" --env BE_ADDR="172.10.70.3:9050" -p 8040:8040 -v D:\Doris\docker-build\data\be1\storage:/opt/apache-doris/be/storage -v D:\Doris\docker-build\data\be1\conf:/opt/apache-doris/be/conf -v D:\Doris\docker-build\data\be1\log:/opt/apache-doris/be/log --network=doris-network --ip=172.10.70.3 apache-doris:1.1.5-be
docker run --privileged -itd --name=be2 --env FE_SERVERS="fe1:172.10.70.2:9010" --env BE_ADDR="172.10.70.4:9050" -p 8041:8040 -v D:\Doris\docker-build\data\be2\storage:/opt/apache-doris/be/storage -v D:\Doris\docker-build\data\be2\conf:/opt/apache-doris/be/conf -v D:\Doris\docker-build\data\be2\log:/opt/apache-doris/be/log --network=doris-network --ip=172.10.70.4 apache-doris:1.1.5-be
docker run --privileged -itd --name=be3 --env FE_SERVERS="fe1:172.10.70.2:9010" --env BE_ADDR="172.10.70.5:9050" -p 8042:8040 -v D:\Doris\docker-build\data\be3\storage:/opt/apache-doris/be/storage -v D:\Doris\docker-build\data\be3\conf:/opt/apache-doris/be/conf -v D:\Doris\docker-build\data\be3\log:/opt/apache-doris/be/log --network=doris-network --ip=172.10.70.5 apache-doris:1.1.5-be
同样需要将挂载目录换成你自己的。
接下来分别进入每个be容器并启动
cd /opt/apache-doris/be/bin
start_be.sh --daemon
3.3 在fe中添加be节点
进入fe容器
登录mysql
mysql -h 127.0.0.1 -P9030 -uroot
-- 默认root无密码,通过以下命令修改root密码。
SET PASSWORD FOR 'root' = PASSWORD('root');
添加be节点
ALTER SYSTEM ADD BACKEND "172.10.70.3:9050";
ALTER SYSTEM ADD BACKEND "172.10.70.4:9050";
ALTER SYSTEM ADD BACKEND "172.10.70.5:9050";
在浏览器的ui中验证
可以看到三个be节点均已被添加,且Alive为true。
也可以通过命令行查看节点状态(mysql客户端)
-- 查看be
SHOW PROC '/backends' \G;
-- 查看fe
SHOW PROC '/frontends' \G;
参考资料
Windows系统下通过docker部署doris集群构建 Docker Image - Apache Doris
常见报错
1.启动fe容器时报错:exec /opt/apache-doris/fe/bin/init_fe.sh: no such file or directory 文本编码或者文件格式错误(一般都是自己创建文件的原因),直接从官网复制一份覆盖就好
在 Windows 中,每行结尾都是由两个字符组成的:回车符(CR)和换行符(LF),简写为 CRLF。而在 Linux 中,每行结尾只有一个字符,即换行符(LF)。
2.启动be容器时报错:exec /opt/apache-doris/be/bin/init_be.sh: no such file or directory 直接从官网复制来的init_be.sh的第一行“#!/bin/env bash”需要改成“#!/bin/bash”
3.修改上面那个问题后又报错:sysctl: permission denied on key “vm.max_map_count” 因为在init_be.sh中有一行 sysctl -w vm.max_map_count=2000000, 需要管理员权限,而docker创建容器时默认是没有管理员权限的,因此在docker run时要加上 --privileged
3.1在容器中执行以下命令以查看当前的 vm.max_map_count 值:
sysctl vm.max_map_count 如果返回的值小于 2000000,请执行以下命令以设置新的值: sysctl -w vm.max_map_count=2000000 这将临时设置 vm.max_map_count 的值为 2000000。
然后,你可以继续执行 /opt/apache-doris/be/bin/start_be.sh --daemon 命令来启动后端进程。
3.2如果不想进入容器里修改这个值,也可以通过windows里的cmd修改
wsl --list wsl -d docker-desktop # 设置vm.max_map_count为200万 sysctl -w vm.max_map_count=2000000 # 查看vm.max_map_count sysctl vm.max_map_count
以上修改只在当前会话有效,重启 Windows 和 WSL 都要重新设置
永久设置可以参考这条链接的方案三:
4.Windows Docker 镜像启动异常Error response from daemon: Ports are not available: listen tcp 0.0.0.0:9030 出现类似报错参考:
5.Windows Docker 镜像启动报错docker: Error response from daemon: network 172.10.70.2 not found. 根据错误提示,Docker 容器无法找到名称为 172.10.70.2 的网络。可能是因为该网络不存在或者你没有加入该网络。 请先使用以下命令创建名为 “doris-network” 的 Docker 网络:
docker network create --subnet=172.10.70.0/24 doris-network
6.重启容器后,be节点连通fe需要一段时间,需要等待五分钟左右,五分钟后可以查看一下be进程
# 进入be容器查看be进程
ps aux | grep be
-- 进入fe容器通过mysql客户端查看be
SHOW PROC '/backends' \G;
doris最低配置部署:1FE 1BE
创建表出现Failed to find 3 backends for policy解决方案
ERROR 1105 (HY000): errCode = 2, detailMessage = Failed to find 3 backends for policy: cluster|query|load|schedule|tags|medium: default_cluster|false|false|true|[{“location” : “default”}]|HDD
BE节点少于3个的且未指定副本数时 会报以上错误。
方案一:增加BE节点数
方案二:创建表里设置副本数参数
参见官方文档:
properties
设置表属性。目前支持以下属性:
- replication_num副本数。默认副本数为3。如果 BE 节点数量小于3,则需指定副本数小于等于 BE 节点数量。在 0.15 版本后,该属性将自动转换成 replication_allocation 属性,如:"replication_num" = "3" 会自动转换成 "replication_allocation" = "tag.location.default:3"
示例如下:
CREATE TABLE example_db.table_hash
(
k1 TINYINT,
k2 DECIMAL(10, 2) DEFAULT "10.5",
k3 CHAR(10) COMMENT "string column",
k4 INT NOT NULL DEFAULT "1" COMMENT "int column"
)
COMMENT "my first table"
DISTRIBUTED BY HASH(k1) BUCKETS 2
-- 设置副本数为1
PROPERTIES (
"replication_num" = "1"
);