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 操作的捕获,不直接执行,写入队列中。后续由队列生成特定的记录。
执行删除操作
ES 支持多种删除操作,简单总结归纳如下:
删除指定文档 id
删除索引
根据查询删除指定数据(_delete_by_query)
执行删除操作之前,先通过 INFINI Gateway 访问 ES 集群,证明可正常访问数据。
执行上述的几种删除命令,注意要发给 INFINI Gateway 的 8000 端口。
数据查询验证数据还在
Console 界面查看未批准的删除记录
所有删除操作,都被记录,待审批
Console 界面进行审批通过
选择一条记录,批准执行。Operation-approve
数据查询验证数据
"message": "line 2"的文档已被删除。
Console 界面查看历史记录
继续批准测试
批准删除一条文档
"message": "line 1" 的文档不在了。
批准删除索引
索引不在了。
至此我们演示了如何利用 INFINI Gateway 和 Console 对 ES 集群删除操作进行管控,本文只是抛砖引玉,相信还有更多有意思的场景等待大家发掘。
评论