自动配置TDengine集群的脚本

wen 实用脚本 14

本文目录导读:

自动配置TDengine集群的脚本

  1. TDengine集群自动配置脚本
  2. 使用步骤

我来提供一个自动配置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

使用步骤

  1. 准备环境

    # 确保所有节点可SSH访问
    ssh-copy-id root@node1_ip
    ssh-copy-id root@node2_ip
    ssh-copy-id root@node3_ip
  2. 配置脚本

    • 修改 NODES 数组中的IP地址
    • 调整 VERSION 为需要的版本
    • 根据需要修改 CLUSTER_TYPE
  3. 执行部署

    # 在主节点执行
    bash deploy_tdengine_cluster.sh 3
  4. 验证部署

    taos -h 主节点IP
    SHOW DNODES;
    SHOW MNODES;

这个脚本会自动完成TDengine集群的完整部署流程,包括节点配置、服务启停、集群组建和验证。

抱歉,评论功能暂时关闭!