我来提供一个自动配置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集群自动化部署脚本,支持批量部署、故障恢复和自动管理,根据实际需求调整配置参数即可。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播