使用Docker和虚拟IP在一台服务器上灵活部署多个Neo4j实例

使用Docker和虚拟IP在一台服务器上灵活部署多个Neo4j实例

前言

在现代应用开发中,图数据库Neo4j因其强大的关系处理能力而备受青睐。但有时候我们需要在同一台服务器上运行多个Neo4j实例,比如用于开发测试、多租户环境或者A/B测试。传统的端口映射方式需要修改大量配置,而使用虚拟IP方案则更加优雅和灵活。

本文将介绍如何使用Docker和虚拟IP技术,在一台服务器上部署多个Neo4j实例,并实现按需启动的灵活管理。

方案优势

  • 端口一致性:所有实例使用相同的标准端口(7474/7687)
  • IP隔离:通过不同虚拟IP地址区分实例
  • 灵活启动:可根据资源情况按需启动单个或多个实例
  • 配置简单:使用Docker Compose和环境变量管理
  • 性能优化:使用主机网络模式,减少网络开销

环境准备

首先确保服务器已安装Docker和Docker Compose:

点击进入docker安装方法

步骤一:配置虚拟IP

在服务器上设置两个虚拟IP地址:

# 添加虚拟IP(根据实际网卡名称调整,通常是ens33或ens33)
sudo ip addr add 192.168.10.100/24 dev ens33
sudo ip addr add 192.168.10.101/24 dev ens33# 验证IP配置
ip addr show ens33# 设置开机自动添加虚拟IP(可选)
echo 'ip addr add 192.168.10.100/24 dev ens33' | sudo tee -a /etc/rc.local
echo 'ip addr add 192.168.10.101/24 dev ens33' | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local

步骤二:创建项目结构

创建项目目录并组织文件结构:

mkdir neo4j-cluster
cd neo4j-cluster
mkdir -p {data1,data2,logs1,logs2,import1,import2}

步骤三:配置环境变量

创建 .env 配置文件:

# Neo4j实例启动控制
START_INSTANCE1=true
START_INSTANCE2=false# 虚拟IP配置
VIP1=192.168.10.100
VIP2=192.168.10.101# Neo4j认证信息
NEO4J_PASSWORD1=password1
NEO4J_PASSWORD2=password2# 公共配置
NEO4J_VERSION=5.13.0

步骤四:创建Docker Compose配置

创建 docker compose.yml 文件:

version: '3.8'services:neo4j-instance1:image: neo4j:${NEO4J_VERSION}container_name: neo4j-instance1network_mode: hostenvironment:- NEO4J_AUTH=neo4j/${NEO4J_PASSWORD1}- NEO4J_apoc_export_file_enabled=true- NEO4J_apoc_import_file_enabled=true- NEO4J_apoc_import_file_use__neo4j__config=true- NEO4JLABS_PLUGINS=["apoc"]- NEO4J_server_bolt_listen__address=${VIP1}:7687- NEO4J_server_http_listen__address=${VIP1}:7474- NEO4J_server_https_listen__address=${VIP1}:7473volumes:- ./data1:/data- ./logs1:/logs- ./import1:/var/lib/neo4j/importrestart: unless-stoppedprofiles: ["instance1"]healthcheck:test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://${VIP1}:7474"]interval: 30stimeout: 10sretries: 3neo4j-instance2:image: neo4j:${NEO4J_VERSION}container_name: neo4j-instance2network_mode: hostenvironment:- NEO4J_AUTH=neo4j/${NEO4J_PASSWORD2}- NEO4J_apoc_export_file_enabled=true- NEO4J_apoc_import_file_enabled=true- NEO4J_apoc_import_file_use__neo4j__config=true- NEO4JLABS_PLUGINS=["apoc"]- NEO4J_server_bolt_listen__address=${VIP2}:7687- NEO4J_server_http_listen__address=${VIP2}:7474- NEO4J_server_https_listen__address=${VIP2}:7473volumes:- ./data2:/data- ./logs2:/logs- ./import2:/var/lib/neo4j/importrestart: unless-stoppedprofiles: ["instance2"]healthcheck:test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://${VIP2}:7474"]interval: 30stimeout: 10sretries: 3

步骤五:管理脚本

创建管理脚本 manage-neo4j.sh

