本文目录导读:

我来提供一个自动配置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集群的完整部署流程,包括节点配置、服务启停、集群组建和验证。
版权声明: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直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播