Solr概念:Docker容器化部署实践

Solr Docker 容器化部署指南

Docker 部署概述

Docker 容器化部署已经成为现代应用部署的标准方式,Apache Solr 提供了官方的 Docker 镜像,支持从简单的单节点部署到复杂的分布式 SolrCloud 集群。这种部署方式具有环境一致性、资源隔离、快速扩展等优势。

Solr Docker 镜像类型

Apache Solr 提供两种官方 Docker 镜像:

1. 完整版镜像

1
solr:<version>

特点

  • 包含完整的 Solr 发行版
  • 集成所有标准插件和工具
  • 镜像体积较大但功能完整
  • 适合功能需求复杂的部署

2. 精简版镜像

1
solr:<version>-slim

特点

  • 移除了非核心组件和工具
  • 镜像体积更小,启动更快
  • 适合资源受限或简单部署场景
  • 保留核心搜索和索引功能

基础部署模式

1. 单节点 Solr 服务器

快速启动

1
2
3
4
5
6
7
8
9
10
# 创建数据目录
mkdir solrdata

# 启动 Solr 容器并预创建集合
docker run -d \
-v "$PWD/solrdata:/var/solr" \
-p 8983:8983 \
--name my_solr \
solr \
solr-precreate gettingstarted

命令解析

  • -d - 后台运行容器
  • -v "$PWD/solrdata:/var/solr" - 数据持久化挂载
  • -p 8983:8983 - 端口映射
  • --name my_solr - 容器命名
  • solr-precreate gettingstarted - 预创建名为 “gettingstarted” 的集合

访问验证

启动后可通过以下方式访问:

2. 使用 Docker Compose 部署

单节点配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: '3.8'
services:
solr:
image: solr:9-slim
ports:
- "8983:8983"
volumes:
- solr_data:/var/solr
command:
- solr-precreate
- gettingstarted
environment:
- SOLR_HEAP=512m
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:8983/solr/admin/ping || exit 1"]
interval: 30s
timeout: 10s
retries: 3

volumes:
solr_data:

配置说明

  • 持久化存储:使用 Docker 卷保证数据持久性
  • 健康检查:定期检查服务健康状态
  • 内存配置:通过环境变量设置堆内存大小
  • 自动重启:容器异常时自动重启

SolrCloud 分布式部署

1. 基础 SolrCloud 配置

完整的 Docker Compose 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
version: '3.8'

services:
# ZooKeeper 协调服务
zookeeper:
image: zookeeper:3.9
hostname: zoo
ports:
- "2181:2181"
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181
volumes:
- zoo_data:/data
- zoo_datalog:/datalog
healthcheck:
test: ["CMD", "zkOK.sh"]
interval: 10s
timeout: 5s
retries: 3

# Solr 节点 1
solr1:
image: solr:9-slim
hostname: solr1
ports:
- "8981:8983"
environment:
- ZK_HOST=zookeeper:2181
- SOLR_HOST=solr1
- SOLR_PORT=8983
- SOLR_HEAP=1g
volumes:
- solr1_data:/var/solr
depends_on:
zookeeper:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:8983/solr/admin/ping || exit 1"]
interval: 30s
timeout: 10s
retries: 3

# Solr 节点 2
solr2:
image: solr:9-slim
hostname: solr2
ports:
- "8982:8983"
environment:
- ZK_HOST=zookeeper:2181
- SOLR_HOST=solr2
- SOLR_PORT=8983
- SOLR_HEAP=1g
volumes:
- solr2_data:/var/solr
depends_on:
zookeeper:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:8983/solr/admin/ping || exit 1"]
interval: 30s
timeout: 10s
retries: 3

# Solr 节点 3
solr3:
image: solr:9-slim
hostname: solr3
ports:
- "8983:8983"
environment:
- ZK_HOST=zookeeper:2181
- SOLR_HOST=solr3
- SOLR_PORT=8983
- SOLR_HEAP=1g
volumes:
- solr3_data:/var/solr
depends_on:
zookeeper:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:8983/solr/admin/ping || exit 1"]
interval: 30s
timeout: 10s
retries: 3

