Mac M1 为 ARM 架构,不能直接使用 StarRocks 官方的镜像,但可以从官方提供的编译产物进行构建
StarRocks 官方从 2.5.4+, 3.0.0+ 开始提供 ARM 编译产物,可以从 starrocks/artifacts-centos7 镜像中获取,本文以 2.5-latest 为例
一、拉取 artifacts-centos7 镜像
docker starrocks/artifacts-centos7:2.5-latest
二、准备部署文件
假设将部署文件解压到 ~/my-db/starrocks
cd ~/my-db
docker run --rm starrocks/artifacts-centos7:2.5-latest \
tar -cf - -C /release . | tar -xvf -
查看部署文件
tree -d -L 3
.
├── be_artifacts
│ └── be
│ ├── bin
│ ├── conf
│ ├── lib
│ └── www
├── broker_artifacts
│ └── apache_hdfs_broker
│ ├── bin
│ ├── conf
│ └── lib
└── fe_artifacts
└── fe
├── bin
├── conf
├── lib
├── spark-dpp
└── webroot
三、编写 Dockerfile
FE Dockerfile
在 ~/my-db/starrocks/docker 创建 fe/Dockerfile
FROM centos:centos7
ARG STARROCKS_ROOT=/opt/starrocks
RUN yum update -y && \
yum install -y java-11-openjdk java-11-openjdk-devel mysql-client \
curl vim tree net-tools less linux-tools-common linux-tools-generic && \
rm -rf /var/lib/apt/lists/*
# Run as root by default.
USER root
RUN JAVA_INSTALL_DIR="/usr/lib/jvm/$(rpm -aq | grep java-11-openjdk-11)" && \
echo "export JAVA_HOME=$JAVA_INSTALL_DIR" >> ~/.bashrc && \
source ~/.bashrc
# Switch to work directory.
WORKDIR $STARROCKS_ROOT
COPY fe_artifacts/fe/ fe/
RUN mkdir fe/meta
CMD ["bash", "-c", "fe/bin/start_fe.sh", "--daemon"]
BE Dockerfile
在 ~/my-db/starrocks/docker 创建 be/run_scripts.sh,用于配置及启动 BE
启用 IP 地址访问时,必须在配置文件中添加配置项 priority_networks,为 BE 节点分配一个专有的 IP 地址
#!/bin/bash
set -euo pipefail
echo "priority_networks = $PRIORITY_NETWORKS" >> /opt/starrocks/be/conf/be.conf
bash -c /opt/starrocks/be/bin/start_be.sh --daemon
在 ~/my-db/starrocks/docker 创建 be/Dockerfile
FROM centos:centos7
ARG STARROCKS_ROOT=/opt/starrocks
RUN yum update -y && \
yum install -y java-11-openjdk java-11-openjdk-devel mysql-client \
curl vim tree net-tools less linux-tools-common linux-tools-generic && \
rm -rf /var/lib/apt/lists/*
# Run as root by default.
USER root
RUN JAVA_INSTALL_DIR="/usr/lib/jvm/$(rpm -aq | grep java-11-openjdk-11)" && \
echo "export JAVA_HOME=$JAVA_INSTALL_DIR" >> ~/.bashrc && \
source ~/.bashrc
# Switch to work directory.
WORKDIR $STARROCKS_ROOT
COPY be_artifacts/be/ be/
COPY docker/be/run_scripts.sh be/bin/run_scripts.sh
RUN mkdir be/storage
四、编译及部署
编译镜像
编译 FE 镜像
docker build . -f docker/fe/Dockerfile -t starrocks-fe-m1:2.5-latest
编译 BE 镜像
docker build . -f docker/be/Dockerfile -t starrocks-be-m1:2.5-latest
部署
编写 Docker Compose 文件
在 ~/my-db/starrocks/docker 创建 docker-compose.yaml
version: "3"
networks:
starrocks-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
services:
starrocks-fe:
image: starrocks-fe-m1:2.5-latest
tty: true
privileged: true
container_name: starrocks-fe
hostname: starrocks-fe
ports:
- "8030:8030"
- "9010:9010"
- "9030:9030"
deploy:
resources:
reservations:
cpus: '1'
memory: 2G
networks:
starrocks-net:
ipv4_address: 172.20.0.2
starrocks-be:
image: starrocks-be-m1:2.5-latest
tty: true
privileged: true
container_name: starrocks-be
hostname: starrocks-be
ports:
- "8040:8040"
- "8060:8060"
- "9050:9050"
- "9060:9060"
environment:
- PRIORITY_NETWORKS=172.20.0.0/24
volumes:
- ~/working/my-db/starrocks-2.5:/opt/starrocks/be/storage
deploy:
resources:
reservations:
cpus: '4'
memory: 8G
networks:
starrocks-net:
ipv4_address: 172.20.0.3
command: bash /opt/starrocks/be/bin/run_scripts.sh
其中,subnet, volumnes 需要根据实际情况修改
至此,完整目录文件如下
tree -L 3
docker
├── be
│ ├── Dockerfile
│ └── run_scripts.sh
├── docker-compose.yaml
└── fe
└── Dockerfile
部署集群
cd docker
docker compuse up -d
执行启动命令后,可以使用 MySQL Client 检查 FE 节点是否启动成功
mysql -h 127.0.0.1 -P9030 -uroot
mysql> show frontends \G;
查看 BE 启动状态
docker exec -it starrocks-be cat /opt/starrocks/be/log/be.INFO | grep heartbeat
# 如果日志打印以下内容,则说明该 BE 节点启动成功
heartbeat has started listening port on 9050
在 FE 中加入 BE
mysql> alter system add backend '172.20.0.3:9050';
mysql> show backends \G;
五、可用性测试
以 TPCH 表为例
create database if not exists tpch;
use tpch;
create physical table if not exists tpch_region (
r_regionkey integer not null,
r_name char(25) not null,
r_comment varchar(152)
) Engine=MergeTree
CLUSTERING by (r_regionkey) DISTRIBUTED BY HASH (r_regionkey) BUCKETS 1;
insert into tpch_region values(1, "name1", "comment1"), (2, "name2", "comment2");
select * from tpch_region;
结果如下
+-------------+--------+-----------+
| r_regionkey | r_name | r_comment |
+-------------+--------+-----------+
| 1 | name1 | comment1 |
| 2 | name2 | comment2 |
+-------------+--------+-----------+