Elasticsearch7.2中文教程翻译(十二): 迁移、备份数据

@高效码农  August 15, 2019

备份集群

您无法通过简单地获取其所有节点的数据目录的副本来备份Elasticsearch集群。Elasticsearch可能正在运行时更改其数据目录的内容; 复制其数据目录不能期望捕获其内容的一致图像。如果您尝试从此类备份还原群集,则可能会失败并报告损坏和/或丢失的文件。或者,虽然它默默地丢失了一些数据,但它似乎已经成功了。备份群集的唯一可靠方法是使用快照和还原功能。

注意:这里说的是集群,暂时不确定单机ES是否支持靠背data文件夹的方式备份和迁移。关注本被博客,随后会测试并在生产环境迁移。

一、备份集群的数据

与存储数据的任何软件一样,定期备份数据非常重要。Elasticsearch副本在运行时提供高可用性; 它们使您能够容忍零星的节点丢失,而不会中断服务。

但是,副本不能提供灾难性故障保护。为此,您需要对群集进行真正的备份 - 一个完整的副本,以防出现问题。

要备份群集的数据,可以使用快照API。

快照是从正在运行的Elasticsearch集群中获取的备份。您可以拍摄单个索引或整个群集的快照,并将其存储在共享文件系统的存储库中,并且有一些插件支持S3,HDFS,Azure,Google云存储等上的远程存储库。

快照以递增方式拍摄。这意味着,当它创建索引的快照时,Elasticsearch避免复制已存储在存储库中的任何数据,作为同一索引的早期快照的一部分。因此,非常频繁地拍摄群集的快照会很有效。

如果您的集群启用了Elasticsearch安全特性,那么在备份数据时必须授权快照API调用。

snapshot_user角色是一个保留角色,可以分配给调用快照端点的用户。如果用户所做的只是将定期快照作为备份过程的一部分,那么这是惟一必要的角色。这个角色包括列出所有现有快照(任何存储库)的特权,以及列出和查看所有索引的设置,包括.security索引。它不授予在索引中创建存储库、恢复快照或搜索的特权。因此,用户可以查看和快照所有索引,但不能访问或修改任何数据。

二、备份集群的配置

除了备份集群中的数据之外,备份其配置也很重要——尤其是当集群变得很大且难以重构时。

配置信息驻留在每个集群节点上的常规文本文件中。敏感的设置值(如监视程序通知服务器的密码)在一个二进制安全容器elasticsearch中指定。密钥存储库文件。一些设置值是相关配置数据的文件路径,比如ingest geo ip数据库。所有这些文件都包含在ES_PATH_CONF目录中。

所有对配置文件的更改都是通过手动编辑文件或使用命令行实用程序完成的,但不是通过api。实际上,在初始设置之后,这些更改并不频繁。

我们建议您使用您选择的文件备份软件定期(理想情况下,每天)备份您的Elasticsearch配置($ES_PATH_CONF)目录。

我们建议您为这些配置文件制定一个配置管理计划。您可能希望将它们签入版本控制,或者通过您选择的配置管理工具提供它们。

其中一些文件可能包含敏感数据,例如密码和TLS密钥,因此您应该研究您的备份软件和/或存储解决方案是否能够加密这些数据。

配置文件中的一些设置可能被集群设置覆盖。通过为快照API指定include_global_state: true(默认)参数,可以在数据备份快照中捕获这些设置。或者,您可以使用get settings API以文本格式提取这些配置值:

GET _cluster/settings?pretty&flat_settings&filter_path=persistent

您可以将它的输出与其他配置文件一起存储为一个文件。

  • 暂存状态不考虑备份。
  • Elasticsearch安全功能将配置数据(如角色定义和API密钥)存储在专用特殊索引中。此“系统”数据补充了安全设置配置,也应进行备份。
  • 其他弹性堆栈组件(如Kibana和机器学习)将其配置数据存储在其他专用索引中。从Elasticsearch的角度来看,这些只是数据,因此您可以使用常规数据备份过程。

三、备份群集的安全配置

安全配置信息位于两个位置: 文件和 索引。

