Elasticsearch 集群备份指南

Oct 27, 2018
1591
#Elasticsearch#备份#恢复#backup

本文最近一次更新于 5 年 5 个月前,其中的内容很可能已经有所发展或是发生改变。

https://ae01.alicdn.com/kf/HTB1dou4aovrK1RjSspcq6zzSXXax.jpg

Elasticsearch 官方对其的定义是一种搜索引擎,但我更喜欢把它当作一种非关系型数据库来看待,而作为数据库来看待的话,保障其中数据的安全性和可靠性自然是重中之重了。

首先声明,本文对 Elasticsearch 数据的备份是基于官方提供的 API,其它的诸如 elasticsearch-dump等第三方工具暂且不谈。官方的提供的备份方式是一种 Snapshot,其中备份路径可以选择云端或本地,本文想就备份集群数据到本地写一份指南,并对遇到的问题做一些解答。

搭建集群文件系统

为了创建一个 Elasticsearch 集群的 Snapshot,首先必须先搭建一个集群文件系统,用以确保集群的所有节点对同一个目录具有操作权限——这里推荐使用 NFS(Network File System)。

NAS 需要指定集群的某一个节点的文件夹作为服务器来提供硬盘存储,也是 NAS 存储文件的实际位置,集群的其他节点作为客户端挂载服务端的共享文件夹。

安装

sudo apt install nfs-kernel-server # 服务端
sudo apt install nfs-common # 客户端

创建共享文件夹

这里是我踩的第一个坑。服务端的共享文件夹所有者必须也是运行 Elasticsearch 程序的用户,不然 Elasticsearch 是无法将数据备份到该文件夹的,比如运行 Elasticsearch 的用户是 els 的话,可以用如下命令来创建共享文件夹:

sudo -u els mkdir /path/to/backups -p

修改配置文件

在服务端的 /etc/exports 中添加以下内容:

/path/to/backups 192.168.1.1(insecure,rw,sync,no_subtree_check,no_root_squash,no_acl)

其中 192.168.1.1 就是服务器本机的 IP。括号内的是配置参数,稍稍解释一下:

  • insecure:允许客户端从大于 1024 的端口号连接。
  • rw:所有连接者都具有读写权限。
  • sync:将更改都提交到稳定存储之后再回复请求。
  • no_subtree_check:禁用子树检查。
  • no_root_squash:关闭 root 压缩。
  • no_acl:不要向客户端显示 ACLs。

更多的参数可以参考这里

生效配置

exportfs -r

这时你可以使用 showmount -e localhost 来查看本机的挂载情况:

/path/to/backups 192.168.1.1

客户端

注意,客户端也一定要使用运行 Elasticsearch 的用户的权限来创建相同的文件夹,这一点非常重要。然后把服务端的文件夹挂在到各个节点:

mount -t nfs 192.168.1.1:/path/to/backups /path/to/backups

没有报错的话,就挂载成功了。

Elasticsearch 配置

需在每一个节点的 elasticsearch.yml 中加上一行:

path.repo: ["/path/to/backups"]

然后重启 Elasticsearch。

这时就可以尝试创建一个 Snapshot 的仓库了:

PUT /_snapshot/my_backup
{
    "type": "fs",
    "setting": {
        "location": "/path/to/backups"
    }
}

如果没有报了权限错误的话,就 OK 了。

如果报了权限错误,请检查 Elasticsearch 对该文件夹是否具有写权限。如果确认具有写权限,那么就需要把集群各节点运行 Elasticsearch 的用户的 UID 和 GID 统一起来,具体做法见附录。这里是我踩的第二个坑。

创建一个备份

你可以以如下命令来创建一个备份:

PUT /_snapshot/my_backup/snap1?wait_for_completion=true
{
	"indices": "index_1,index_2"
}

其中 wait_for_completion 参数并不会马上返回结果,而是等备份完成之后再返回结果,如果备份的索引很多的话,可能会花费很多时间才返回,所以并不建议加上这个参数。可以为 PUT 加上请求体,指定索引,如上指定 index_1index_2 两个索引备份,如果不加请求体的话会默认备份全部索引。

当 Snapshot 正在生成中的时候,可以使用如下命令来获取备份的进度:

GET /_snapshot/my_backup/snap1

其返回的 state 项的值即是备份进度条。

Elasticsearch 是采取增量备份的形式,但需注意,Snapshot 不可重复创建,也就是说 Snapshot 的名字不能相同。

从备份中恢复

可采取如下命令从 Snapshot 中恢复:

POST /_snapshot/my_backup/snap1/_restore

默认所有的索引都会恢复,当然你也可以指定索引:

POST /_snapshot/my_backup/snap1._restore
{
    "indices": "index_1,index_2"
}

而有关恢复的进度,Elasticsearch 并不提供查询像备份进度那样的 API,所以只能使用 indices recoverycat recovery来查询恢复进度。

与备份和恢复更详细的讲解请参照官方文档

附:更改 UID 和 GID 的方法

首先假设各节点运行 Elasticsearch 的用户名为 els。先假设:他的旧 UID 为 1005,旧 GID 为 2000,要把他改成 UID 为 2005,GID 为 3000 的新用户。

首先为 els 更改新的 UID 和 GID:

sudo usermod -u 2005 els
sudo groupmod -g 3000 els

这就算完成了,可以用 id els 命令来查看用户的 UID 和 GID 是否被成功更改。

当然,这只是把用户名的 UID 和 GID 做了简单的更改,还需要把原用户的所有文件、目录的所有者都改成新的,不然是无法成功运行 Elasticsearch 的,会报权限错误。

以下命令来更改:

sudo find / -group 2000 -exec chgrp -h els {} \;
sudo find / -user 1005 -exec chown -h els {} \;

其中 -exec 参数对每个文件执行 chgrpchown 命令。-h 参数是对符号链接起作用,而不是应用文件。

参考:

Elasticsearch 集群备份指南

https://blog.itswincer.com/posts/92d76830/

作者

Wincer

更新于

Oct 27, 2018

许可协议

CC BY-NC-ND 4.0
  1. Apr 5, 2023

    OpenCore 引导安装 macOS Ventura 教程
  2. Dec 10, 2022

    我最近订阅的一些软件服务
  3. Jul 2, 2022

    从一次 DNS 流量测试说起
  4. Nov 27, 2021

    我的 FreeBSD 服务器配置
  5. Sep 29, 2020

    Python 并发之痛:线程,协程?
  6. Jan 30, 2020

    累加器引发的一点思考