Elasticsearch:为 snapshot 设置 NFS 共享
Posted Elastic 中国社区官方博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch:为 snapshot 设置 NFS 共享相关的知识,希望对你有一定的参考价值。
管理存储库(存储数据的地方)是 Elasticsearchbackup 管理中最关键的部分。 由于其原生分布式架构,快照(snapshot)和恢复过程以集群方式设计。 在快照期间,分片被复制到定义的存储库。 如果此存储库是节点本地的,则备份数据分布在所有节点上。 出于这个原因,如果你有一个多节点集群,则必须拥有共享存储库存储。 一种常见的方法是使用 NFS,因为它很容易设置,而且是一种非常快速的解决方案(此外,可以使用标准的 Windows Samba 共享)。
更多关于 Snapshot 的知识,请参阅文章 “Elasticsearch:Cluster 备份 Snapshot 及 Restore API”。在我们今天的展示中,我将使用如下的架构:
如上所示,在我的左边的 Ubuntu OS 上,我安装 Elasticsearch 及 Kibana,而在右边的 Ubuntu OS 上我安装 NFS。在实际的使用中,你可以是针对一个多个节点的集群而不是如上所示的仅有一个 Elasticsearch 节点。这样才能展示 NFS 服务器的优点。
在今天的展示中,我将使用最新的 Elastic Stack 8.3 来进行展示。
安装
Elasticsearch 及 Kibana
你可以参考我之前的文章来安装 Elasticsearch 及 Kibana:
请参考上面文章中的 Elastic Stack 8.x 的安装。
NFS Server
我们在 Ubuntu OS 的机器上按照如下的步骤来进行安装:
sudo apt-get update
sudo apt-get install nfs-kernel-server
安装包后,创建一个在所有客户端之间共享的目录:
sudo mkdir /mnt/shared-directory
将此目录的访问权限授予 nobody 用户和 nogroup 组。 none 和 nogroup 是用于允许共享读/写权限的特殊用户/组值。 要应用它们,你需要 root 访问权限。 执行以下命令:
sudo chown -R nobody:nogroup /mnt/shared-directory
为了让我们的共享目录有更大的访问权限(在我练习的时候,有 access denied 错误),我们执行如下的命令:
sudo chmod 777 -R /mnt/shared-directory/
然后,我们需要配置 NFS exports,我们可以在其中指定该目录将与某些机器共享。 编辑 /etc/exports 文件 (sudo nano /etc/exports),并添加以下行,其中包含要共享的目录以及允许访问导出目录的客户端 IP 列表:
/etc/exports
liuxg@liuxgu:~$ pwd
/home/liuxg
liuxg@liuxgu:~$ cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
/mnt/shared-directory 192.168.0.8(rw,sync,no_root_squash,no_subtree_check)
#192.168.0.50(rw,sync,no_subtree_check)
#192.168.0.51(rw,sync,no_subtree_check)
在这里,我们对两个目录使用相同的配置选项,但 no_root_squash 除外。 让我们来看看每个选项的含义:
- rw:客户端可以读写文件,
- sync:此选项强制 NFS 在回复之前将更改写入磁盘。 它提高了一致性,但降低了传输速度,
- no_subtree_check:禁用文件是否在导出的树中实际上仍然可用。 如果在客户端打开文件时重命名文件,这可能会导致许多问题。 在几乎所有情况下,最好禁用子树检查,
- no_root_squash:默认情况下,NFS 将来自 root 用户的请求远程转换为服务器上的非特权用户。 no_root_squash 对某些共享禁用此行为。
要刷新保存共享导出的 NFS 表,必须执行以下命令:
sudo exportfs -a
最后,我们可以通过运行以下命令来启动 NFS 服务:
sudo service nfs-kernel-server start
NFS 服务器启动并运行后,我们需要配置客户端。 我们将在每个 Elasticsearch 节点内重复以下步骤:
1)在 Elasticsearch 节点中安装 NFS 客户端:
sudo apt-get update
sudo apt-get install nfs-common
2)现在,在客户端机器上创建一个目录,我们将尝试挂载远程共享目录:
sudo mkdir /mnt/nfs
sudo mount 192.168.0.4:/mnt/shared-directory /mnt/nfs
请注意上面的 IP 地址是 NFS 服务器的地址。
3)如果一切正常,我们可以将挂载目录添加到我们的 /etc/fstab 节点文件中。 这是为了在下次启动时挂载它:
4)然后,将以下行添加到此文件中:
/etc/fstab
parallels@liuxg:~$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/732910d6-ddae-4a95-ab9e-9f5c9edc555a / ext4 defaults 0 0
# /boot/efi was on /dev/sda1 during curtin installation
/dev/disk/by-uuid/6498-78BB /boot/efi vfat defaults 0 0
/swap.img none swap sw 0 0
#192.168.0.4:/mnt/shared-directory /mnt/nfs/ nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
192.168.0.4:/mnt/shared-directory /mnt/nfs/ nfs4 rw,_netdev,tcp 0 0
我们保存好上面的文件。接下来我们来验证一下 /etc/fstab 的配置是否正确。我们可以在 NFS 运行的电脑上的目录中创建如下的一个文件:
liuxg@liuxgu:/mnt$ pwd
/mnt
liuxg@liuxgu:/mnt$ ls
data shared-directory
liuxg@liuxgu:/mnt$ cd shared-directory/
liuxg@liuxgu:/mnt/shared-directory$ ls
a
liuxg@liuxgu:/mnt/shared-directory$ sudo touch b
liuxg@liuxgu:/mnt/shared-directory$ ls
a b
在上面,我们创建了一个叫做 b 的文件。我们在运行 Elasticsearch 的 Ubuntu OS 中进行如下的查看:
parallels@liuxg:/mnt/nfs$ pwd
/mnt/nfs
parallels@liuxg:/mnt/nfs$ ls -al
total 8
drwxr-xr-x 2 nobody nogroup 4096 Jul 7 11:56 .
drwxr-xr-x 4 root root 4096 Jul 7 08:44 ..
-rw-r--r-- 1 root root 0 Jul 7 11:48 a
-rw-r--r-- 1 root root 0 Jul 7 11:56 b
从上面,我们可以看出来,最新被创建的文件 b 已经被列出来了。
我们也可以使用如下的命令来进行验证:
sudo umount -R /mnt/nfs
执行以下命令将所有可用的文件系统挂载到 /etc/fstab 配置文件中。
parallels@liuxg:~$ sudo umount -R /mnt/nfs
parallels@liuxg:~$ sudo mount -a
确保你没有任何错误。现在运行以下命令以显示所有已挂载的文件系统
df -h
如果你的配置正确,你将看到 NFS 服务器已安装到目标目录,如 /etc/fstab 配置中所述。
你可以重新启动客户端计算机并再次登录,然后使用以下命令再次验证。
df -h
你将看到 NFS 服务器在系统启动时通过 /etc/fstab 文件在客户端机器上自动启动。
5)我们可以更新 path.repo 的 Elasticsearch 节点配置(config/elasticsearch.yml)如下:
config/elasticsearch.yml
path.repo: /mnt/nfs
6)重新启动所有 Elasticsearch 节点后,我们可以使用单个标准存储库创建调用在集群上创建共享存储库:
我们首先在 NFS 运行的机器中创建一个如下的目录:
liuxg@liuxgu:/mnt/shared-directory$ pwd
/mnt/shared-directory
liuxg@liuxgu:/mnt/shared-directory$ sudo mkdir -p my_repository
[sudo] password for liuxg:
PUT /_snapshot/my_repo
"type": "fs",
"settings":
"location": "/mnt/nfs/my_repository",
"compress": true
上面的命令将返回如下的结果:
"acknowledged": true
它表明我们的配置是成功的。
我们使用如下的命令来检查 my_repo 的状态:
POST _snapshot/my_repo/_verify
展示 Snapshot
我们首先来创建如下的一个 twitter 索引:
PUT twitter/_doc/1
"content": "This is from Xiaoguo, Liu"
我们使用如下的命令来对 twitter 进行 snapshot:
PUT _snapshot/my_repo/snapshot_2
"indices": "twitter",
"ignore_unavailable": true,
"include_global_state": true
我们可以通过如下的 _status 终点来查看当前的 snapshot 进度:
GET _snapshot/my_repository/snapshot_2/_status
上面表明,我们已经成功地创建了一个叫做 snapshot_2 的快照。我们接下来删除之前的 twitter 索引:
DELETE twitter
这样在我们的 Elasticsearch 中将不再含有 twitter 这个索引。我们现在尝试从 snapshot_2 来恢复 twitter 这个索引:
POST _snapshot/my_repo/snapshot_2/_restore
"indices": "twitter",
"ignore_unavailable": true,
"include_global_state": false
我们再使用如下的命令来查看 twitter 的内容:
GET twitter/_search
从上面的搜索的结果中,我们可以看出来 twitter 已经成功地从 snapshot_2 中恢复出来了。这充分地说明了我们的 NFS 服务器是成功的。
我们可以在 NFS 服务器的目录中查看到有新的文件生成:
参考:
【1】 How to Install and Configure NFS Server on Debian 11
【2】Elasticsearch: Snapshot Backups on a Shared NFS - OctoPerf
【3】How To Set Up an NFS Mount on Ubuntu 18.04 | DigitalOcean
以上是关于Elasticsearch:为 snapshot 设置 NFS 共享的主要内容,如果未能解决你的问题,请参考以下文章
[Elasticsearch实战] snapshot restore 备份还原