Elasticsearch 提供了 replica 解决方案,它可以帮我们解决了如果有一个或多个 node 失败了,那么我们的数据还是可以保证完整的情况,并且搜索还可以继续进行。但是,有一种情况是我们的所有的 node,或者有一部分 node 失败,可能会造成我们的数据的丢失。也就是说 replca 不能提供一种灾难性的保护机制。我们需要一种完整的备份机制。
Snapshot 及 Restore
在 Elastic 里,提供了一个叫做 snapshot 及 restore API 的接口。可以使用数据和状态快照备份您的 Elasticsearch 索引和集群。快照很重要,因为快照会在出现问题时提供数据的副本。如果需要回滚到旧版本的数据,则可以从存储库中还原快照。快照中的数据是增量进行了,即当前快照里面某个index的数据不在比它早的快照数据中,因此可以多次进行快照操作,而不用担心占用过多存储空间。
Restore 到一个新的 cluster
ELK集群间数据迁移,我们可以恢复从另外一个 cluster 中备份的 snapshot 到当前的 cluster 中来。我们必须在新的 cluster 中注册这个 repository 才可以进行下面的操作。
快照的流程
客户端请求->协调节点->主节点->[数据节点1,数据节点2…数据节点n],快照涉及3类型节点;
协调节点:接收客户端请求,转发到主节点。
主节点:将创建快照相关的请求信息放到集群状态中广播下去,数据节点收到后执行数据复制;主节点同时负责在仓库中写入集群状态数据。
数据节点:由于数据发布在各个节点,因此复制操作必须由数据节点执行,每个数据节点将快照请求中本地存储的主分片复制到仓库。
Repository (存储库)
支持存储库类型
Respository | 配置类型 |
---|---|
Shared file system | "type": "fs" |
Read-only URL | "type": "url" |
S3 | "type": "s3" |
HDFS | "type": "hdfs" |
Azure | "type": "azure" |
Google Cloud Storage | "type": "gcs" |
存储库插件
repository-s3支持s3存储库
在Hadoop环境中支持hdfs存储库
存储库azure for azure存储库
存储库gcs for Google云存储库
集群主机
hostname | ip | |
---|---|---|
elk-node1 | 192.168.10.235 | es 7.5 |
elk-node2 | 192.168.10.236 | es 7.5 |
nfs-server | 192.168.250.252 |
NFS 服务器
在集群环境中,每台主机相同用户账号,但是分配的uid/gid是不同的。当多主机后端的存储为同一个共享存储,这时就会遇到一个问题,NFS协议是通过uid来控制文件读写权限的,主机中用户写入的文件uid与其他主机不同,就无法被其他主机读取或修改,出现权限错误的问题。NFS Server 服务器 elasticsearch 用户的uid和gid 和ELK 集群服务器的elasticsearch 用户的uid和gid保持一致。
创建用户
useradd -u 997 -s /sbin/nologin -M elasticsearch
-u : 指定用户uid
-M: --no-create-home 不创建用户home目录
-s : --shell 指定用户的shell
修改用户id和组id
usermod -u 997 elasticsearch
groupmod -g 995 elasticsearch
或通过配置文件修改用户id和组id
[root@nfs-server /]# cat /etc/passwd |grep elasticsearch
elasticsearch:x:997:995:elasticsearch user:/nonexistent:/sbin/nologin
[root@nfs-server /]# cat /etc/group |grep elasticsearch
elasticsearch:x:995
创建 nfs 共享目录
mkdir /data/nfschown -R elasticsearch:elasticsearch /mnt/public
编辑 nfs 配置文件
[root@nfs-server /]# vim /etc/exports/mnt/public 192.168.10.0/255.255.255.0(rw,sync,all_squash,anonuid=997,anongid=995)
查看当前配置为nfs共享的目录及其状态
[root@nfs-server /]# exportfs -rv
exporting 192.168.10.0/255.255.255.0:/mnt/public
Elasticsearch 配置
修改es 集群配置文件,添加存储库文件路径
[root@elk-node1 /]# cat /etc/elasticsearch/elasticsearch.yml |grep path.repo
path.repo: /repository
[root@elk-node2 ~]# cat /etc/elasticsearch/elasticsearch.yml |grep path.repo
path.repo: /repository
修改存储库目录属性
chown -R elasticsearch:elasticsearch /repository
elk-node1和elk-node2 挂载nfs 目录
mount -t nfs 192.168.250.252:/mnt/public /repositor
开机挂载NFS目录
#编辑fstab文件
cat /etc/fstab |grep nfs
192.168.250.252:/mnt/public /repository nfs4 defaults 0 0
#验证fstab是否写正确
mount -a
创建共享文件系统存储库
存储库名称为repository ,路径为 /repository
curl -XPUT -uelastic:TcqinZLhbJDFFgCqXF8r http://192.168.10.235:9200/_snapshot/repository -H "Content-Type: application/json" -d '
> {
> "type": "fs",
> "settings": {
> "location": "/repository",
> "max_restore_bytes_per_sec":"10mb",
> "compress":"true",
> "max_snapshot_bytes_per_sec":"10mb",
> "chunk_size":"100mb"
> }
> }'
参数介绍
{
"type": "fs",
"settings": {
"location": "/repository", #存储库位置,要和配置文件里一致用户组是es
"max_restore_bytes_per_sec":"10mb", #恢复最大速率
"compress":"true", #是否压缩
"max_snapshot_bytes_per_sec":"10mb", #创建最大速率
"chunk_size":"100mb" #压缩块大小
}
验证存储库
curl -XGET -uelastic:TcqinZLhbJDFFgCqXF8r http://192.168.10.235:9200/_snapshot/
备份索引
1,备份指定索引
存储库为repository ,快照名称为networklogs-11
curl-XPUT-uelastic:TcqinZLhbJDFFgCqXF8r http://192.168.10.235:9200/_snapshot/repository/networklogs-11?wait_for_completion=true -H "Content-Type: application/json" -d '
{
"indices": "networklogs-2020.11.*"
}'
2,备份全部索引
存储库为repository ,快照名称为123
curl-XPUT-uelastic:TcqinZLhbJDFFgCqXF8r http://192.168.10.235:9200/_snapshot/repository/123?wait_for_completion=true -H "Content-Type: application/json"
验证备份快照
存储库为repository ,快照名称为123
curl-XGET-uelastic:TcqinZLhbJDFFgCqXF8r http://192.168.10.235:9200/_snapshot/repository/123
数据恢复到集群中
1、恢复单条索引
curl-XPOST-uelastic:TcqinZLhbJDFFgCqXF8r http://192.168.10.235:9200/_snapshot/repository/123/_restore -H "Content-Type: application/json" -d ' { "networklogs-*" }'
2、恢复全部索引
curl-XPOST-uelastic:TcqinZLhbJDFFgCqXF8r http://192.168.10.235:9200/_snapshot/repository/123/_restore -H "Content-Type: application/json"
3、恢复全部索引重命名索引
curl-XPOST-uelastic:TcqinZLhbJDFFgCqXF8r http://192.168.10.235:9200/_snapshot/repository/test-oxozjloutnawtrcaxggbbw/_restore -H "Content-Type: application/json" -d '{ "ignore_unavailable": "true", "include_global_state": false, "include_aliases": false, "partial": "false", "rename_pattern": "networklogs", "rename_replacement": "345"}'
4、恢复指定索引指定参数
curl-XPOST-uelastic:TcqinZLhbJDFFgCqXF8r http://192.168.10.235:9200/_snapshot/repository/123/_restore -H "Content-Type: application/json" -d '{ "indices": "networklogs-2020.11.24,networklogs-2020.11.25", "index_settings": { "index.number_of_replicas": 1 }, "ignore_unavailable": "true", "include_global_state": false, "include_aliases": false, "partial": "false", "rename_pattern": "networklogs", "rename_replacement": "678"}'
删除快照
curl-XDELETE-uelastic:TcqinZLhbJDFFgCqXF8r http://192.168.10.235:9200/_snapshot/repository/networklogs-11
查看集群索引
curl -u elastic:TcqinZLhbJDFFgCqXF8r http://192.168.10.235:9200/_cat/indices | sort
命令行API操作繁琐,下面介绍如何使用Kibana Web 界面 实现快照存储库的相关操作
注册存储库
编辑存储库
验证存储库
创建策略
查看策略
查看快照
快照恢复
快照恢复参数
执行还原
查看还原操作
创建快照恢复索引名称
查看快照恢复数据
官方文档
https://www.elastic.co/guide/en/elasticsearch/reference/7.5/snapshot-restore.html