本文目录导读:

我来提供一个自动配置TDengine集群的脚本,这个脚本支持3节点或5节点集群的自动化部署。
TDengine集群自动配置脚本
主配置脚本 deploy_tdengine_cluster.sh
#!/bin/bash
# TDengine集群自动部署脚本
# 支持: 3节点或5节点集群
# 系统: CentOS 7/8, Ubuntu 18.04/20.04
set -e
# ============ 配置参数(请根据实际情况修改)============
CLUSTER_TYPE="${1:-3}" # 3 或 5 节点集群
VERSION="3.0.3.0" # TDengine版本
# 节点信息配置(请修改为实际IP)
if [ "$CLUSTER_TYPE" = "3" ]; then
declare -A NODES
NODES=(
["node1"]="192.168.1.10"
["node2"]="192.168.1.11"
["node3"]="192.168.1.12"
)
# 第一个节点作为主节点
MASTER_NODE="node1"
else
declare -A NODES
NODES=(
["node1"]="192.168.1.10"
["node2"]="192.168.1.11"
["node3"]="192.168.1.12"
["node4"]="192.168.1.13"
["node5"]="192.168.1.14"
)
MASTER_NODE="node1"
fi
# 集群配置
FIRST_EP="${NODES[$MASTER_NODE]}:6030"
SECOND_EP="${NODES[$MASTER_NODE]}:6030"
# SSH配置
SSH_USER="root"
SSH_PORT="22"
SSH_KEY="$HOME/.ssh/id_rsa"
# 数据目录
DATA_DIR="/var/lib/taos"
LOG_DIR="/var/log/taos"
# ============ 颜色定义 ============
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# ============ 函数定义 ============
print_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
check_prerequisites() {
print_info "检查前置条件..."
# 检查是否为root用户
if [ "$EUID" -ne 0 ]; then
print_error "请使用root用户执行此脚本"
exit 1
fi
# 检查SSH密钥
if [ ! -f "$SSH_KEY" ]; then
print_warn "SSH密钥不存在,生成新的密钥..."
ssh-keygen -t rsa -N "" -f "$SSH_KEY"
fi
# 检查必要命令
for cmd in ssh scp systemctl wget tar; do
if ! command -v $cmd &> /dev/null; then
print_error "缺少必要命令: $cmd"
exit 1
fi
done
print_info "前置条件检查完成"
}
install_dependencies() {
print_info "安装依赖包..."
if [ -f /etc/redhat-release ]; then
# CentOS/RHEL
yum install -y epel-release
yum install -y wget tar net-tools ntpdate
elif [ -f /etc/lsb-release ]; then
# Ubuntu
apt-get update
apt-get install -y wget tar net-tools ntpdate
fi
# 同步时间
ntpdate -u pool.ntp.org || true
print_info "依赖安装完成"
}
configure_system() {
local node_ip=$1
print_info "配置系统参数 - $node_ip"
# 配置系统参数
cat >> /etc/sysctl.conf << EOF
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.somaxconn = 32768
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_keepalive_time = 600
EOF
sysctl -p
# 配置文件描述符限制
cat > /etc/security/limits.d/99-tdengine.conf << EOF
* soft nofile 655350
* hard nofile 655350
* soft nproc 655350
* hard nproc 655350
EOF
# 关闭防火墙和SELinux
systemctl stop firewalld 2>/dev/null || true
systemctl disable firewalld 2>/dev/null || true
setenforce 0 2>/dev/null || true
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 2>/dev/null || true
print_info "系统配置完成 - $node_ip"
}
install_tdengine() {
local node_name=$1
local node_ip=${NODES[$node_name]}
print_info "开始安装TDengine - $node_name ($node_ip)"
# 创建目录
mkdir -p $DATA_DIR $LOG_DIR /etc/taos
# 下载TDengine(如果本地没有)
local package_name="TDengine-server-${VERSION}-Linux-x64.tar.gz"
if [ ! -f "/tmp/$package_name" ]; then
wget -P /tmp "https://github.com/taosdata/TDengine/archive/refs/tags/ver-${VERSION}.tar.gz"
# 如果下载失败,使用包管理器安装
if [ $? -ne 0 ]; then
print_warn "下载失败,尝试使用包管理器安装..."
if [ -f /etc/redhat-release ]; then
rpm -ivh https://github.com/taosdata/TDengine/releases/download/ver-${VERSION}/TDengine-server-${VERSION}-Linux-x64.rpm
else
dpkg -i https://github.com/taosdata/TDengine/releases/download/ver-${VERSION}/TDengine-server-${VERSION}-Linux-x64.deb
fi
fi
fi
# 如果存在tar包,解压安装
if [ -f "/tmp/$package_name" ]; then
cd /tmp
tar xzf "$package_name"
cd TDengine-server-${VERSION}
./install.sh
fi
print_info "TDengine安装完成 - $node_name"
}
configure_tdengine() {
local node_name=$1
local node_ip=${NODES[$node_name]}
print_info "配置TDengine - $node_name ($node_ip)"
# 生成配置文件
cat > /etc/taos/taos.cfg << EOF
# TDengine 集群配置文件
# 基本信息
firstEp ${FIRST_EP}
secondEp ${SECOND_EP}
fqdn ${node_ip}
serverPort 6030
supportVnodes 1024
# 数据持久化
dataDir ${DATA_DIR}
tempDir /tmp/taos
logDir ${LOG_DIR}
logLevel 3
numOfLogs 20
asyncLog 0
debugFlag 131
# 集群配置
arbitrator ${FIRST_EP}
statusInterval 1
maxConnections 50000
maxShellConns 50000
maxTmrCtrl 1000
minSlidingTime 10
maxRowSize 65535
maxWildCards 100
# 客户端配置
defaultDB test
defaultMode 0
compressMsg 1
# 性能优化
numOfThreadsPerCore 1.0
ratioOfQueryThreads 10.0
rpcTimer 300
rpcMaxTime 600
rpcForceTcp 1
rpcDetectPacketSize 1
monitorInterval 30
# 查询配置
keepColumnName 0
timezone Asia/Shanghai
locale en_US.UTF-8
charset UTF-8
# 流计算
smlChildTableName child
smParentTableName parent
EOF
# 根据节点类型设置不同配置
if [ "$node_name" = "$MASTER_NODE" ]; then
# 主节点配置
sed -i 's/logLevel.*/logLevel 3/' /etc/taos/taos.cfg
print_info "配置为主节点"
else
# 从节点配置
print_info "配置为从节点"
fi
print_info "TDengine配置完成 - $node_name"
}
start_tdengine() {
local node_name=$1
print_info "启动TDengine服务 - $node_name"
# 停止已有服务
systemctl stop taosd 2>/dev/null || true
# 启动服务
systemctl start taosd
systemctl enable taosd
# 等待服务启动
sleep 5
# 检查服务状态
if systemctl is-active --quiet taosd; then
print_info "TDengine服务启动成功 - $node_name"
# 设置开机自启
systemctl enable taosd
else
print_error "TDengine服务启动失败 - $node_name"
journalctl -u taosd --no-pager -n 50
exit 1
fi
}
setup_cluster() {
print_info "配置集群..."
local master_ip=${NODES[$MASTER_NODE]}
# 在主节点上执行
if [ "$(hostname -I | awk '{print $1}')" = "$master_ip" ]; then
# 添加其他节点
for node_name in "${!NODES[@]}"; do
if [ "$node_name" != "$MASTER_NODE" ]; then
local node_ip=${NODES[$node_name]}
print_info "添加节点: $node_name ($node_ip)"
# 使用taos CLI添加dnode
taos -s "CREATE DNODE \"${node_ip}:6030\";"
sleep 2
fi
done
# 创建mnode
taos -s "CREATE MNODE ON DNODE 0;"
# 创建数据库
taos -s "CREATE DATABASE test;"
taos -s "CREATE DATABASE log;"
# 显示集群状态
print_info "集群状态:"
taos -s "SHOW DNODES;"
taos -s "SHOW MNODES;"
fi
print_info "集群配置完成"
}
verify_cluster() {
print_info "验证集群..."
local master_ip=${NODES[$MASTER_NODE]}
if [ "$(hostname -I | awk '{print $1}')" = "$master_ip" ]; then
# 检查集群状态
local dnode_count=$(taos -s "SHOW DNODES;" | grep -c "ready" || true)
local mnode_count=$(taos -s "SHOW MNODES;" | grep -c "ready" || true)
print_info "DNodes数量: $dnode_count"
print_info "MNodes数量: $mnode_count"
# 测试数据写入
taos -s "INSERT INTO test.meters VALUES (NOW, 10.5, 220, 0.8);"
# 测试数据查询
local result=$(taos -s "SELECT * FROM test.meters;" 2>&1)
print_info "查询结果: $result"
if [ $dnode_count -ge $CLUSTER_TYPE ]; then
print_info "集群验证成功!"
return 0
else
print_warn "部分节点未就绪,请检查日志"
return 1
fi
fi
}
# ============ 主执行流程 ============
main() {
print_info "开始部署TDengine $CLUSTER_TYPE 节点集群"
print_info "主节点: $MASTER_NODE (${NODES[$MASTER_NODE]})"
# 验证配置
if [ "$CLUSTER_TYPE" != "3" ] && [ "$CLUSTER_TYPE" != "5" ]; then
print_error "不支持的集群类型,请使用 3 或 5"
exit 1
fi
# 检查前置条件
check_prerequisites
# 获取本机IP
local local_ip=$(hostname -I | awk '{print $1}')
local is_master=false
for node_name in "${!NODES[@]}"; do
if [ "${NODES[$node_name]}" = "$local_ip" ]; then
if [ "$node_name" = "$MASTER_NODE" ]; then
is_master=true
fi
break
fi
done
# 本机安装
install_dependencies
configure_system "$local_ip"
install_tdengine "$MASTER_NODE"
configure_tdengine "$MASTER_NODE"
start_tdengine "$MASTER_NODE"
# 如果是主节点,执行远程部署
if $is_master; then
# 分发SSH密钥
print_info "分发SSH密钥到其他节点..."
for node_name in "${!NODES[@]}"; do
if [ "$node_name" != "$MASTER_NODE" ]; then
local node_ip=${NODES[$node_name]}
ssh-copy-id -i "$SSH_KEY.pub" -p $SSH_PORT -o StrictHostKeyChecking=no "$SSH_USER@$node_ip"
fi
done
# 远程部署其他节点
for node_name in "${!NODES[@]}"; do
if [ "$node_name" != "$MASTER_NODE" ]; then
local node_ip=${NODES[$node_name]}
print_info "远程部署节点: $node_name ($node_ip)"
# 复制安装脚本
scp -P $SSH_PORT "$0" "$SSH_USER@$node_ip:/tmp/deploy.sh"
# 远程执行
ssh -p $SSH_PORT "$SSH_USER@$node_ip" "bash /tmp/deploy.sh $CLUSTER_TYPE"
print_info "节点部署完成: $node_name"
fi
done
# 配置集群
setup_cluster
# 验证集群
verify_cluster
print_info "TDengine集群部署完成!"
print_info "主节点: ${NODES[$MASTER_NODE]}:6030"
print_info "连接命令: taos -h ${NODES[$MASTER_NODE]}"
fi
}
# 执行主函数
main "$@"
使用说明
#!/bin/bash # TDengine集群部署使用说明 echo "=== TDengine集群部署指南 ===" echo "" echo "1. 准备工作:" echo " - 确保所有节点网络互通" echo " - 确保所有节点已安装SSH服务" echo " - 确保有root权限" echo "" echo "2. 编辑脚本,修改配置参数:" echo " - CLUSTER_TYPE: 3或5节点集群" echo " - VERSION: TDengine版本号" echo " - NODES数组: 填写实际IP地址" echo " - SSH配置: 用户名、端口等" echo "" echo "3. 执行部署:" echo " # 3节点集群" echo " bash deploy_tdengine_cluster.sh 3" echo "" echo " # 5节点集群" echo " bash deploy_tdengine_cluster.sh 5" echo "" echo "4. 验证集群:" echo " # 在主节点执行" echo " taos -h 192.168.1.10" echo " > SHOW DNODES;" echo " > SHOW MNODES;" echo "" echo "5. 常见问题:" echo " - 确保所有节点时间同步" echo " - 检查防火墙是否关闭" echo " - 确保端口6030-6035未被占用" echo " - 检查磁盘空间是否充足"
集群管理脚本
#!/bin/bash
# TDengine集群管理脚本
# 用法: ./manage_cluster.sh [start|stop|restart|status|add_node|remove_node]
ACTION=$1
NODE_IP=$2
case $ACTION in
start)
systemctl start taosd
sleep 2
systemctl status taosd
;;
stop)
systemctl stop taosd
;;
restart)
systemctl restart taosd
sleep 2
systemctl status taosd
;;
status)
echo "=== TDengine状态 ==="
systemctl status taosd
echo ""
echo "=== 集群节点 ==="
taos -s "SHOW DNODES;"
;;
add_node)
if [ -z "$NODE_IP" ]; then
echo "请指定节点IP: ./manage_cluster.sh add_node 192.168.1.15"
exit 1
fi
echo "添加节点: $NODE_IP"
taos -s "CREATE DNODE '${NODE_IP}:6030';"
sleep 2
taos -s "SHOW DNODES;"
;;
remove_node)
if [ -z "$NODE_IP" ]; then
echo "请指定节点ID: ./manage_cluster.sh remove_node 2"
exit 1
fi
echo "移除节点: $NODE_IP"
taos -s "DROP DNODE '$NODE_IP';"
sleep 2
taos -s "SHOW DNODES;"
;;
*)
echo "用法: $0 [start|stop|restart|status|add_node|remove_node]"
echo ""
echo "命令说明:"
echo " start - 启动TDengine服务"
echo " stop - 停止TDengine服务"
echo " restart - 重启TDengine服务"
echo " status - 查看服务状态和集群信息"
echo " add_node - 添加节点 (需要IP地址)"
echo " remove_node - 移除节点 (需要节点ID)"
;;
esac
监控脚本
#!/bin/bash
# TDengine集群监控脚本
# 定期检查集群健康状态
INTERVAL=60 # 监控间隔(秒)
LOG_FILE="/var/log/tdengine_monitor.log"
while true; do
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$TIMESTAMP] 开始监控..." >> $LOG_FILE
# 检查服务状态
if systemctl is-active --quiet taosd; then
echo " TDengine服务: 运行中" >> $LOG_FILE
else
echo " TDengine服务: 停止!" >> $LOG_FILE
# 尝试重启
systemctl restart taosd
echo " 已尝试重启服务" >> $LOG_FILE
fi
# 检查集群状态
DNODES=$(taos -s "SHOW DNODES;" 2>/dev/null | grep -c "ready" || echo 0)
echo " 就绪节点数: $DNODES" >> $LOG_FILE
# 检查磁盘使用
DISK_USAGE=$(df -h $DATA_DIR | tail -1 | awk '{print $5}')
echo " 磁盘使用率: $DISK_USAGE" >> $LOG_FILE
# 检查内存使用
MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
echo " 内存使用率: ${MEM_USAGE}%" >> $LOG_FILE
sleep $INTERVAL
done
使用步骤
-
准备环境
# 确保所有节点可SSH访问 ssh-copy-id root@node1_ip ssh-copy-id root@node2_ip ssh-copy-id root@node3_ip
-
配置脚本
- 修改
NODES数组中的IP地址 - 调整
VERSION为需要的版本 - 根据需要修改
CLUSTER_TYPE
- 修改
-
执行部署
# 在主节点执行 bash deploy_tdengine_cluster.sh 3
-
验证部署
taos -h 主节点IP SHOW DNODES; SHOW MNODES;
这个脚本会自动完成TDengine集群的完整部署流程,包括节点配置、服务启停、集群组建和验证。