volumes:
zoo_data:
zoo_datalog:
solr1_data:
solr2_data:
solr3_data:

networks:
default:
driver: bridge

2. 启动和管理集群

启动集群

1
2
3
4
5
6
7
8
# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f solr1

创建分布式集合

1
2
3
4
5
6
7
8
9
10
11
# 进入任意 Solr 容器
docker-compose exec solr1 bash

# 创建分布式集合
solr create_collection -c products \
-shards 2 \
-replicationFactor 2 \
-maxShardsPerNode 2

# 或通过 API 创建
curl -X POST "http://localhost:8983/solr/admin/collections?action=CREATE&name=products&numShards=2&replicationFactor=2&maxShardsPerNode=2"

集合和核心管理

1. 预创建集合

单节点预创建

1
2
3
4
5
6
# 启动时预创建集合
docker run -d \
-p 8983:8983 \
--name solr_with_collection \
solr \
solr-precreate mycollection

SolrCloud 预创建

1
2
3
4
5
6
7
8
9
10
11
12
13
services:
solr-init:
image: solr:9-slim
depends_on:
- solr1
- solr2
environment:
- ZK_HOST=zookeeper:2181
command: >
bash -c "
wait-for-solr.sh --max-attempts 10 --wait-seconds 5 &&
solr create_collection -c products -shards 2 -replicationFactor 2
"

2. 动态集合管理

通过管理界面

  1. 访问 Solr 管理界面:http://localhost:8983/solr
  2. 选择 “Collections” 选项卡
  3. 点击 “Add Collection” 创建新集合
  4. 配置分片和副本参数

通过 API 管理

1
2
3
4
5
6
7
8
9
10
11
# 创建集合
curl -X POST "http://localhost:8983/solr/admin/collections" \
-d "action=CREATE&name=logs&numShards=3&replicationFactor=2"

# 删除集合
curl -X POST "http://localhost:8983/solr/admin/collections" \
-d "action=DELETE&name=logs"

# 添加副本
curl -X POST "http://localhost:8983/solr/admin/collections" \
-d "action=ADDREPLICA&collection=logs&shard=shard1&node=solr2:8983_solr"

数据加载和索引

1. 通过挂载目录加载数据

配置数据挂载

