我将为您提供一套自动配置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
使用说明
-
设置执行权限:
chmod +x install-neo4j-cluster.sh neo4j-cluster-helper.sh
-
配置节点IP: 在
install-neo4j-cluster.sh中修改NODE_IPS数组为您的实际节点IP地址 -
运行安装:
sudo ./install-neo4j-cluster.sh
-
管理集群:
# 检查状态 ./neo4j-cluster-helper.sh status
停止集群
./neo4j-cluster-helper.sh stop
这些脚本会自动处理Neo4j集群的安装、配置和启动,支持3节点以上的集群部署。