备份基于文件的安全配置
Elasticsearch安全功能所使用的配置xpack.security命名空间内elasticsearch.yml和 elasticsearch.keystore文件。此外,同一 目录中还有其他几个 额外的配置文件ES_PATH_CONF。这些文件定义角色和角色映射并 配置文件领域。某些设置指定安全敏感数据的文件路径,例如HTTP客户端的TLS密钥和证书以及SAML,OIDC和 Kerberos域的节点间通信和私钥文件 。所有这些都存储在里面 ES_PATH_CONF; 路径设置是相对的。

elasticsearch.keystore, TLS keys 和 SAML, OIDC, 和 Kerberos realms领域私钥文件需要保密性。当文件被复制到备份位置时,这是至关重要的,因为这会增加恶意窥探的可能性。

要备份所有此配置,您可以使用传统的基于文件的备份。

  • 文件备份必须在每个群集节点上运行。
  • 文件备份也将存储非安全配置。不支持仅备份安全功能配置。备份是完整配置状态的时间点记录。

备份基于索引的安全配置
Elasticsearch安全功能将系统配置数据存储在专用索引中。此索引.security-6Elasticsearch 6.x版本和 .security-77.x版本中命名。该.security别名总是指向适当的索引。该指数包含了这是不是在配置文件中可用,数据不能可靠地备份使用标准的文件系统工具。该数据描述:

  • 本机领域中用户的定义(包括散列密码)
  • 角色定义(通过create roles API定义)
  • 角色映射(通过create role mappings API定义 )
  • 应用程序权限
  • API密钥

在.security这样索引中包含的资源和定义除配置信息。完整的安全功能备份中需要所有这些信息。

使用标准Elasticsearch快照功能进行备份 .security,就像使用任何其他数据索引一样。为方便起见,这里是完整的步骤:

1、创建可用于备份.security索引的存储库。最好为此特殊索引提供专用存储库。如果您愿意,还可以将其他Elastic Stack组件的系统索引快照到此存储库。

PUT /_snapshot/my_backup
{
  "type": "fs",
  "settings": {
    "location": "my_backup_location"
  }
}

调用此API的用户必须具有提升的manage集群特权,以防止非管理员窃取数据。

2、创建一个用户,并仅为其分配内置的snapshot_user角色。

下面的例子在本地域中创建了一个新的用户snapshot_user,但是用户属于哪个域并不重要:

POST /_security/user/snapshot_user
{
  "password" : "secret",
  "roles" : [ "snapshot_user" ]
}
``
3、创建授权为snapshot_user的增量快照。

下面的示例展示了如何使用create snapshot API将.security索引备份到my_backup存储库:

PUT /_snapshot/my_backup/snapshot_1
{
"indices": ".security",
"include_global_state": true
}

> 此参数值捕获存储在全局集群元数据中的所有持久性设置,以及其他配置(如别名和存储的脚本)。注意,这包括非安全性配置,并且它补充了文件系统配置文件备份,但不替换。

> 索引格式只能在一个主要版本中兼容,并且不能还原到比原始版本更早的版本上。例如,您可以将安全快照从6.6.0恢复到6.7.0集群中,但是不能将其恢复到运行Elasticsearch 6.5.0或7.0.0的集群中。

控制对备份库的访问
---------

安全索引的快照通常包含敏感数据,例如用户名和密码哈希值。由于密码是使用加密哈希存储的 ,因此快照的披露不会自动使第三方能够作为您的某个用户进行身份验证或使用API​​密钥。但是,它会泄露机密信息。

在需要还原这些备份时,保护这些备份的完整性也很重要。如果第三方能够修改存储的备份,则他们可能能够安装后门,如果将快照加载到Elasticsearch集群中,则会授予访问权限。

我们建议您:

- .security在专用存储库中快照索引,严格限制和审核读写访问。
- 如果有迹象表明已读取快照,请更改本机领域中用户的密码并撤消API密钥。
- 如果有迹象表明快照已被篡改,请不要将其恢复。目前,还原选项无法检测恶意篡改。












评论已关闭