Docker Compose中Solr容器卷跨重启无法持久化数据问题排查
问题:Docker Compose中Solr卷无法在容器重启后持久化数据
Docker Compose配置
version: '3.7' services: solrcloud1: image: solr:8.11.2 container_name: solrcloud1 ports: - "8981:8983" environment: - ZK_HOST=zk:2181 networks: - solr depends_on: - zk volumes: - solrcloud1_data:/var/solr solrcloud2: image: solr:8.11.2 container_name: solrcloud2 ports: - "8982:8983" environment: - ZK_HOST=zk:2181 networks: - solr depends_on: - zk volumes: - solrcloud2_data:/var/solr solrcloud3: image: solr:8.11.2 container_name: solrcloud3 ports: - "8983:8983" environment: - ZK_HOST=zk:2181 networks: - solr depends_on: - zk volumes: - solrcloud3_data:/var/solr zk: image: zookeeper:3.6.2 container_name: zk restart: always hostname: zk ports: - 2181:2181 - 7001:7000 environment: ZOO_MY_ID: 1 ZOO_SERVERS: server.1=zk:2888:3888;2181 ZOO_4LW_COMMANDS_WHITELIST: mntr, conf, ruok ZOO_CFG_EXTRA: "metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider metricsProvider.httpPort=7000 metricsProvider.exportJvmInfo=true" networks: - solr volumes: - zk_data:/data networks: solr: volumes: solrcloud1_data: external: false solrcloud2_data: external: false solrcloud3_data: external: false zk_data: external: false
已确认的卷状态
$ docker volume ls DRIVER VOLUME NAME local 1zk_3sc_solrcloud1_data local 1zk_3sc_solrcloud2_data local 1zk_3sc_solrcloud3_data local 1zk_3sc_zk_data local 8a1dadc9debf247e3b5b11d64367438806ac839e9bf99566916a473110782f80 local 15e8ec0fb6052d0458d9f1bba9812326a0eccfe844d75cb7fbf0019ab1cc03f1 local a242b48bedc509504825dcf9ec5d300692282a80cb87bbb0f694c67c2ad969f2 local b8183473dd64a163dc91c6eb9d878675344b6655fd766837fe92e1c1f1381060
问题描述
- 为每个Solr容器定义了命名卷
solrcloud1_data、solrcloud2_data、solrcloud3_data用于持久化数据。 - 创建集合并索引数据后,执行
docker-compose down停止并移除所有容器。 - 执行
docker-compose up重启容器后,集合、索引数据及核心未被保留,卷似乎未正确挂载。 - 已通过
docker volume ls验证命名卷存在。
原因分析与解决方案
核心原因
- Solr Cloud元数据依赖ZK持久化:Solr Cloud的集群配置(集合、核心信息)存储在ZooKeeper中,如果ZK的卷未正确持久化元数据,重启后Solr节点无法读取集群配置,就会丢失集合信息。
- Solr卷权限不匹配:Solr镜像默认以
solr用户(UID 8983)运行,而Docker命名卷默认所有者为root,导致Solr进程无法读取/写入卷中的数据,即使卷存在也无法正常加载数据。 - 容器启动顺序问题:
depends_on仅保证容器启动顺序,不保证ZK服务就绪,Solr节点启动时如果ZK未完全就绪,会导致元数据注册失败。
解决方案
1. 验证ZK卷的持久化状态
- 检查ZK卷中的数据是否存在:
正常情况下应看到docker run --rm -v 1zk_3sc_zk_data:/data busybox ls -la /dataversion-2目录、myid文件等ZK数据文件。如果为空,说明ZK卷未正确持久化,需重新确认ZK容器的卷挂载配置。 - 验证ZK服务状态:启动ZK容器后,使用ZK客户端连接检查集群配置:
应返回Solr集群的配置节点列表。docker exec zk zkCli.sh ls /solr
2. 修复Solr卷的权限问题
方法一:在Docker Compose中添加权限初始化命令
修改每个Solr服务的command,先修正卷的权限再启动Solr:
solrcloud1: # 其他配置不变 command: - bash - -c - | chown -R solr:solr /var/solr exec solr start -f -c -z zk:2181
对solrcloud2、solrcloud3执行同样的修改。
方法二:手动修改卷权限
在启动容器前,手动设置卷的所有者为Solr用户:
# 处理solrcloud1_data卷 docker run --rm -v solrcloud1_data:/var/solr busybox chown -R 8983:8983 /var/solr # 处理solrcloud2_data卷 docker run --rm -v solrcloud2_data:/var/solr busybox chown -R 8983:8983 /var/solr # 处理solrcloud3_data卷 docker run --rm -v solrcloud3_data:/var/solr busybox chown -R 8983:8983 /var/solr
3. 确保容器启动顺序与服务就绪状态
在ZK服务中添加健康检查,确保Solr仅在ZK就绪后启动:
zk: # 其他配置不变 healthcheck: test: ["CMD", "zkServer.sh", "status"] interval: 10s timeout: 5s retries: 5 solrcloud1: # 其他配置不变 depends_on: zk: condition: service_healthy
对另外两个Solr服务的depends_on做同样修改。
4. 验证Solr卷数据
- 重启前,进入Solr容器查看数据目录:
应看到对应集合的数据目录。docker exec solrcloud1 ls -la /var/solr/data - 重启后再次执行上述命令,确认数据目录内容是否保留,以此验证卷是否正常工作。
内容的提问来源于stack exchange,提问作者Arjun Parmar
相关产品推荐
相关产品推荐

