近期将es作为数据库使用,遇到一个问题需要对某个索引的某些数据进行回滚。
直接上 方案 4种
1、利用es 慢sql日志,将写请求记录输出到es的日志中,再对日志进行收集
2、开发es插件拦截记录写请求
3、开发修改es请求客户端api 对写请求记录,缺点就是 无法记录非通过客户端api访问es的请求
4、快照对比,比较依赖快照
快照对比,两种 方式 1)es 在7.10 版本以后推出了可搜索快照,但是属于收费功能
2) 定期快照,恢复最近的一次快照,但是比较依赖快照
方案1
具体实现方式是参考了大佬的文章
打印日志
日志收集可以采用elk增加对 写请求的收集,利用kibana 进行数据修改记录查询
方案2 参考
插件开发
采用方案1 可能遇到的几个问题
问题1、写请求无法区分具体是哪种类型。
1)es 写请求日志是不会记录DELETE ,只记录成功的UPDATE 和INSERT,
解决不记录DELETE请求方法是采用 逻辑删除增加一个status字段去判断是否删除
2)记录的写请求无法区分UPDATE 和INSERT
解决方式是根据数据进行区分,可以在 INSERT 请求时增加字段insert_time,UPDATE 请求时增加update_time,在日志收集的时候 根据status 、insert_time、update_time 对请求进行分类是哪种写请求类型
2、慢sql日志 记录了所有请求怎么区分,哪些是真的慢sql请求?
解决方式是 :将所有请求都输出到慢sql日志后在日志收集的时候,按照"took":和"took_millis" 的值 去判断是否是慢sql 语句
日志文件 xxxx_index_search_slowlog.json 添加和修改请求 无法区别
{"type": "index_indexing_slowlog", "timestamp": "2023-02-14T22:33:58,442+08:00", "level": "DEBUG", "component": "i.i.s.index", "cluster.name": "xxxx", "node.name": "x.x.x.x", "message": "[sentence_embeddings/g1b0RQSzRZyBezyFReLjvw]", "took": "1.2ms", "took_millis": "1", "doc_type": "_doc", "id": "413221961389445120", "source": "{\"sentence\":\"测试语句ok9\",\"id\":\"413221961389445120\"}", "cluster.uuid": "h4gKo6jKSGKlmBhQuSLLZw", "node.id": "_cVpKwRWQSO1ESE6cPZiSQ" }
{"type": "index_indexing_slowlog", "timestamp": "2023-02-14T22:38:54,410+08:00", "level": "DEBUG", "component": "i.i.s.index", "cluster.name": "xxxx", "node.name": "x.x.x.x", "message": "[sentence_embeddings/g1b0RQSzRZyBezyFReLjvw]", "took": "1.2ms", "took_millis": "1", "doc_type": "_doc", "id": "413221961389445120", "source": "{\"sentence\":\"测试修改\",\"id\":\"413221961389445120\"}", "cluster.uuid": "h4gKo6jKSGKlmBhQuSLLZw", "node.id": "_cVpKwRWQSO1ESE6cPZiSQ" }