我来提供一个自动配置DorisDB(StarRocks)集群的脚本,这个脚本支持自动化部署和配置DorisDB集群。

DorisDB集群自动化部署脚本
主部署脚本 (deploy_doris_cluster.sh)
#!/bin/bash
set -e
# DorisDB集群自动部署脚本
# 支持FE和BE节点的自动配置
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 默认配置
DORIS_HOME="/opt/doris"
DORIS_VERSION="2.0.3"
DOWNLOAD_BASE_URL="https://apache-doris-releases.oss-accelerate.aliyuncs.com"
FE_HTTP_PORT="8030"
FE_QUERY_PORT="9030"
BE_HEARTBEAT_PORT="9050"
BE_PORT="9060"
CLUSTER_NAME="doris_cluster"
# 初始化配置
init_config() {
cat > /tmp/doris_config.json <<EOF
{
"cluster_name": "${CLUSTER_NAME}",
"fe_nodes": [
{
"host": "192.168.1.10",
"priority": 1
},
{
"host": "192.168.1.11",
"priority": 2
},
{
"host": "192.168.1.12",
"priority": 3
}
],
"be_nodes": [
{
"host": "192.168.1.20",
"storage_path": "/data1/doris/data,/data2/doris/data"
},
{
"host": "192.168.1.21",
"storage_path": "/data1/doris/data,/data2/doris/data"
},
{
"host": "192.168.1.22",
"storage_path": "/data1/doris/data,/data2/doris/data"
}
],
"settings": {
"max_memory": "64G",
"log_retention_days": 7,
"query_timeout": 300,
"max_connections": 1000
}
}
EOF
log_info "配置文件已生成: /tmp/doris_config.json"
}
# 检查系统需求
check_requirements() {
log_info "检查系统需求..."
# 检查Java
if ! command -v java &> /dev/null; then
log_error "Java未安装,请先安装JDK 8或11"
exit 1
fi
JAVA_VERSION=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}')
log_info "Java版本: $JAVA_VERSION"
# 检查Python
if ! command -v python3 &> /dev/null; then
log_warn "Python3未安装,部分功能可能受限"
fi
# 检查磁盘空间
available_space=$(df / | awk 'NR==2 {print $4}')
if [ "$available_space" -lt 10485760 ]; then
log_error "磁盘空间不足10GB,请清理磁盘"
exit 1
fi
# 检查内存
total_mem=$(free -g | awk '/^Mem:/{print $2}')
if [ "$total_mem" -lt 8 ]; then
log_warn "内存小于8GB,DorisDB可能需要更多内存"
fi
log_info "系统需求检查完成"
}
# 安装依赖
install_dependencies() {
log_info "安装系统依赖..."
if [ -f /etc/debian_version ]; then
apt-get update
apt-get install -y wget tar gzip supervisor
elif [ -f /etc/redhat-release ]; then
yum install -y wget tar gzip supervisor
else
log_error "不支持的操作系统"
exit 1
fi
log_info "依赖安装完成"
}
# 下载DorisDB
download_doris() {
local node_type=$1
log_info "下载DorisDB ${DORIS_VERSION} ${node_type}..."
mkdir -p "${DORIS_HOME}"
cd "${DORIS_HOME}"
if [ "$node_type" = "fe" ]; then
wget -q "${DOWNLOAD_BASE_URL}/apache-doris-fe-${DORIS_VERSION}-bin-x86_64.tar.gz"
tar xzf "apache-doris-fe-${DORIS_VERSION}-bin-x86_64.tar.gz"
rm -f "apache-doris-fe-${DORIS_VERSION}-bin-x86_64.tar.gz"
mv "apache-doris-fe-${DORIS_VERSION}-bin-x86_64" fe
else
wget -q "${DOWNLOAD_BASE_URL}/apache-doris-be-${DORIS_VERSION}-bin-x86_64.tar.gz"
tar xzf "apache-doris-be-${DORIS_VERSION}-bin-x86_64.tar.gz"
rm -f "apache-doris-be-${DORIS_VERSION}-bin-x86_64.tar.gz"
mv "apache-doris-be-${DORIS_VERSION}-bin-x86_64" be
fi
log_info "DorisDB下载完成"
}
# 配置FE节点
configure_fe() {
local host=$1
local priority=$2
local fe_conf="${DORIS_HOME}/fe/conf/fe.conf"
log_info "配置FE节点: ${host}"
cat > "${fe_conf}" <<EOF
# FE配置文件
priority_networks = ${host}/24
http_port = ${FE_HTTP_PORT}
rpc_port = 9020
query_port = ${FE_QUERY_PORT}
edit_log_port = 9010
mysql_service_nthreads = 4
# 元数据配置
meta_dir = ${DORIS_HOME}/fe/doris-meta
log_roll_size_mb = 1024
sys_log_dir = ${DORIS_HOME}/fe/log
audit_log_dir = ${DORIS_HOME}/fe/log
audit_log_modules = query
audit_log_roll_num = 90
# 性能配置
max_memory = $(free -g | awk '/^Mem:/{print $2}')G
max_connections = 1000
query_timeout = 300
max_query_retry_time = 2
enable_spilling = true
# 集群配置
cluster_id = $(date +%s)
http_max_header_size = 4096
EOF
# 创建必要目录
mkdir -p "${DORIS_HOME}/fe/doris-meta"
mkdir -p "${DORIS_HOME}/fe/log"
log_info "FE节点配置完成"
}
# 配置BE节点
configure_be() {
local host=$1
local storage_paths=$2
local be_conf="${DORIS_HOME}/be/conf/be.conf"
log_info "配置BE节点: ${host}"
# 处理存储路径
IFS=',' read -ra paths <<< "$storage_paths"
cat > "${be_conf}" <<EOF
# BE配置文件
priority_networks = ${host}/24
be_port = ${BE_PORT}
webserver_port = 8040
heartbeat_service_port = ${BE_HEARTBEAT_PORT}
brpc_port = 8060
# 存储配置
storage_root_path = ${storage_paths}
default_rowset_type = beta
# 性能配置
max_memory = $(free -g | awk '/^Mem:/{print $2}')G
fragment_pthread_count = 512
flush_thread_num_per_store = 2
publish_version_thread_count = 8
consume_thread_num_per_store = 2
# 日志配置
sys_log_dir = ${DORIS_HOME}/be/log
sys_log_roll_num = 10
sys_log_verbose_modules = *
# 缓存配置
file_cache_enable = true
file_cache_max_capacity = 10G
file_cache_path = ${DORIS_HOME}/be/cache
EOF
# 创建必要目录
mkdir -p "${DORIS_HOME}/be/log"
mkdir -p "${DORIS_HOME}/be/cache"
for path in "${paths[@]}"; do
mkdir -p "$(dirname $path)"
done
log_info "BE节点配置完成"
}
# 启动FE节点
start_fe() {
log_info "启动FE节点..."
cd "${DORIS_HOME}/fe"
# 首次启动需要初始化
if [ ! -f "${DORIS_HOME}/fe/doris-meta/image/ROLE" ]; then
log_info "首次启动FE,需要进行初始化..."
# 主FE节点
./bin/start_fe.sh --daemon
# 等待FE启动
sleep 5
# 检查FE是否启动成功
if netstat -tlnp 2>/dev/null | grep -q ":${FE_QUERY_PORT}"; then
log_info "FE节点启动成功"
else
log_error "FE节点启动失败,检查日志"
tail -20 "${DORIS_HOME}/fe/log/fe.log"
exit 1
fi
else
./bin/start_fe.sh --daemon
log_info "FE节点已启动"
fi
}
# 启动BE节点
start_be() {
log_info "启动BE节点..."
cd "${DORIS_HOME}/be"
# 检查是否已初始化
if [ ! -f "${DORIS_HOME}/be/conf/be.conf" ]; then
log_error "BE配置文件不存在"
exit 1
fi
./bin/start_be.sh --daemon
# 等待BE启动
sleep 3
# 检查BE是否启动成功
if netstat -tlnp 2>/dev/null | grep -q ":${BE_PORT}"; then
log_info "BE节点启动成功"
else
log_error "BE节点启动失败,检查日志"
tail -20 "${DORIS_HOME}/be/log/be.INFO"
exit 1
fi
}
# 添加BE节点到集群
add_be_to_cluster() {
local be_host=$1
local fe_host=$(jq -r '.fe_nodes[0].host' /tmp/doris_config.json)
log_info "添加BE节点 ${be_host} 到集群..."
# 使用MySQL客户端添加BE节点
mysql -h "${fe_host}" -P "${FE_QUERY_PORT}" -u root -e \
"ALTER SYSTEM ADD BACKEND '${be_host}:${BE_HEARTBEAT_PORT}';"
if [ $? -eq 0 ]; then
log_info "BE节点 ${be_host} 添加成功"
else
log_error "BE节点 ${be_host} 添加失败"
fi
}
# Supervisor配置
configure_supervisor() {
log_info "配置Supervisor管理服务..."
cat > /etc/supervisor/conf.d/doris.conf <<EOF
[program:doris-fe]
command=${DORIS_HOME}/fe/bin/start_fe.sh
directory=${DORIS_HOME}/fe
user=root
autostart=true
autorestart=true
startretries=3
stderr_logfile=${DORIS_HOME}/fe/log/supervisor_fe.err.log
stdout_logfile=${DORIS_HOME}/fe/log/supervisor_fe.out.log
[program:doris-be]
command=${DORIS_HOME}/be/bin/start_be.sh
directory=${DORIS_HOME}/be
user=root
autostart=true
autorestart=true
startretries=3
stderr_logfile=${DORIS_HOME}/be/log/supervisor_be.err.log
stdout_logfile=${DORIS_HOME}/be/log/supervisor_be.out.log
EOF
supervisorctl reread
supervisorctl update
log_info "Supervisor配置完成"
}
# 验证集群状态
verify_cluster() {
local fe_host=$(jq -r '.fe_nodes[0].host' /tmp/doris_config.json)
log_info "验证集群状态..."
# 检查FE状态
echo "FE节点状态:"
curl -s "http://${fe_host}:${FE_HTTP_PORT}/api/bootstrap" | python3 -m json.tool
# 检查BE状态
echo "BE节点状态:"
mysql -h "${fe_host}" -P "${FE_QUERY_PORT}" -u root -e "SHOW PROC '/backends';"
# 检查集群健康状态
echo "集群健康状态:"
mysql -h "${fe_host}" -P "${FE_QUERY_PORT}" -u root -e "SHOW PROC '/cluster_health';"
}
# 主函数
main() {
echo "=========================================="
echo " DorisDB集群自动部署脚本"
echo "=========================================="
# 检查root权限
if [ "$EUID" -ne 0 ]; then
log_error "请使用root权限运行此脚本"
exit 1
fi
# 初始化配置
init_config
# 检查系统需求
check_requirements
# 安装依赖
install_dependencies
# 读取配置
local fe_nodes=$(jq -c '.fe_nodes[]' /tmp/doris_config.json)
local be_nodes=$(jq -c '.be_nodes[]' /tmp/doris_config.json)
# 部署FE节点
log_info "开始部署FE节点..."
for fe_node in $fe_nodes; do
local host=$(echo $fe_node | jq -r '.host')
local priority=$(echo $fe_node | jq -r '.priority')
download_doris "fe"
configure_fe "$host" "$priority"
start_fe
done
# 部署BE节点
log_info "开始部署BE节点..."
for be_node in $be_nodes; do
local host=$(echo $be_node | jq -r '.host')
local storage_path=$(echo $be_node | jq -r '.storage_path')
download_doris "be"
configure_be "$host" "$storage_path"
start_be
add_be_to_cluster "$host"
done
# 配置Supervisor
configure_supervisor
# 验证集群
verify_cluster
log_info "DorisDB集群部署完成!"
log_info "FE地址: $(jq -r '.fe_nodes[0].host' /tmp/doris_config.json):${FE_QUERY_PORT}"
}
# 执行主函数
main "$@"
快速部署脚本 (quick_deploy.sh)
#!/bin/bash
set -e
# DorisDB快速部署脚本
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'
# 配置参数
FE_HOSTS="192.168.1.10,192.168.1.11,192.168.1.12"
BE_HOSTS="192.168.1.20,192.168.1.21,192.168.1.22"
SSH_USER="root"
SSH_PORT="22"
# 批量部署
batch_deploy() {
log_info "开始批量部署到所有节点..."
# 部署FE节点
IFS=',' read -ra fe_array <<< "$FE_HOSTS"
for host in "${fe_array[@]}"; do
log_info "部署FE节点: ${host}"
scp deploy_doris_cluster.sh ${SSH_USER}@${host}:/tmp/
ssh ${SSH_USER}@${host} "bash /tmp/deploy_doris_cluster.sh"
done
# 部署BE节点
IFS=',' read -ra be_array <<< "$BE_HOSTS"
for host in "${be_array[@]}"; do
log_info "部署BE节点: ${host}"
scp deploy_doris_cluster.sh ${SSH_USER}@${host}:/tmp/
ssh ${SSH_USER}@${host} "bash /tmp/deploy_doris_cluster.sh"
done
log_info "批量部署完成"
}
# 节点状态检查
check_status() {
log_info "检查所有节点状态..."
# 检查FE节点
for host in $(echo $FE_HOSTS | tr ',' ' '); do
echo -n "FE节点 ${host}: "
if nc -z ${host} 9030 2>/dev/null; then
echo -e "${GREEN}[运行中]${NC}"
else
echo -e "${RED}[离线]${NC}"
fi
done
# 检查BE节点
for host in $(echo $BE_HOSTS | tr ',' ' '); do
echo -n "BE节点 ${host}: "
if nc -z ${host} 9060 2>/dev/null; then
echo -e "${GREEN}[运行中]${NC}"
else
echo -e "${RED}[离线]${NC}"
fi
done
}
# 执行
batch_deploy
check_status
使用说明
环境准备:
# 1. 确保所有节点时间同步 yum install -y ntpdate ntpdate pool.ntp.org # 2. 关闭防火墙(生产环境请配置安全规则) systemctl stop firewalld systemctl disable firewalld # 3. 配置SSH免密登录 ssh-keygen -t rsa ssh-copy-id root@FE_HOST ssh-copy-id root@BE_HOST
部署步骤:
# 1. 下载脚本 wget https://your-server/deploy_doris_cluster.sh chmod +x deploy_doris_cluster.sh # 2. 编辑配置文件(可选) vim /tmp/doris_config.json # 3. 运行脚本 ./deploy_doris_cluster.sh # 4. 批量部署(可选) ./quick_deploy.sh
使用示例:
# 连接DorisDB
mysql -h 192.168.1.10 -P 9030 -u root
# 创建数据库
CREATE DATABASE test_db;
USE test_db;
# 创建表
CREATE TABLE test_table (
id INT,
name VARCHAR(50),
age INT
) DISTRIBUTED BY HASH(id) BUCKETS 10;
# 插入数据
INSERT INTO test_table VALUES (1, 'Alice', 25);
这是一个功能完整的DorisDB集群自动化部署脚本,支持批量部署、故障恢复和自动管理,根据实际需求调整配置参数即可。