elasticsearch:为snapshot设置nfs共享(代码片段)

Elastic中国社区官方博客 Elastic中国社区官方博客     2022-11-29     153

关键词:

管理存储库(存储数据的地方)是 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常用命令

#查看所有的快照curl-XGETlocalhost:9200/_snapshot/仓库名/_all#查看快照信息curl-XGETlocalhost:9200/_snapshot/仓库名/snapshot_name/_status#删除快照curl-XDELETE"localhost:9200/_snapshot/仓库名/snapshot_name"#生成快照  curl-XPUT-uelast 查看详情

《elasticsearch源码解析与优化实战》第13章:snapshot模块分析(代码片段)

文章目录简介仓库共享文件系统快照创建快照获取快照信息快照status取消、删除快照和恢复操作从快照恢复部分恢复恢复过程中更改索引设置监控恢复进度创建快照的实现原理Lucene文件格式简介1.定义2.分段3.文件命名规则4.文件... 查看详情

《elasticsearch源码解析与优化实战》第13章:snapshot模块分析(代码片段)

文章目录简介仓库共享文件系统快照创建快照获取快照信息快照status取消、删除快照和恢复操作从快照恢复部分恢复恢复过程中更改索引设置监控恢复进度创建快照的实现原理Lucene文件格式简介1.定义2.分段3.文件命名规则4.文件... 查看详情

elasticsearch快照和恢复

首先,这是官方介绍:https://www.elastic.co/guide/en/elasticsearch/reference/5.5/modules-snapshots.html#_snapshot第一步:先创建一个快照仓库,使用API创建PUT /_snapshot/esbackup{  "type":"fs"  , "setti 查看详情

elasticsearch的备份迁移方案

使用插件repository-hdfs插件进行测试下载地址:https://oss.sonatype.org/content/repositories/snapshots/org/elasticsearch/elasticsearch-repository-hdfs/https://oss.sonatype.org/content/repositories/snapshots/org/elasti 查看详情

使用 kibana 或 Elasticsearch 本身将保留天数设置为 Elasticsearch 索引

】使用kibana或Elasticsearch本身将保留天数设置为Elasticsearch索引【英文标题】:SetretentiondaystoaElasticsearchindices,usingkibanaorElasticsearchitself【发布时间】:2022-01-2010:10:15【问题描述】:我有一些索引必须应用保留策略。Indice-a-date_of_creat... 查看详情

Elasticsearch:何时将 omit_norms 选项设置为 false

】Elasticsearch:何时将omit_norms选项设置为false【英文标题】:Elasticsearch:whentosetomit_normsoptionasfalse【发布时间】:2013-12-1122:12:13【问题描述】:elasticsearch中omit_norms选项的一个好的用例是什么?我在es网站上找不到足够的解释。【问... 查看详情

maven中snapshot快照库和release发布库的区别和作用

...<version>1.1.1</version>;a3.对外发布应使用release版本.snapshot版本:b1.设置pom中版本号为发布版本+-SNAPSHOT,例:<version>1.1.0-SNAPSHOT</version>;b2.能解决多项目协同开发问题;b3.项目开发应使用snapshot版本.参考技术Arelease版本:a1... 查看详情

快照操作

声明esimportelasticsearch6es= elasticsearch6("10.10.10.10:9200")#查看当前所有仓库es.snapshot.get_repository()#删除已存在的仓库(假设已存在的仓库叫"beifen")es.snapshot.delete_repository("beifen")#创建一个新的仓库printnew_es.snapshot.create_repository("20200515",... 查看详情

解决elasticsearch集群unassignedshards无法reroute的问题

...是在做上述操作的过程中,我已经将所有配置调整,并将elasticsearch集群升级,新增了两台服务器,将服务器修改为如下节点:但是报错日志中还是node8,这证明可能是上次宕机直接导致了副本文件不可用,无法进行reroute.现在查... 查看详情

干货|elasticsearchreindex性能提升10倍+实战(转)

...速率极慢,是否有办法改善?以下问题来自社区:https://elasticsearch.cn/question/3782问题1:reindex和snapshot的速率极慢,是否有办法改善?reindex和snapshot的速率比用filebeat或者kafka到es的写入速率慢好几个数量级(集群写入性能不存在瓶... 查看详情

为啥要在设置 TRANSACTION ISOLATION LEVEL SNAPSHOT 之前检查 TRANCOUNT

】为啥要在设置TRANSACTIONISOLATIONLEVELSNAPSHOT之前检查TRANCOUNT【英文标题】:WhycheckTRANCOUNTbeforesettingTRANSACTIONISOLATIONLEVELSNAPSHOT为什么要在设置TRANSACTIONISOLATIONLEVELSNAPSHOT之前检查TRANCOUNT【发布时间】:2021-04-1318:25:34【问题描述】:在使... 查看详情

es数据迁移_snapshot(不需要安装其他软件)(代码片段)

参考文章:三种常用的Elasticsearch数据迁移方案ES基于Snapshot(快照)的数据备份和还原CDH修改ElasticSearch配置文件不生效问题目录1、更改老ES和新ES的config/elasticsearch.yml2、重启老ES,在老ES执行Postman中创建备份目录... 查看详情

elasticsearch中_source字段

...存储的是索引的原始内容,那store属性的设置是为何呢?elasticsearch为什么要把store的默认取值设置为no?设置为yes是否是重复的存储呢?  我们将一个field的值写入elasticsearch中,是想在这个field上执行search操作。但是,如果不显... 查看详情

snapshot.hasData 为 true 但 snapshot.data.length 为空,Flutter

】snapshot.hasData为true但snapshot.data.length为空,Flutter【英文标题】:snapshot.hasDataistruebutthesnapshot.data.lengthisnull,Flutter【发布时间】:2021-07-0710:58:21【问题描述】:我正在从返回一些数据的组件调用API,但问题是snapshot.hasData是true但sna... 查看详情

elasticsearch索引快照

参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/5.1/modules-snapshots.html备份数据之前,要创建一个仓库来保存数据,仓库的类型支持Sharedfilesystem,AmazonS3,HDFS和AzureCloud。fs仓库示例:需要在elasticsearch.yml添加如下配置:path.repo: 查看详情

elasticsearch系列备份

快照备份1.创建文件仓库1.1在$ELASTICSEARCH_HOME/config/elasticsearch.yaml中增加配置#这个路径elasticsearch必须有权限访问,这个路径是所有快照仓库的根路径path.repo:your_path1.2调用restapi//nlp_defect是你仓库的名称puturl/_snapshot/nlp_defect{ "type... 查看详情

es索引迁移snapshot-迁移部分索引

...61192.168.40.62192.168.40.63生产需要额外,挂载硬盘SnapshotAPI是Elasticsearch用于对数据进行备份和恢复的一组API接口,可以通过SnapshotAPI进行跨集群的数据迁移,原理就是从源Elastics 查看详情