自动配置Neo4j集群的脚本

wen 实用脚本 16

我将为您提供一套自动配置Neo4j集群的脚本,这些脚本涵盖了从安装到配置的完整流程。

自动配置Neo4j集群的脚本

主安装脚本 (install-neo4j-cluster.sh)

#!/bin/bash
# Neo4j集群自动配置脚本
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 配置参数
NEO4J_VERSION="5.19.0"
NEO4J_HOME="/opt/neo4j"
CLUSTER_NAME="my-neo4j-cluster"
MINIMUM_MEMBERS=3
# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}
# 检查系统要求
check_system_requirements() {
    log_info "检查系统要求..."
    # 检查Java版本
    if command -v java &> /dev/null; then
        java_version=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}')
        log_info "Java版本: $java_version"
    else
        log_error "需要Java 17+"
        exit 1
    fi
    # 检查内存
    total_mem=$(free -g | awk '/^Mem:/{print $2}')
    if [ "$total_mem" -lt 4 ]; then
        log_warn "建议至少4GB内存,当前: ${total_mem}GB"
    fi
    # 检查磁盘空间
    disk_space=$(df -h /opt | awk 'NR==2 {print $4}')
    log_info "可用磁盘空间: $disk_space"
}
# 安装依赖
install_dependencies() {
    log_info "安装依赖..."
    if command -v apt-get &> /dev/null; then
        sudo apt-get update
        sudo apt-get install -y wget curl tar jq
    elif command -v yum &> /dev/null; then
        sudo yum install -y wget curl tar jq
    else
        log_error "不支持的包管理器"
        exit 1
    fi
}
# 下载并安装Neo4j
install_neo4j() {
    local node_id=$1
    local install_path="${NEO4J_HOME}_${node_id}"
    log_info "为节点${node_id}安装Neo4j ${NEO4J_VERSION}..."
    if [ -d "$install_path" ]; then
        log_warn "节点${node_id}已安装,跳过..."
        return 0
    fi
    # 下载
    wget -q "https://dist.neo4j.org/neo4j-community-${NEO4J_VERSION}-unix.tar.gz" \
        -O /tmp/neo4j-${NEO4J_VERSION}.tar.gz
    # 解压
    sudo tar -xzf "/tmp/neo4j-${NEO4J_VERSION}.tar.gz" -C /opt/
    sudo mv "/opt/neo4j-community-${NEO4J_VERSION}" "$install_path"
    # 清理
    rm -f "/tmp/neo4j-${NEO4J_VERSION}.tar.gz"
    log_info "节点${node_id}安装完成"
}
# 配置集群
configure_cluster() {
    local node_id=$1
    local install_path="${NEO4J_HOME}_${node_id}"
    local config_file="${install_path}/conf/neo4j.conf"
    local server_discovery_file="${install_path}/conf/server-discovery.yaml"
    log_info "配置节点${node_id}..."
    # 备份原始配置
    cp "$config_file" "${config_file}.backup"
    # 生成配置文件
    cat > "$config_file" << EOF
# Neo4j Cluster Configuration for Node ${node_id}
# Server settings
server.directories.data=data
server.directories.logs=logs
server.directories.plugins=plugins
# Network configuration
server.default_listen_address=0.0.0.0
server.default_advertised_address=${NODE_IPS[$node_id]}
# HTTP and Bolt ports
server.http.listen_address=:${HTTP_PORTS[$node_id]}
server.http.advertised_address=${NODE_IPS[$node_id]}:${HTTP_PORTS[$node_id]}
server.bolt.listen_address=:${BOLT_PORTS[$node_id]}
server.bolt.advertised_address=${NODE_IPS[$node_id]}:${BOLT_PORTS[$node_id]}
# Cluster configuration
dbms.cluster.enabled=true
dbms.cluster.cluster_name=${CLUSTER_NAME}
dbms.cluster.discovery.listen_address=:5000
dbms.cluster.discovery.advertised_address=${NODE_IPS[$node_id]}:5000
dbms.cluster.transaction.listen_address=:6000
dbms.cluster.transaction.advertised_address=${NODE_IPS[$node_id]}:6000
dbms.cluster.raft.listen_address=:7000
dbms.cluster.raft.advertised_address=${NODE_IPS[$node_id]}:7000
# Minimum number of members in the cluster
dbms.cluster.minimum_cluster_size=${MINIMUM_MEMBERS}
# Initial discovery members
# These are the addresses of all nodes in the cluster
EOF
    # 添加发现成员
    echo "# Initial discovery members" >> "$config_file"
    for i in $(seq 0 $((${#NODE_IPS[@]} - 1))); do
        if [ "$i" -eq "$node_id" ]; then
            echo "# dbms.cluster.discovery.initial_discovery_members_${i}=${NODE_IPS[$i]}:5000" >> "$config_file"
        else
            echo "dbms.cluster.discovery.initial_discovery_members_${i}=${NODE_IPS[$i]}:5000" >> "$config_file"
        fi
    done
    # 集群发现配置
    cat > "$server_discovery_file" << EOF
# Server Discovery Configuration
cluster:
  discovery:
    type: static
    initial_discovery_members: |
EOF
    # 添加所有节点到发现配置
    for i in $(seq 0 $((${#NODE_IPS[@]} - 1))); do
        echo "      - ${NODE_IPS[$i]}:5000" >> "$server_discovery_file"
    done
    log_info "节点${node_id}配置完成"
}
# 启动节点
start_node() {
    local node_id=$1
    local install_path="${NEO4J_HOME}_${node_id}"
    log_info "启动节点${node_id}..."
    # 设置环境变量
    export NEO4J_CONF="${install_path}/conf"
    # 启动Neo4j
    sudo -u neo4j "${install_path}/bin/neo4j" start
    # 等待启动
    sleep 10
    # 检查状态
    if sudo -u neo4j "${install_path}/bin/neo4j" status | grep -q "is running"; then
        log_info "节点${node_id}启动成功"
    else
        log_error "节点${node_id}启动失败"
        exit 1
    fi
}
# 创建系统用户
create_system_user() {
    if ! id -u neo4j &>/dev/null; then
        sudo useradd -r -s /bin/false neo4j
    fi
    # 设置权限
    for i in $(seq 0 $((${#NODE_IPS[@]} - 1))); do
        sudo chown -R neo4j:neo4j "${NEO4J_HOME}_${i}"
    done
}
# 检查集群状态
check_cluster_status() {
    log_info "检查集群状态..."
    local first_node_ip=${NODE_IPS[0]}
    local first_node_port=${HTTP_PORTS[0]}
    # 尝试连接到第一个节点
    for i in $(seq 1 10); do
        if curl -s -o /dev/null -w "%{http_code}" \
            "http://${first_node_ip}:${first_node_port}" | grep -q "200"; then
            log_info "集群API可用"
            break
        fi
        log_info "等待集群就绪... ($i/10)"
        sleep 5
    done
    log_info "集群配置完成!"
    echo "================================"
    echo "集群节点信息:"
    for i in $(seq 0 $((${#NODE_IPS[@]} - 1))); do
        echo "  节点${i}: http://${NODE_IPS[$i]}:${HTTP_PORTS[$i]}"
        echo "  Bolt: bolt://${NODE_IPS[$i]}:${BOLT_PORTS[$i]}"
    done
    echo "================================"
}
# 主函数
main() {
    log_info "开始Neo4j集群自动配置..."
    # 检查系统要求
    check_system_requirements
    # 安装依赖
    install_dependencies
    # 创建系统用户
    create_system_user
    # 节点数量和配置
    declare -a NODE_IPS=(
        "192.168.1.10"
        "192.168.1.11"
        "192.168.1.12"
    )
    declare -a HTTP_PORTS=(
        7474
        7475
        7476
    )
    declare -a BOLT_PORTS=(
        7687
        7688
        7689
    )
    # 检查节点数量
    if [ ${#NODE_IPS[@]} -lt 3 ]; then
        log_error "集群至少需要3个节点"
        exit 1
    fi
    # 安装和配置每个节点
    for i in $(seq 0 $((${#NODE_IPS[@]} - 1))); do
        install_neo4j $i
        configure_cluster $i
    done
    # 启动所有节点
    for i in $(seq 0 $((${#NODE_IPS[@]} - 1))); do
        start_node $i
    done
    # 检查集群状态
    check_cluster_status
}
# 运行主函数
main "$@"

辅助脚本 (neo4j-cluster-helper.sh)

#!/bin/bash
# Neo4j集群管理辅助脚本
# 设置集群变量
setup_cluster_vars() {
    export NEO4J_CLUSTER_NODES=(
        "192.168.1.10"
        "192.168.1.11" 
        "192.168.1.12"
    )
    export NEO4J_HTTP_PORTS=(
        7474
        7475
        7476
    )
    export NEO4J_BOLT_PORTS=(
        7687
        7688
        7689
    )
}
# 停止所有节点
stop_cluster() {
    echo "停止所有集群节点..."
    for i in $(seq 0 $((${#NEO4J_CLUSTER_NODES[@]} - 1))); do
        local install_path="${NEO4J_HOME}_${i}"
        if [ -d "$install_path" ]; then
            sudo -u neo4j "${install_path}/bin/neo4j" stop
            echo "节点${i}已停止"
        fi
    done
}
# 检查集群状态
cluster_status() {
    echo "检查集群状态..."
    for i in $(seq 0 $((${#NEO4J_CLUSTER_NODES[@]} - 1))); do
        local install_path="${NEO4J_HOME}_${i}"
        if [ -d "$install_path" ]; then
            local status=$(sudo -u neo4j "${install_path}/bin/neo4j" status 2>&1)
            echo "节点${i}: $status"
        fi
    done
}
# 备份配置
backup_config() {
    local backup_dir="/tmp/neo4j_backup_$(date +%Y%m%d_%H%M%S)"
    mkdir -p "$backup_dir"
    echo "备份配置到 $backup_dir"
    for i in $(seq 0 $((${#NEO4J_CLUSTER_NODES[@]} - 1))); do
        local install_path="${NEO4J_HOME}_${i}"
        if [ -d "$install_path" ]; then
            cp -r "${install_path}/conf" "${backup_dir}/conf_${i}"
            echo "节点${i}配置已备份"
        fi
    done
}
# 重置集群
reset_cluster() {
    echo "警告: 这将删除所有数据和配置!"
    read -p "确认删除? (y/n): " confirm
    if [ "$confirm" = "y" ]; then
        stop_cluster
        for i in $(seq 0 $((${#NEO4J_CLUSTER_NODES[@]} - 1))); do
            local install_path="${NEO4J_HOME}_${i}"
            if [ -d "$install_path" ]; then
                sudo rm -rf "${install_path}/data" "${install_path}/logs"
                echo "节点${i}数据已清理"
            fi
        done
    fi
}
# 帮助信息
show_help() {
    echo "Neo4j集群管理工具"
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  stop      停止所有节点"
    echo "  status    检查集群状态"
    echo "  backup    备份配置"
    echo "  reset     重置集群"
    echo "  help      显示帮助信息"
}
# 主逻辑
case "${1:-help}" in
    stop)
        setup_cluster_vars
        stop_cluster
        ;;
    status)
        setup_cluster_vars
        cluster_status
        ;;
    backup)
        setup_cluster_vars
        backup_config
        ;;
    reset)
        setup_cluster_vars
        reset_cluster
        ;;
    help|*)
        show_help
        ;;
esac

使用说明

  1. 设置执行权限

    chmod +x install-neo4j-cluster.sh neo4j-cluster-helper.sh
  2. 配置节点IP: 在 install-neo4j-cluster.sh 中修改 NODE_IPS 数组为您的实际节点IP地址

  3. 运行安装

    sudo ./install-neo4j-cluster.sh
  4. 管理集群

    # 检查状态
    ./neo4j-cluster-helper.sh status

停止集群

./neo4j-cluster-helper.sh stop


这些脚本会自动处理Neo4j集群的安装、配置和启动,支持3节点以上的集群部署。

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