使用 Docker 开发镜像编译doris源码
安装 Docker 环境
- Docker 要求CentOS 系统的内核版本高于 3.10 ,首先查看系统内核版本是否满足:uname -r
- 确保 yum 包更新到最新:sudo yum update -y
- 安装 yum-util 工具包和devicemapper 驱动依赖:sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置 yum 源(加速yum 下载速度):yum-config-manager --add-repo mirrors.aliyun.com/docker-ce/l…
- 如果连接超时,可以使用 alibaba 的镜像源:yum-config-manager --add-repo mirrors.aliyun.com/docker-ce/l…
- 安装最新稳定版本的方式:sudo yum install docker-ce -y #安装的是最新稳定版本,因为 repo 中默认只开启 stable 仓库
- 启动并加入开机启动 sudo systemctl start docker && docker sudo systemctl enable docker #加入开机自启动
- 查看 Version,验证是否安装成功:docker version
使用 Docker 开发镜像编译
- 下载源码并解压:mwget dist.apache.org/repos/dist/…
- 解压到/opt:tar -zxvf apache-doris-1.0.0-incubating-bin.tar.gz -C /opt
- 下载 Docker 镜像:docker pull apache/doris:build-env-for-1.0.0
- 可以通过以下命令查看镜像是否下载完成:docker images
- 挂载本地目录运行镜像
- 以挂载本地 Doris 源码目录的方式运行镜像,这样编译的产出二进制文件会存储在宿主机中,不会因为镜像退出而消失。同时将镜像中 maven 的 .m2 目录挂载到宿主机目录,以防止每次启动镜像编译时,重复下载 maven 的依赖库。
- docker run -it -v /opt/.m2:/root/.m2 -v /opt/apache-doris-1.0.0-incubating-src/:/root/apache-doris-1.0.0-incubating-src/ apache/incubator-doris:build-env-for-1.0.0
- docker中环境切换到 JDK 8
- alternatives --set java java-1.8.0-openjdk.x86_64
- alternatives --set javac java-1.8.0-openjdk.x86_64
- export JAVA_HOME=/usr/lib/jvm/java-1.8.0
- 准备 Maven 依赖
- 编译过程会下载很多依赖,可以将我们准备好的 doris-repo.tar.gz 解压到 Docker 挂载的对应目录,来避免下载依赖的过程,加速编译:tar -zxvf doris-repo.tar.gz -C /opt/
- 编译Doris:sh build.sh
- 如果是第一次使用 build-env-for-0.15.0 或之后的版本,第一次编译的时候要使用如下命令:sh build.sh --clean --be --fe --ui
- 因为 build-env-for-0.15.0 版本镜像升级了 thrift(0.9 -> 0.13),需要通过--clean 命令强制使用新版本的thrift 生成代码文件,否则会出现不兼容的代码。
- 查看编译结果目录:生成的编译结果目录是/opt/apache-doris-1.0.0-incubating-src/output/
部署
- 在集群各个节点上创建目录并拷贝编译后的文件
- mkdir /opt/apache-doris-1.0.0
- cp -r /opt/apache-doris-1.0.0-incubating-src/output/ /opt/doris*
部署 FE 节点:配置IP 和 meta_dir
- 创建 fe 元数据存储的目录:mkdir /opt/doris/doris-meta
- 改 fe 的唯一的配置文件:vim /opt/doris/fe/conf/fe.conf
- 注意:生产环境强烈建议单独指定目录不要放在 Doris 安装目录下,最好是单独的磁盘(如果有 SSD 最好)。
- 如果机器有多个 ip, 比如内网外网, 虚拟机 docker 等, 需要进行 ip 绑定,才能正确识别。
- JAVA_OPTS 默认 java 最大堆内存为 4GB,建议生产环境调整至 8G 以上。
- 启动 hadoop1 的FE:/opt/doris/fe/bin/start_fe.sh --daemon
- 停止:/opt/doris/fe/bin/stop_fe.sh
配置 BE 节点:配置IP 和 storage_root_path
- 分发 BE:xsync /opt/doris/be
- 创建 BE 数据存放目录(每个节点):mkdir /opt/doris/doris-storage1 && mkdir /opt/doris/doris-storage2
- 修改 BE 的配置文件(每个节点):vim /opt/doris/be/conf/be.conf
- storage_root_path 默认在 be/storage 下,需要手动创建该目录。多个路径之间使用英文状态的分号;分隔(最后一个目录后不要加)。
- 可以通过路径区别存储目录的介质,HDD 或 SSD。可以添加容量限制在每个路径的末尾,通过英文状态逗号,隔开,如:
- storage_root_path=/home/disk1/doris.HDD,50;/home/disk2/doris.SSD, 10;/home/disk2/doris
- /home/disk1/doris.HDD,50,表示存储限制为 50GB,HDD;
- /home/disk2/doris.SSD,10,存储限制为 10GB,SSD;
- /home/disk2/doris,存储限制为磁盘最大容量,默认为 HDD
- 如果机器有多个 IP, 比如内网外网, 虚拟机 docker 等, 需要进行 IP 绑定,才能正确识别。
在 FE 中添加所有 BE 节点:使用 mysql-client 连接到 FE
- BE 节点需要先在FE 中添加,才可加入集群。可以使用 mysql-client 连接到 FE。
- 使用 MySQL Client 连接 FE:mysql -h hadoop1 -P 9030 -uroot
- 添加 BE
- ALTER SYSTEM ADD BACKEND "hadoop1:9050";
- ALTER SYSTEM ADD BACKEND "hadoop2:9050";
- ALTER SYSTEM ADD BACKEND "hadoop3:9050";
- 查看 BE 状态:SHOW PROC '/backends'\G;
- 启动 BE(每个节点):/opt/doris/be/bin/start_be.sh --daemon
- 停止:/opt/doris/be/bin/stop_fe.sh
部署 FS_Broker(可选)
- Broker 以插件的形式,独立于Doris 部署。如果需要从第三方存储系统导入数据,需要部署相应的 Broker,默认提供了读取 HDFS、百度云 BOS 及 Amazon S3 的 fs_broker。 fs_broker 是无状态的,建议每一个 FE 和 BE 节点都部署一个Broker。
- 启动容器:docker run -it -v /opt/.m2:/root/.m2 -v /opt/apache-doris-1.0.0-incubating-src/:/root/apache-doris-1.0.0-incubating-src/ apache/incubator-doris:build-env-for-1.0.0
- docker中环境切换到 JDK 8:echo $JAVA_HOME
- alternatives --set java java-1.8.0-openjdk.x86_64
- alternatives --set javac java-1.8.0-openjdk.x86_64
- export JAVA_HOME=/usr/lib/jvm/java-1.8.0
- 容器中进入源码目录下的 fs_brokers 目录进行编译:sh build.sh
- 拷贝编译结果:源码 fs_broker 的 output 目录下的相应 Broker 目录到需要部署的所有节点上,改名为: apache_hdfs_broker。建议和 BE 或者 FE 目录保持同级。
- 启动 Broker:/opt/doris/apache_hdfs_broker/bin/start_broker.sh --daemon
- 停止:/opt/doris/apache_hdfs_broker/bin/stop_fe.sh
- 添加 Broker:要让 Doris 的 FE 和 BE 知道 Broker 在哪些节点上,通过 sql 命令添加 Broker 节点列表。
- 使用 mysql-client 连接启动的 FE,执行以下命令:ALTER SYSTEM ADD BROKER broker_name "hadoop1:8000","hadoop2:8000","hadoop3:8000";
- 其中 broker_host 为 Broker 所在节点 ip;broker_ipc_port 在 Broker 配置文件中的conf/apache_hdfs_broker.conf。
- 查看 Broker 状态:使用 mysql-client 连接任一已启动的 FE,执行以下命令查看Broker 状态:SHOW PROC "/brokers";
- 注:在生产环境中,所有实例都应使用守护进程启动,以保证进程退出后,会被自动拉起,如 Supervisor(opens new window)。
- 如需使用守护进程启动,在 0.9.0 及之前版本中,需要修改各个 start_xx.sh 脚本,去掉最后的 & 符号。从 0.10.0 版本开始,直接调用 sh start_xx.sh 启动即可。
扩容和缩容
- Doris 可以很方便的扩容和缩容 FE、BE、Broker 实例。
FE 扩容和缩容
- 可以通过将 FE 扩容至 3 个以上节点来实现 FE 的高可用。
- 使用 MySQL 登录客户端后,可以使用 sql 命令查看 FE 状态,目前就一台 FE:mysql -h hadoop1 -P 9030 -uroot -p
- SHOW PROC '/frontends'\G;
- 也可以通过页面访问进行监控,访问 8030,账户为root,密码默认为空不用填写。
- 增加 FE 节点
- FE 分为 Leader,Follower 和 Observer 三种角色。
- 默认一个集群,只能有一个 Leader,可以有多个 Follower 和 Observer。
- 其中 Leader 和 Follower 组成一个 Paxos 选择组,如果 Leader 宕机,则剩下的 Follower 会自动选出新的Leader,保证写入高可用。
- Observer 同步 Leader 的数据,但是不参加选举。
- 如果只部署一个 FE,则 FE 默认就是 Leader。在此基础上,可以添加若干 Follower 和Observer。
- 配置及启动 Follower 和 Observer
- ALTER SYSTEM ADD FOLLOWER "hadoop2:9010";
- ALTER SYSTEM ADD OBSERVER "hadoop3:9010";
- 分发FE,修改 FE 的配置(IP):vim /opt/doris/fe/conf/fe.conf
- 扩容的节点第一次启动时,启动命令需要添加参--helper leader 主机: edit_log_port:
- 在 hadoop2 启动 Follower:/opt/doris/fe/bin/start_fe.sh --helper hadoop1:9010 --daemon
- 在 hadoop3 启动 Observer:/opt/doris/fe/bin/start_fe.sh --helper hadoop2:9010 --daemon
- 启动 hadoop1 的FE:/opt/doris/fe/bin/start_fe.sh --daemon
- 停止:/opt/doris/fe/bin/stop_fe.sh
- mysql-client 中查看运行状态:SHOW PROC '/frontends'\G;

