ES 数据没了?谁动了我的数据?

背景

我们在使用 Elasticsearch 的时候,可能会遇到数据“丢”了的情况。有可能是数据没成功写入 ES 集群,也可能是数据被误删了。

针对数据被误删,有没有好的解决办法呢?

其实我们可以把“删除数据”这个操作管理起来。当 ES 集群接收到删除数据命令的时候,先不执行该命令,而是生成一条删除数据的记录,经过管理人员批准后,该命令才会执行。这样不仅可以管理数据的删除,还可以进行删除操作的追踪:什么人,什么时间,发送了什么样的删除指令,从哪个 IP 发送的,以什么身份登录的等等。

要实现这个解决办法,我们可借助 INFINI Gateway 和 Console 的帮助。

方案架构

方案效果

  • INFINI Gateway 作为 ES 集群的代理,接收所有请求
  • INFINI Gateway 对删除数据操作进行拦截,在 Console UI 界面生成记录
  • 管理人员 在 Console UI 界面审批操作记录,审批通过操作被执行

方案演示

测试数据准备

测试索引 test1,一共有 3 条数据。message 内容分别是"line 1","line 2"和"line 3"。

启动 INFINI Gateway 及 Console

网关配置新增内容

增加对 DELETE 操作的捕获,不直接执行,写入队列中。后续由队列生成特定的记录。

router:
 - name: my_router
 default_flow: default_flow
 tracing_flow: logging_flow
 rules:
 - method:
 - "DELETE"
 pattern:
 - "/{any_index}"
 - "/{any_index}/{any_type}"
 - "/{any_index}/{any_type}/{any_docid}"
 flow:
 - audit_flow
 - method:
 - "*"
 pattern:
 - "/{any_index}/_delete_by_query"
 - "/_delete_by_query"
 flow:
 - audit_flow
flow:
 - name: audit_flow
 filter:
 - logging:
 queue_name: del_queue
pipeline:
 - name: del_queue_ingest
 auto_start: true
 keep_running: true
 processor:
 - json_indexing:
 input_queue: "del_queue"
 idle_timeout_in_seconds: 1
 elasticsearch: "logging-server"
 index_name: "del_requests"
 worker_size: 1
 bulk_size_in_kb: 1

执行删除操作

ES 支持多种删除操作,简单总结归纳如下:

  1. 删除指定文档 id
  2. 删除索引
  3. 根据查询删除指定数据(\_delete_by_query)

执行删除操作之前,先通过 INFINI Gateway 访问 ES 集群,证明可正常访问数据。

执行上述的几种删除命令,注意要发给 INFINI Gateway 的 8000 端口。

数据查询验证数据还在

Console 界面查看未批准的删除记录

所有删除操作,都被记录,待审批

Console 界面进行审批通过

选择一条记录,批准执行。Operation-approve

数据查询验证数据

"message": "line 2"的文档已被删除。

Console 界面查看历史记录

继续批准测试

批准删除一条文档

"message": "line 1" 的文档不在了。

批准删除索引

索引不在了。

至此我们演示了如何利用 INFINI Gateway 和 Console 对 ES 集群删除操作进行管控,本文只是抛砖引玉,相信还有更多有意思的场景等待大家发掘。

本文由博客一文多发平台 OpenWrite 发布!
作者:极限实验室原文地址:https://segmentfault.com/a/1190000043800118

%s 个评论

要回复文章请先登录注册