
opensearch是一个开源的数据搜索和分析引擎,在RAG项目中应用广泛,可以执行全文搜索:按字段搜索、搜索多个索引、提升字段、按分数对结果排名、按字段对结果排序以及聚合结果。
1.用docker run 起opensearch服务
今天我们要谈的,是用docker run起opensearch服务,且没有设定宿主机(服务器)数据存储目录的情况下(数据只存于docker容器中,删除docker服务数据便丢失),如何进行数据备份和恢复。如果用-v指定了宿主机目录,或用docker compose命令起了服务,那么数据备份和恢复起来都会简单许多。
首先看一下我们起服务的命令:
bash
docker run -d \
--name opensearch-ai \
-p 9200:9200 \
-p 9600:9600 \
-e OPENSEARCH_INITIAL_ADMIN_PASSWORD=OpenSearch@2026 \
-e OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g \
-e discovery.type=single-node \
-e plugins.security.disabled=true \
--user 1000 \
opensearchproject/opensearch:2
2.数据备份
有备份才有恢复的可能!真的要勤于按期备份数据。
-
第一步:在docker容器内,有一个配置文件/usr/share/opensearch/config/opensearch.yml,我们需要编辑这个文件,为了跳过在容器内装vi或vim编辑器,我们先把容器内 opensearch.yml 拷贝到服务器本地(/opensearch_database/):
docker cp opensearch-ai:/usr/share/opensearch/config/opensearch.yml ./opensearch.yml文件赋予权限:
sudo chmod 777 opensearch.yml进入
vim ./opensearch.yml文件末尾追加:path.repo: "/usr/share/opensearch/snapshots"保存退出。
-
用root身份进入opensearch交互:s
udo docker exec -it --user root opensearch-ai bash,先备份一下原来的opensearch.yml文件。退出opensearch交互,将服务器本地opensearch.yml拷贝进容器中:
sudo docker cp ./opensearch.yml opensearch-ai:/usr/share/opensearch/config/opensearch.yml -
进入容器,修改配置文件属主(用root账号执行),一句一句执行
bash
docker exec -it --user root opensearch-ai bash
chown opensearch:opensearch /usr/share/opensearch/config/opensearch.yml
chmod 644 /usr/share/opensearch/config/opensearch.yml
exit
- 重启opensearch服务:
sudo docker restart opensearch-ai,使配置文件生效 - 再次进入docker交互,创建快照:
bash
sudo docker exec -it opensearch-ai bash
mkdir -p /usr/share/opensearch/snapshots
chown -R 1000:1000 /usr/share/opensearch/snapshots
- 退出docker交互,在终端先注册仓库,告诉opensearch备份目录:
bash
curl -X PUT "http://127.0.0.1:9200/_snapshot/backup_repo?pretty" -H 'Content-Type: application/json' -d'
{
"type": "fs",
"settings": {
"location": "/usr/share/opensearch/snapshots",
"compress": true
}
}
'
返回{ "acknowledged" : true}表示成功
- 进行快照备份(写入docker的快照文件夹):
curl -X PUT http://127.0.0.1:9200/_snapshot/backup_repo/snapshot_$(date +%Y%m%d)?wait_for_completion=true&pretty
等待完成 - 将docker容器内 /usr/share/opensearch/snapshots 拷贝到服务器当前目录 os_backup
sudo docker cp opensearch-ai:/usr/share/opensearch/snapshots ./os_backup_20260910此时 ./os_backup 就是服务器本地的完整快照备份包。
3.数据恢复
若真的把opensearch docker容器删掉了,我们有备份文件,该如何恢复?
- 首先,我们创建一个新 OpenSearch 容器,把这个 os_backup 目录拷贝进容器的 /usr/share/opensearch/snapshots,注册同名仓库,执行 restore。
恢复前,重建opensearch容器,和之前的配置保持一致:
bash
docker run -d \
--name opensearch-new \
-p 9200:9200 \
-p 9600:9600 \
-e OPENSEARCH_INITIAL_ADMIN_PASSWORD=OpenSearch@2026 \
-e OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g \
-e discovery.type=single-node \
-e plugins.security.disabled=true \
--user 1000 \
opensearchproject/opensearch:2
- 把新容器的 yml 拷到宿主机
sudo docker cp opensearch-new:/usr/share/opensearch/config/opensearch.yml ./opensearch-new.yml - 编辑文件,最低行加上:path.repo: "/usr/share/opensearch/snapshots"
- 传回容器,修改权限:
docker cp ./opensearch-new.yml opensearch-new:/usr/share/opensearch/config/opensearch.yml - 用root进入容器修改文件属主
bash
sudo docker exec -it --user root opensearch-new bash
chown opensearch:opensearch /usr/share/opensearch/config/opensearch.yml
chmod 644 /usr/share/opensearch/config/opensearch.yml
exit
- 重启新容器,让 path.repo 配置生效:
docker restart opensearch-new - 在新容器内创建快照目录,修正权限
bash
sudo docker exec -it opensearch-new bash
mkdir -p /usr/share/opensearch/snapshots
chown -R opensearch:opensearch /usr/share/opensearch/snapshots
exit
- 宿主机执行,把本地 os_backup 里面所有快照文件,放到容器 /usr/share/opensearch/snapshots
注意: os_backup 是你之前备份到宿主机的快照文件夹
bash
sudo docker cp ./os_backup/. opensearch-new:/usr/share/opensearch/snapshots/
重点: 命令末尾的 . 不能漏,代表拷贝 os_backup内部所有文件,而不是把 os_backup 整个文件夹塞进去。
- 拷贝完成后,再次修复容器内快照目录权限(非常关键!)
bash
docker exec -it --user root opensearch-new bash
chown -R opensearch:opensearch /usr/share/opensearch/snapshots
chmod -R 755 /usr/share/opensearch/snapshots
exit
- 退出docker服务交互,在宿主机执行 curl,注册这个库:
bash
curl -X PUT "http://127.0.0.1:9200/_snapshot/backup_repo?pretty" -H 'Content-Type: application/json' -d'
{
"type": "fs",
"settings": {
"location": "/usr/share/opensearch/snapshots",
"compress": true
}
}
'
返回 {"acknowledged":true} 代表仓库注册成功
- 查看仓库中有哪些快照:c
url -X GET "http://127.0.0.1:9200/_snapshot/backup_repo/_all?pretty" - 选择一个快照,执行恢复命令:
curl -X POST http://127.0.0.1:9200/_snapshot/backup_repo/snapshot_20260910/_restore?pretty
又可以继续使用啦!