#!/bin/bashset -e# 加载环境变量
if [ -f .env ]; thenexport $(cat .env | grep -v '#' | awk '/=/ {print $1}')
ficase "$1" in"start")echo "正在启动Neo4j实例..."if [ "$START_INSTANCE1" = "true" ]; thenecho "启动实例1 (${VIP1})..."docker compose --profile instance1 up -dfiif [ "$START_INSTANCE2" = "true" ]; thenecho "启动实例2 (${VIP2})..."docker compose --profile instance2 up -dfi;;"stop")echo "正在停止Neo4j实例..."docker compose down;;"restart")echo "正在重启Neo4j实例..."$0 stopsleep 2$0 start;;"status")echo "Neo4j实例状态:"docker ps --filter "name=neo4j-instance";;"logs")shiftdocker compose logs $@;;"config")echo "当前配置:"echo "实例1: START_INSTANCE1=$START_INSTANCE1, VIP=$VIP1"echo "实例2: START_INSTANCE2=$START_INSTANCE2, VIP=$VIP2";;"update-env")shiftif [ "$1" = "instance1" ]; thensed -i "s/START_INSTANCE1=.*/START_INSTANCE1=$2/" .envelif [ "$1" = "instance2" ]; thensed -i "s/START_INSTANCE2=.*/START_INSTANCE2=$2/" .envelseecho "用法: $0 update-env {instance1|instance2} {true|false}"fi;;*)echo "用法: $0 {start|stop|restart|status|logs|config|update-env}"echo ""echo "命令说明:"echo "  start       启动配置的实例"echo "  stop        停止所有实例"echo "  restart     重启实例"echo "  status      查看实例状态"echo "  logs        查看日志"echo "  config      显示当前配置"echo "  update-env  更新启动配置"exit 1;;
esac

给脚本执行权限:

chmod +x manage-neo4j.sh

步骤六:使用和管理

启动实例

如docker compose不可用,可以替换为docker compose

# 查看当前配置
./manage-neo4j.sh config# 启动配置的实例
./manage-neo4j.sh start# 查看状态
./manage-neo4j.sh status

动态调整配置

# 只启动实例1
./manage-neo4j.sh update-env instance1 true
./manage-neo4j.sh update-env instance2 false
./manage-neo4j.sh restart# 只启动实例2
./manage-neo4j.sh update-env instance1 false
./manage-neo4j.sh update-env instance2 true
./manage-neo4j.sh restart# 启动两个实例(资源充足时)
./manage-neo4j.sh update-env instance1 true
./manage-neo4j.sh update-env instance2 true
./manage-neo4j.sh restart

访问实例

  • 实例1: http://192.168.10.100:7474 (用户名: neo4j, 密码: password1)
  • 实例2: http://192.168.10.101:7474 (用户名: neo4j, 密码: password2)

故障排除

虚拟IP无法访问

# 检查虚拟IP是否设置
ip addr show ens33# 检查防火墙规则
sudo ufw status
sudo ufw allow from any to 192.168.10.100 port 7474,7687
sudo ufw allow from any to 192.168.10.101 port 7474,7687

端口冲突

如果端口已被占用,可以检查并终止冲突进程:

sudo lsof -i :7474
sudo lsof -i :7687

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/97861.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/97861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8s学习笔记(一):Kubernetes架构-原理-组件

Kubernetes(简称 K8s)是一款开源的容器编排平台,核心目标是实现容器化应用的自动化部署、扩展、故障恢复和运维管理。其设计遵循 “主从架构”(Control Plane Node),组件分工明确,通过 “声明式…

ensp配置学习笔记 比赛版 vlan 静态路由 ospf bgp dhcp

