使用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