1
2
3
4
5
6
7
8
9
10
11
services:
solr:
image: solr:9-slim
volumes:
- ./data:/opt/solr/example/exampledocs
- solr_data:/var/solr
command: >
bash -c "
solr-precreate gettingstarted &&
post -c gettingstarted /opt/solr/example/exampledocs/*
"

2. 使用初始化脚本

自定义初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建初始化脚本目录
mkdir -p ./init-scripts

# 创建数据加载脚本
cat > ./init-scripts/load-data.sh << 'EOF'
#!/bin/bash
echo "Loading sample data..."
post -c gettingstarted /opt/solr/example/exampledocs/manufacturers.xml
post -c gettingstarted /opt/solr/example/exampledocs/money.xml
echo "Data loading completed."
EOF

chmod +x ./init-scripts/load-data.sh
1
2
3
4
5
6
services:
solr:
image: solr:9-slim
volumes:
- ./init-scripts:/docker-entrypoint-initdb.d
- solr_data:/var/solr

3. 实时数据加载

通过 API 加载数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# JSON 格式数据
curl -X POST "http://localhost:8983/solr/products/update/json/docs" \
-H "Content-Type: application/json" \
-d '[
{
"id": "1",
"name": "iPhone 13",
"category": "electronics",
"price": 999.99
},
{
"id": "2",
"name": "MacBook Pro",
"category": "computers",
"price": 1999.99
}
]'

# 提交更改
curl -X POST "http://localhost:8983/solr/products/update" \
-H "Content-Type: application/json" \
-d '{"commit":{}}'

高级配置和优化

1. 环境变量配置

常用环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
services:
solr:
image: solr:9-slim
environment:
# JVM 配置
- SOLR_HEAP=2g # 堆内存大小
- SOLR_JAVA_MEM=-Xms2g -Xmx2g # JVM 内存参数
- GC_TUNE=-XX:+UseG1GC # 垃圾收集器配置

# Solr 核心配置
- SOLR_HOST=solr1 # 节点主机名
- SOLR_PORT=8983 # 服务端口
- SOLR_HOME=/var/solr # Solr 主目录

# ZooKeeper 配置
- ZK_HOST=zookeeper:2181 # ZooKeeper 地址
- ZK_CLIENT_TIMEOUT=15000 # 客户端超时时间

# 日志配置
- VERBOSE=yes # 详细日志
- SOLR_LOGS_DIR=/var/solr/logs # 日志目录

# 安全配置
- SOLR_AUTHENTICATION_OPTS=-Dsolr.httpclient.auth.basic.username=admin -Dsolr.httpclient.auth.basic.password=secret

2. 自定义配置文件

挂载配置文件

1
2
3
4
5
6
7
8
services:
solr:
image: solr:9-slim
volumes:
- ./conf/solr.in.sh:/opt/solr/bin/solr.in.sh:ro
- ./conf/solrconfig.xml:/opt/solr/server/solr/configsets/default/conf/solrconfig.xml:ro
- ./conf/schema.xml:/opt/solr/server/solr/configsets/default/conf/schema.xml:ro
- solr_data:/var/solr

自定义 solr.in.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# ./conf/solr.in.sh
#!/bin/bash

# JVM 优化设置
SOLR_HEAP="2g"
GC_TUNE="-XX:+UseG1GC -XX:+PerfDisableSharedMem -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=250"
GC_LOG_OPTS="-Xlog:gc*:logs/solr_gc.log:time,tags"

# Solr 性能设置
SOLR_OPTS="$SOLR_OPTS -Dsolr.autoSoftCommit.maxTime=3000"
SOLR_OPTS="$SOLR_OPTS -Dsolr.autoCommit.maxTime=15000"
SOLR_OPTS="$SOLR_OPTS -Dsolr.clustering.enabled=true"

# 安全设置
SOLR_OPTS="$SOLR_OPTS -Dsolr.disable.shardsWhitelist=true"

3. 监控和日志配置

集成监控系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
services:
solr:
image: solr:9-slim
environment:
- ENABLE_REMOTE_JMX_OPTS=true
ports:
- "18983:18983" # JMX 端口
volumes:
- ./monitoring:/opt/solr/contrib/prometheus-exporter

prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml

grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin

生产环境部署最佳实践

1. 资源配置建议

硬件资源规划

1
2
3
4
5
6
7
8
9
10
11
12
13
services:
solr:
image: solr:9-slim
deploy:
resources:
limits:
cpus: '2.0' # CPU 限制
memory: 4G # 内存限制
reservations:
cpus: '1.0' # CPU 保留
memory: 2G # 内存保留
environment:
- SOLR_HEAP=2g # 设置为容器内存的 50%

存储配置

1
2
3
4
5
6
7
volumes:
solr_data:
driver: local
driver_opts:
type: none
o: bind
device: /data/solr # 使用高性能存储

2. 高可用性配置

多节点部署策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
services:
# 使用不同的约束确保节点分布
solr1:
image: solr:9-slim
deploy:
placement:
constraints:
- node.hostname==node1

solr2:
image: solr:9-slim
deploy:
placement:
constraints:
- node.hostname==node2

solr3:
image: solr:9-slim
deploy:
placement:
constraints:
- node.hostname==node3

负载均衡配置

1
2
3
4
5
6
7
8
9
10
11
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- solr1
- solr2
- solr3

3. 安全配置

启用认证

1
2
3
4
5
6
7
services:
solr:
image: solr:9-slim
environment:
- SOLR_AUTHENTICATION_OPTS=-Dsolr.authentication.enabled=true
volumes:
- ./security.json:/var/solr/data/security.json:ro

TLS 加密配置

1
2
3
4
5
6
7
8
9
services:
solr:
image: solr:9-slim
environment:
- SOLR_SSL_ENABLED=true
- SOLR_SSL_KEY_STORE=/opt/solr/server/etc/solr-ssl.keystore.p12
- SOLR_SSL_TRUST_STORE=/opt/solr/server/etc/solr-ssl.keystore.p12
volumes:
- ./certs:/opt/solr/server/etc:ro

故障排除和调试

1. 常见问题诊断

容器启动问题

1
2
3
4
5
6
7
8
9
10
11
# 查看容器日志
docker-compose logs solr1

# 进入容器调试
docker-compose exec solr1 bash

# 检查 Solr 状态
docker-compose exec solr1 solr status

# 检查 ZooKeeper 连接
docker-compose exec solr1 solr zk ls / -z zookeeper:2181

性能问题诊断

1
2
3
4
5
6
7
8
# 查看 JVM 状态
docker-compose exec solr1 jstat -gc -t 1

# 查看线程状态
docker-compose exec solr1 jstack 1

# 查看内存使用
docker-compose exec solr1 jmap -histo 1

2. 集群健康检查

自动化健康检查脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
# cluster-health-check.sh

echo "=== Solr Cluster Health Check ==="

# 检查所有节点状态
for node in solr1 solr2 solr3; do
echo "Checking $node..."
status=$(curl -s "http://localhost:898${node#solr}/solr/admin/ping" | grep -o '"status":"OK"')
if [[ $status == '"status":"OK"' ]]; then
echo "✓ $node is healthy"
else
echo "✗ $node is unhealthy"
fi
done

# 检查集群状态
echo "Checking cluster status..."
curl -s "http://localhost:8983/solr/admin/collections?action=CLUSTERSTATUS&wt=json" | jq '.cluster.live_nodes'

# 检查集合状态
echo "Checking collections..."
curl -s "http://localhost:8983/solr/admin/collections?action=LIST&wt=json" | jq '.collections'

备份和恢复

1. 数据备份策略

自动化备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
services:
backup:
image: solr:9-slim
volumes:
- solr_data:/var/solr:ro
- ./backups:/backups
command: >
bash -c "
while true; do
echo 'Starting backup...'
tar -czf /backups/solr-backup-$(date +%Y%m%d-%H%M%S).tar.gz /var/solr
echo 'Backup completed'
sleep 86400 # 每天备份一次
done
"

集合级备份

1
2
3
4
5
# 创建备份
curl -X POST "http://localhost:8983/solr/admin/collections?action=BACKUP&name=products-backup&collection=products&location=/var/solr/backup"

# 恢复备份
curl -X POST "http://localhost:8983/solr/admin/collections?action=RESTORE&name=products-backup&collection=products-restored&location=/var/solr/backup"

2. 灾难恢复

完整集群恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# disaster-recovery.sh

echo "Starting disaster recovery..."

# 停止所有服务
docker-compose down

# 恢复数据
tar -xzf /backups/latest-backup.tar.gz -C /

# 重新启动集群
docker-compose up -d

# 验证恢复
sleep 30
./cluster-health-check.sh

小结

Docker 容器化部署为 Apache Solr 提供了灵活、可扩展和易于管理的部署方式。无论是简单的单节点部署还是复杂的分布式 SolrCloud 集群,Docker 都能提供一致的部署体验。

关键要点:

  1. 选择合适的镜像:根据需求选择完整版或精简版镜像
  2. 数据持久化:正确配置数据卷确保数据安全
  3. 网络配置:合理规划网络架构和端口映射
  4. 资源管理:设置适当的资源限制和保留
  5. 监控和日志:集成完善的监控和日志系统
  6. 安全配置:启用认证和加密保护集群安全
  7. 备份策略:建立完善的备份和恢复机制

通过遵循这些最佳实践,可以构建稳定、高效、安全的 Solr 容器化搜索服务,满足从开发到生产的各种需求。

© 2025 Solr Community of China All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero