如何将本地单节点Elasticsearch集群数据同步至远程VPS实例
解决异地局域网ES索引同步到VPS的方案
这个场景我之前帮朋友处理过,核心难点就是局域网没有公网IP,外部没法主动连进来,所以必须让内网的ES节点(或者内网里能访问ES的机器)主动把数据往外送。下面给你几个靠谱的方案,按操作复杂度从低到高排序,你可以根据数据量和自动化需求选:
方案一:快照备份+主动上传+VPS恢复(适合大数据量,稳定可靠)
这是ES官方推荐的离线备份方式,适合数据量较大的场景:
- 第一步:在内网ES上配置本地快照仓库
- 先在ES节点上创建一个存储快照的目录,比如
/opt/es_snapshots,给ES用户读写权限:chown elasticsearch:elasticsearch /opt/es_snapshots - 修改ES的配置文件
elasticsearch.yml,添加path.repo: ["/opt/es_snapshots"],然后重启ES服务 - 通过ES的API创建快照仓库:
curl -X PUT "http://内网ES地址:9200/_snapshot/local_repo?pretty" -H 'Content-Type: application/json' -d' { "type": "fs", "settings": { "location": "/opt/es_snapshots", "compress": true } } '
- 先在ES节点上创建一个存储快照的目录,比如
- 第二步:创建
helloworld索引的快照
执行命令生成快照,等待完成(可以用GET _snapshot/local_repo/helloworld_snap/_status查看进度):curl -X PUT "http://内网ES地址:9200/_snapshot/local_repo/helloworld_snap?wait_for_completion=true&pretty" -H 'Content-Type: application/json' -d' { "indices": "helloworld", "ignore_unavailable": true, "include_global_state": false } ' - 第三步:把快照文件上传到VPS
找一台内网里能访问外网的机器(比如某台传感器设备或者专门的运维机器),把快照目录打包:tar -czf helloworld_snap.tar.gz /opt/es_snapshots/,然后用scp传到VPS:scp helloworld_snap.tar.gz root@VPS_IP:/opt/es_snapshots/,在VPS上解压:tar -xzf helloworld_snap.tar.gz -C /opt/es_snapshots/ - 第四步:在VPS的ES上恢复快照
重复第一步的配置(创建目录、修改elasticsearch.yml、创建仓库),然后执行恢复命令:
如果需要自动化,可以写个shell脚本,定时执行快照、打包、上传,再在VPS上写脚本定时解压恢复(或者用rsync实时同步快照目录,然后触发恢复)。curl -X POST "http://localhost:9200/_snapshot/local_repo/helloworld_snap/_restore?pretty" -H 'Content-Type: application/json' -d' { "indices": "helloworld", "ignore_unavailable": true, "include_global_state": false } '
方案二:数据导出+上传+导入(适合小数据量,操作简单)
如果你的helloworld索引数据量不大(比如几百万条以内),用elasticdump工具会更灵活:
- 第一步:在内网可出网的机器上安装
elasticdump(需要先装Node.js)npm install -g elasticdump - 第二步:导出
helloworld索引到本地文件elasticdump --input=http://内网ES地址:9200/helloworld --output=./helloworld_data.json --limit=1000--limit参数控制每次导出的文档数,避免内存溢出,大索引可以分多次导出或者用分片模式。 - 第三步:上传导出文件到VPS
同样用scp或者其他文件传输工具把helloworld_data.json传到VPS。 - 第四步:在VPS上导入到ES
先在VPS上安装elasticdump,然后执行导入命令:
如果VPS的ES开启了认证,加上elasticdump --input=./helloworld_data.json --output=http://localhost:9200/helloworld--output-auth="用户名:密码"参数。
方案三:主动式Reindex同步(适合定时半自动化)
如果内网机器能直接访问VPS的ES端口(比如VPS的9200端口对外开放,且内网能出网到这个端口),可以用ES的_reindex API让内网ES主动把数据同步到VPS,还能定时执行:
- 第一步:测试内网到VPS ES的连通性
在内网机器上执行curl http://VPS_IP:9200,如果能返回ES的基本信息,说明可以用这个方案。 - 第二步:执行Reindex同步
在内网机器上执行命令:
如果不需要认证,去掉curl -X POST "http://内网ES地址:9200/_reindex?pretty" -H 'Content-Type: application/json' -d' { "source": { "index": "helloworld" }, "dest": { "index": "helloworld", "remote": { "host": "http://VPS_IP:9200", "username": "VPS_ES用户名", "password": "VPS_ES密码" } } } 'username和password字段。 - 第三步:定时同步
可以用Linux的crontab定时执行这个curl命令,比如每天凌晨2点同步一次:crontab -e # 添加下面一行 0 2 * * * curl -X POST "http://内网ES地址:9200/_reindex?wait_for_completion=true" -H 'Content-Type: application/json' -d'{"source":{"index":"helloworld"},"dest":{"index":"helloworld","remote":{"host":"http://VPS_IP:9200","username":"xxx","password":"xxx"}}}' > /var/log/es_sync.log 2>&1
注意事项
- 尽量保证内网ES和VPS ES的版本一致,避免快照恢复或数据同步时出现兼容性问题
- 如果VPS的ES对外开放端口,建议开启HTTP认证或者用Nginx反向代理做访问控制,避免数据泄露
- 大数据量下优先选快照方案,效率更高;小数据量可以用elasticdump或者Reindex
内容的提问来源于stack exchange,提问作者Sampad Mohanty
相关产品推荐
相关产品推荐

