我们在使用 Elasticsearch 的时候,可能会遇到数据“丢”了的情况。有可能是数据没成功写入 ES 集群,也可能是数据被误删了。
针对数据被误删,有没有好的解决办法呢?
其实我们可以把“删除数据”这个操作管理起来。当 ES 集群接收到删除数据命令的时候,先不执行该命令,而是生成一条删除数据的记录,经过管理人员批准后,该命令才会执行。这样不仅可以管理数据的删除,还可以进行删除操作的追踪:什么人,什么时间,发送了什么样的删除指令,从哪个 IP 发送的,以什么身份登录的等等。
要实现这个解决办法,我们可借助 INFINI Gateway 和 Console 的帮助。
测试索引 test1,一共有 3 条数据。message 内容分别是"line 1",“line 2"和"line 3”。
网关配置新增内容
增加对 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 支持多种删除操作,简单总结归纳如下:
执行删除操作之前,先通过 INFINI Gateway 访问 ES 集群,证明可正常访问数据。
执行上述的几种删除命令,注意要发给 INFINI Gateway 的 8000 端口。
所有删除操作,都被记录,待审批
选择一条记录,批准执行。Operation-approve
“message”: "line 2"的文档已被删除。
批准删除一条文档
“message”: “line 1” 的文档不在了。
批准删除索引
索引不在了。
至此我们演示了如何利用 INFINI Gateway 和 Console 对 ES 集群删除操作进行管控,本文只是抛砖引玉,相信还有更多有意思的场景等待大家发掘。