学习配置VLAN 虚拟局域网,目的让两台在同一网段的设备,在交换机中访问。基础指令:sys 进入系统 sysname R1 修改交换机名字为R1 display cur 查看数据、端口等交换机信息 (在端口中,可以直接display this 可以直接看…

仓颉编程语言青少年基础教程:enum(枚举)类型和Option类型

仓颉编程语言青少年基础教程:enum(枚举)类型和Option类型enum 和 Option 各自解决一类“语义级”问题:enum 让“取值只在有限集合内”的约束从注释变成编译器强制;Option 让“值可能不存在”的语义显式化。enum类型enu…

javaEE-Spring IOCDI

目录 1、什么是Spring: 2.什么是IoC: 3. 什么是控制反转呢? 4.IoC容器具备以下优点: 5.DI是什么: 依赖注⼊方法: 三种注入方法的优缺点: Autowired注解注入存在的问题: Autowired和Resource的区别&#xff…

TensorFlow Lite 全面解析:端侧部署方案与PyTorch Mobile深度对比

1 TensorFlow Lite 基础介绍 TensorFlow Lite (TFLite) 是 Google 为移动设备(Android, iOS)、微控制器(Microcontrollers)和其他嵌入式设备(如 Raspberry Pi)开发的轻量级深度学习推理框架。它的核心目标是…

mapbox进阶,使用jsts实现平角缓冲区

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言 1.1 ☘️mapboxgl.Map 地图对象 1.2 ☘️mapboxgl.Map style属性 1.3 ☘️jsts myBufferOp 缓冲区生成对对象 …

linux装好显卡后如何检查

背景:客户通知装好了显卡,我们去机器上查看一下一. 使用到的命令 watch -n 1 nvidia-smi 可实时查看gpu的使用率nvidia-smi 之查看一次 二、查看内存和显存 内存使用命令 free -h,显存使用 nvidia-smi 这只是查看的navidia, 其他品牌的会不一样

人工智能深度学习——卷积神经网络(CNN)

一、图像卷积运算 对图像矩阵与滤波器矩阵进行对应相乘再求和运算,转化得到新的矩阵。 作用:快速定位图像中某些边缘特征 英文:convolution(CNN)池化层实现维度缩减 池化:按照一个固定规则对图像矩阵进行处…

SaaS 建站从 0 到 1 教程:Vue 动态域名 + 后端子域名管理 + Nginx 配置

SaaS 建站从 0 到 1 教程:Vue 动态域名 后端子域名管理 Nginx 配置 一、什么是 SaaS 建站? SaaS(Software as a Service)建站,就是通过一套统一的系统,支持用户在线注册、绑定域名、快速生成专属网站。…

关于神经网络中回归的概念

神经网络中的回归详解 引言 神经网络(NeuralNetworks)是一种强大的机器学习模型,可用于分类和回归任务。本文聚焦于神经网络中的回归(Regression),即预测连续输出值(如房价、温度)。…

JAVASCRIPT 前端数据库-V9--仙盟数据库架构-—仙盟创梦IDE

老版本 在v1 版本中我们讲述了 基础版的应用JAVASCRIPT 前端数据库-V1--仙盟数据库架构-—-—仙盟创梦IDE-CSDN博客接下载我们做一个更复杂的的其他场景由于,V1查询字段必须 id接下来我们修改了了代码JAVASCRIPT 前端数据库-V2--仙盟数据库架构-—-—仙盟创梦IDE-CS…

k8s核心资料基本操作

NamespaceNamespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问…

PostgreSQL——分区表

分区表一、分区表的意义二、传统分区表2.1、继承表2.2、创建分区表2.3、使用分区表2.4、查询父表还是子表2.5、constraint_exclusion参数2.6、添加分区2.7、删除分区2.8、分区表相关查询2.9、传统分区表注意事项三、内置分区表3.1、创建分区表3.2、使用分区表3.3、内置分区表原…

Linux任务调度全攻略

Linux下的任务调度分为两类,系统任务调度和用户任务调度。系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。/etc/crontab文件包括下面…

回溯算法通关秘籍:像打怪一样刷题

🚀 回溯算法通关秘籍:像打怪一样刷题! 各位同学,今天咱们聊聊 回溯算法(Backtracking)。它听起来玄乎,但其实就是 “暴力搜索 剪枝” 的优雅版。 打个比方:回溯就是在迷宫里探险&am…

嵌入式Linux常用命令

📟 核心文件与目录操作pwd-> 功能: 打印当前工作目录的绝对路径。-> 示例: pwd -> 输出 /home/user/projectls [选项] [目录]-> 功能: 列出目录内容。-> 常用选项:-l: 长格式显示(详细信息)-a: 显示所有文件(包括隐…

深入理解 Linux 内核进程管理

在 Linux 系统中,进程是资源分配和调度的基本单位,内核对进程的高效管理直接决定了系统的性能与稳定性。本文将从进程描述符的结构入手,逐步剖析进程的创建、线程实现与进程终结的完整生命周期,带您深入理解 Linux 内核的进程管理…

ACP(三):让大模型能够回答私域知识问题

让大模型能够回答私域知识问题 未经过特定训练答疑机器人,是无法准确回答“我们公司项目管理用什么工具”这类内部问题。根本原因在于,大模型的知识来源于其训练数据,这些数据通常是公开的互联网信息,不包含任何特定公司的内部文档…

使用Xterminal连接Linux服务器

使用Xterminal连接Linux服务器(VMware虚拟机)的步骤如下,前提是虚拟机已获取IP(如 192.168.31.105)且网络互通: 一、准备工作(服务器端确认)确保SSH服务已安装并启动 Linux服务器需要…

ChatBot、Copilot、Agent啥区别

以下内容为AI生成ChatBot(聊天机器人)、Copilot(副驾驶)和Agent(智能体/代理)是AI应用中常见的三种形态,它们在人机交互、自动化程度和任务处理能力上有着显著的区别。特征维度ChatBot (聊天机器…