前言
Graylog中使用MongoDB存储配置数据,例如:用户信息、stream信息配置数据等,没有任何的日志数据是存储在MongoDB中的。我们比较关心的日志数据是存储在elasticsearch中,因此要做数据备份重要的是备份elasticsearch中的索引。
Elasticsearch数据的备份,可以使用snapshot API。这个会拿到集群当前的状态和数据然后保存在一个共享仓库里面,并且是增量备份。备份的第一个快照会拷贝一份完整的数据,而后续的快照则是保留已存快照和新数据之间的差异数据。随着你不时的对数据进行快照,备份也在增量的添加和删除。这意味着后续备份会相当快速,因为它们只传输很小的数据量。
要使用这个功能,你必须首先创建一个保存数据的仓库。有多个仓库类型可以供你选择:
1)共享文件系统,比如 NAS
2)Amazon S3
3)HDFS (Hadoop 分布式文件系统)
4)Azure Cloud
本文以下介绍的为创建共享的目录,作为备份数据的仓库,在创建的仓库中创建快照以备份数据。
信息汇总:
使用快照备份数据之前需要创建共享文件系统的仓库,本次使用sshfs在ES集群中每个节点的相同位置挂载一个共享目录,下面列出集群环境中各个节点中用于数据备份的目录及其作用。
IP | 目录 | 备注 |
---|---|---|
192.168.2.121 | /backup /esData/backup |
共享仓库目录 仓库目录 |
192.168.2.122 | /esData/backup | 仓库目录 |
192.168.2.123 | /esData/backup | 仓库目录 |
如上述表格所示,本次搭建3节点的elasticsearch集群。
各个节点的/esData/backup目录挂载到192.168.2.121的目录/backup,
最终所有节点的备份数据都将存储在192.168.2.121中的/backup目录中。后续如果需要做数据迁移,迁移192.168.2.121的目录/backup中的数据即可。
前期准备
创建并挂载共享目录
这里的共享目录是指集群中的每个节点都能感知并将数据写入到该仓库的文件。
安装sshfs
执行如下命令安装sshfs:
$ sudo yum install sshfs
至此,sshfs安装完成。
选定共享目录
- 选择在集群中一个节点上创建目录作为共享目录,本次选择
192.168.2.121
节点:$ sudo mkdir /backup
- 更改所属用户:
$ sudo chown -R monitorManager:monitorManager /backup
- 更改权限:
$ sudo chmod -R 777 /backup
创建仓库目录
- 在每个节点的相同位置创建目录:
$ sudo mkdir /esData $ sudo mkdir /esData/backup
- 更改所属用户:
$ sudo chown -R monitorManager:monitorManager /esData
- 更改权限:
$ sudo chmod -R 777 /esData
测试elasticsearch用户是否对创建的目录有写入权限
命令如下:
$ sudo -u elasticsearch touch /backup/test
$ sudo -u elasticsearch touch /esData/backup/test
每个节点挂载共享目录
- 将
/etc/fuse.conf
中的user_allow_other
注释去掉,否则下面的步骤2会有问题。 - 在每个节点中执行如下命令,将刚刚创建的目录挂载到共享目录上:
$ sshfs monitorManager@172.30.5.132:/backup /esData/backup -o allow_other
说明:其中参数-o allow_other
是为了解决不同节点往共享仓库中写数据的权限问题。
更改elasticsearch配置
更改elasticsearch配置文件
更改/etc/elasticsearch/elasticsearch.yml
文件,在文件末尾添加path.repo
配置仓库目录位置:
$ sudo vim /etc/elasticsearch/elasticsearch.yml
添加如下内容:
path.repo: /esData/backup
保存文件并退出编辑。
重启elasticsearch
重启elasticsearch节点:
$ sudo systemctl restart elasticsearch.service
开始你的备份
创建仓库
执行如下命令,创建一个仓库:
$ curl -XPUT 'http://192.168.2.121:9200/_snapshot/backup_1' -d '{
"type":"fs",
"settings":{
"location":"/esData/backup",
"compress":true
}
}'
说明:
- 给我们的仓库取一个名字,在本例它叫backup_1。
- 我们指定仓库的类型应该是一个共享文件系统。
- 最后,我们提供一个已挂载的设备作为目的地址,本例中位置为:/esData/backup。
- "compress":true代表压缩备份。
这步会在挂载点创建仓库和所需的元数据。
还有一些其他的配置你可能想要配置的,这些取决于你的节点、网络的性能状况和仓库位置: -
max_snapshot_bytes_per_sec
:当快照数据进入仓库时,这个参数控制这个过程的限流情况。默认是每秒20mb。 -
max_restore_bytes_per_sec
:当从仓库恢复数据时,这个参数控制什么时候恢复过程会被限流以保障你的网络不会被占满。默认是每秒20mb。
假设我们有一个非常快的网络,而且对额外的流量也很 OK,那我们可以增加这些默认值:
$ curl -XPOST 'http://192.168.2.121:9200/_snapshot/backup_1' -d '{
"type":"fs",
"settings":{
"location":"/esData/backup",
"max_snapshot_bytes_per_sec" : "50mb",
"max_restore_bytes_per_sec" : "50mb"
"compress":true
}
}'
注意:注意我们用的是 POST
而不是PUT
,POST
会更新已有仓库的设置。
查看仓库指定仓库:
$ curl -XGET 'http://192.168.2.121:9200/_snapshot/my_backup?pretty'
查看所有仓库:
$ curl -XGET 'http://192.168.2.121:9200/_snapshot?pretty'
或者
$ curl -XGET 'http://192.168.2.121:9200/_snapshot/_all?pretty'
说明:pretty
参数会让返回数据可读性提高,显示缩进,以json的格式返回到控制台。
快照索引
一个仓库可以包含同一个集群的多个快照。快照根据集群中的唯一名字进行区分。
快照所有打开的索引:
$ curl -XPUT 'http://192.168.2.121:9200/_snapshot/backup_1/snapshot_1?pretty&wait_for_completion=true'
这个会备份所有打开的索引到backup_1
仓库下一个命名为 snapshot_1
的快照里。wait_for_completion
参数指定创建snapshot的请求是否等待快照创建完成再返回。
快照指定索引:
$ curl -XPUT 'http://192.168.2.121:9200/_snapshot/backup_1/snapshot_2018_03_23' -d '{"indices":"test_28"}?pretty&wait_for_completion=true'
上面的命令快照了索引名为test_28
的索引,可以指定多个索引名称,如:"indices":"test_28,test_27,test_26"
监控快照进度:
$ curl -XGET 'http://192.168.2.121:9200/_snapshot/backup_1/snapshot_2018_03_23/_status?pretty'
wait_for_completion=true
只是显示基础信息,对于大型的集群备份时这个指标是不够用的,上面的_status
可以显示全面的信息,一个正在运行的快照会显示 IN_PROGRESS
作为状态。
INITIALIZING
分片在检查集群状态看看自己是否可以被快照。这个一般是非常快的。
STARTED
数据正在被传输到仓库。
FINALIZING
数据传输完成;分片现在在发送快照元数据。
DONE
快照完成!
FAILED
快照处理的时候碰到了错误,这个分片/索引/快照不可能完成了。检查你的日志获取更多信息。
查看指定快照:
例如,你想要查看backup_1
仓库中名为snapshot_2018_03_23
的快照,你就可以使用下面的命令。
$ curl -XGET 'http://172.30.5.133:9200/_snapshot/backup_1/snapshot_2018_03_23?pretty'
查看所有快照:
查看backup_1
仓库中的所有快照。
$ curl -XGET 'http://192.168.2.121:9200/_snapshot/backup_1/_all?pretty'
删除快照:
删除backup_1
仓库中的snapshot_1
的快照。
$ curl -XDELETE 'http://192.168.2.121:9200/_snapshot/backup_1/snapshot_1'
取消一个快照:
要取消一个快照,在他进行中的时候简单的删除快照就可以:
$ curl -XDELETE 'http://192.168.2.121:9200/_snapshot/backup_1/snapshot_1'
这个会中断快照进程,然后删除仓库里进行到一半的快照。
从快照恢复
一旦你备份过了数据,恢复它就简单了:只要在你希望恢复回集群的快照ID
后面加上_restore
即可。
快照恢复:
$ curl -XPOST 'http://192.168.2.121:9200/_snapshot/backup_1/snapshot_1/_restore?pretty&wait_for_completion=true'
默认情况下,把这个快照里存有的所有索引都恢复。如果 snapshot_1
包括五个索引,这五个都会被恢复到我们集群里。
此外,你可以指定索引名称恢复指定的索引,同样可以使用 include_global_state
选项来防止恢复集群的状态。 indices 支持配置多个索引multi index syntax.rename_pattern
和 rename_replacement
选项可以在恢复的时候使用正则表达式来重命名index
。例如:
$ curl -XPOST "192.168.2.121:9200/_snapshot/backup_1/snapshot_1/_restore" -d '{
"indices": "index_1,index_2",
"ignore_unavailable": "true",
"include_global_state": false,
"rename_pattern": "index_(.+)",
"rename_replacement": "restored_index_$1"
}'
说明:
- 只恢复
index_1、index_2
索引,忽略快照中存在的其余索引。 -
rename_pattern
查找所提供的模式能匹配上的正在恢复的索引。 -
rename_replacement
然后把它们重命名成替代的模式。
上述命令会恢复index_1
、index_2
到你及群里,但是重命名成了restored_index_1
、restored_index_2
。
取消快照恢复:
要取消一个恢复,你需要删除正在恢复的索引。 因为恢复进程其实就是分片恢复,发送一个 删除索引 API 修改集群状态,就可以停止恢复进程。比如:
$ curl XDELETE 'http://192.168.2.121:9200/restored_index_3'
如果restored_index_3
正在恢复中,这个删除命令会停止恢复,同时删除所有已经恢复到集群里的数据。
数据迁移
数据备份之后在共享目录/backup中是这样的:
- 在迁移目标的集群上重复上面创建仓库的步骤。
- 将源集群的备份内容(/backup里的所有文件),复制到迁移目标的集群仓库目录里。
- 在迁移目标集群上,使用RESTful API进行备份的恢复,如果索引已经存在目标的集群,需要先关闭索引,恢复数据后在开启。
$ curl XPOST 'http://ip:port/index_name/_close' $ curl XPOST 'http://ip:port/_snapshot/backup_1/snapshot_name/_restore' $ curl XPOST 'http://ip:port/index_name/open'
- 查看恢复状态
$ curl XGET 'http://ip:port/_snapshot/backup_1/snapshot_name/_status?pretty'
网友评论