--- title: "ES 数据没了?谁动了我的数据?" date: 2023-05-12 lastmod: 2023-05-12 description: "通过INFINI Gateway和Console管理Elasticsearch删除操作,拦截删除请求生成记录,经管理人员审批后执行,实现数据删除的可控与追踪。演示包括测试数据准备、配置网关、审批及验证删除效果等步骤。" tags: ["Gateway", "Console", "Elasticsearch"] summary: "背景 # 我们在使用 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 支持多种删除操作,简单总结归纳如下:" --- ### 背景 我们在使用 Elasticsearch 的时候,可能会遇到数据“丢”了的情况。有可能是数据没成功写入 ES 集群,也可能是数据被误删了。 针对数据被误删,有没有好的解决办法呢? 其实我们可以把“删除数据”这个操作管理起来。当 ES 集群接收到删除数据命令的时候,先不执行该命令,而是生成一条删除数据的记录,经过管理人员批准后,该命令才会执行。这样不仅可以管理数据的删除,还可以进行删除操作的追踪:什么人,什么时间,发送了什么样的删除指令,从哪个 IP 发送的,以什么身份登录的等等。 要实现这个解决办法,我们可借助 INFINI Gateway 和 Console 的帮助。 ### 方案架构 {{% load-img "/img/blog/2023/manage-es-del-ops/p1.png" "" %}} ### 方案效果 - INFINI Gateway 作为 ES 集群的代理,接收所有请求 - INFINI Gateway 对删除数据操作进行拦截,在 Console UI 界面生成记录 - 管理人员 在 Console UI 界面审批操作记录,审批通过操作被执行 ### 方案演示 #### 测试数据准备 测试索引 test1,一共有 3 条数据。message 内容分别是"line 1","line 2"和"line 3"。 {{% load-img "/img/blog/2023/manage-es-del-ops/p2.png" "" %}} #### 启动 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 集群,证明可正常访问数据。 {{% load-img "/img/blog/2023/manage-es-del-ops/p3.png" "" %}} 执行上述的几种删除命令,注意要发给 INFINI Gateway 的 8000 端口。 {{% load-img "/img/blog/2023/manage-es-del-ops/p4.png" "" %}} #### 数据查询验证数据还在 {{% load-img "/img/blog/2023/manage-es-del-ops/p5.png" "" %}} #### Console 界面查看未批准的删除记录 {{% load-img "/img/blog/2023/manage-es-del-ops/p6.png" "所有删除操作,都被记录,待审批" %}} #### Console 界面进行审批通过 {{% load-img "/img/blog/2023/manage-es-del-ops/p7.jpg" "选择一条记录,批准执行。Operation-approve" %}} #### 数据查询验证数据 "message": "line 2"的文档已被删除。 {{% load-img "/img/blog/2023/manage-es-del-ops/p8.png" "" %}} #### Console 界面查看历史记录 {{% load-img "/img/blog/2023/manage-es-del-ops/p9.png" "" %}} #### 继续批准测试 **批准删除一条文档** {{% load-img "/img/blog/2023/manage-es-del-ops/p10.png" "" %}} {{% load-img "/img/blog/2023/manage-es-del-ops/p11.png" "" %}} "message": "line 1" 的文档不在了。 **批准删除索引** {{% load-img "/img/blog/2023/manage-es-del-ops/p12.png" "" %}} {{% load-img "/img/blog/2023/manage-es-del-ops/p13.png" "" %}} 索引不在了。 至此我们演示了如何利用 INFINI Gateway 和 Console 对 ES 集群删除操作进行管控,本文只是抛砖引玉,相信还有更多有意思的场景等待大家发掘。