Elasticsearch:为 snapshot 设置 NFS 共享

2022年8月25日   |   by mebius

管理存储库(存储数据的地方)是 Elasticsearchbackup 管理中最关键的部分。 由于其原生分布式架构,快照(snapshot)和恢复过程以集群方式设计。 在快照期间,分片被复制到定义的存储库。 如果此存储库是节点本地的,则备份数据分布在所有节点上。 出于这个原因,如果你有一个多节点集群,则必须拥有共享存储库存储。 一种常见的方法是使用 NFS,因为它很容易设置,而且是一种非常快速的解决方案(此外,可以使用标准的 Windows Samba 共享)。

更多关于 Snapshot 的知识,请参阅文章 “Elasticsearch:Cluster 备份 Snapshot 及 Restore API”。在我们今天的展示中,我将使用如下的架构:

%title插图%num

如上所示,在我的左边的 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 tgcode在回复之前将更改写入磁盘。 它提高了一致性,但降低了传输速度,
  • no_subtree_chectgcodek:禁用文件是否在导出的树中实际上仍然可用。 如果在客户端打开文件时重命名文件,这可能会导致许多问题。 在几乎所有情况下,最好禁用子树检查,
  • no_root_squash:默认情况下,NFS 将来自 root 用户的请求远程转换为服务器上的非特权用户。 no_root_squash 对某些共享禁用此行为。

要刷新保存共享导出的 NFS 表,必须执行以下命令tgcode

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).
#
#                
# / 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 配置中所述。

%title插图%num

你可以重新启动客户端计算机并再次登录,然后使用以下命令再次验证。

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
}

%title插图%num

我们可以通过如下的 _status 终点来查看当前的 snapshot 进度:

GET _snapshot/my_repository/snapshot_2/_status

%title插图%num

上面表明,我们已经成功地创建了一个叫做 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
}

%title插图%num

我们再使用如下的命令来查看 twitter 的内容:

GET twitter/_search

%title插图%num

从上面的搜索的结果中,我们可以看出来 twitter 已经成功地从 snapshot_2 中恢复出来了。这充分地说明了我们的 NFS 服务器是成功的。

我们可以在 NFS 服务器的目录中查看到有新的文件生成:

%title插图%num

参考:

【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:我的 Elasticsearch 集群中应该有多少个分片?

作者:Christian Dahlqvist 编者注:“每 GB 堆内存的目标是 20 个或更少分片” 的经验法则在 8.3 版中已弃用。 此博客已更新以反映新建议。 Elasticsearch 是一个非常通用的平台,它支持各种用例,并在数据组织和复制策tgc…