- 删除 FE 节点命令:ALTER SYSTEM DROP FOLLOWER[OBSERVER] "fe_host:edit_log_port";
- 注意:删除 Follower FE 时,确保最终剩余的 Follower(包括 Leader)节点为奇数。
BE 扩容和缩容
- 增加 BE 节点:在 MySQL 客户端,通过 ALTER SYSTEM ADD BACKEND 命令增加BE 节点。
- DROP 方式删除 BE 节点(不推荐):ALTER SYSTEM DROP BACKEND "be_host:be_heartbeat_service_port";
- 注意:DROP BACKEND 会直接删除该BE,并且其上的数据将不能再恢复!!!所以我们强烈不推荐使用 DROP BACKEND 这种方式删除 BE 节点。当你使用这个语句时,会有对应的防误操作提示。
- DECOMMISSION 方式删除 BE 节点(推荐):ALTER SYSTEM DECOMMISSION BACKEND ALTER SYSTEM DROP FOLLOWER[OBSERVER];
- 该命令用于安全删除 BE 节点。命令下发后,Doris 会尝试将该 BE 上的数据向其他 BE 节点迁移,当所有数据都迁移完成后,Doris 会自动删除该节点。
- 该命令是一个异步操作。执行后,可以通过 SHOW PROC '/backends'; 看到该 BE节点的 isDecommission 状态为 true。表示该节点正在进行下线。
- 该命令不一定执行成功。比如剩余BE 存储空间不足以容纳下线BE 上的数据,或者剩余机器数量不满足最小副本数时,该命令都无法完成,并且 BE 会一直处于 isDecommission 为 true 的状态。
- DECOMMISSION 的进度,可以通过SHOW PROC '/backends'; 中的TabletNum 查看,如果正在进行,TabletNum 将不断减少。
- 该操作可以通过如下命令取消:CANCEL DECOMMISSION BACKEND "be_host:be_heartbeat_service_port";
- 取消后,该 BE 上的数据将维持当前剩余的数据量。后续 Doris 重新进行负载均衡。
Broker 扩容缩容
- Broker 实例的数量没有硬性要求。通常每台物理机部署一个即可。Broker 的添加和删除可以通过以下命令完成:
- ALTER SYSTEM ADD BROKER broker_name "broker_host:broker_ipc_port";
- ALTER SYSTEM DROP BROKER broker_name "broker_host:broker_ipc_port";
- ALTER SYSTEM DROP ALL BROKER broker_name;
- Broker 是无状态的进程,可以随意启停。当然,停止后,正在其上运行的作业会失败,重试即可。