如何通过文档ID避免Elasticsearch转MySQL的数据重复及配置修改
利用Elasticsearch文档ID避免MySQL数据重复的配置方案
要实现基于ES文档ID避免MySQL数据重复,需要从MySQL表结构调整和Logstash配置修改两方面入手,具体步骤如下:
1. 调整MySQL表结构
首先在目标表indexname中添加一个用于存储ES文档ID的唯一键字段,以此作为判断数据重复的依据:
ALTER TABLE indexname ADD COLUMN es_doc_id VARCHAR(255) NOT NULL UNIQUE;
(若需要更严格的唯一性约束,也可将该字段设为PRIMARY KEY)
2. 修改Logstash配置
输入配置说明
你的ES输入配置中已开启docinfo => true,该参数会自动将ES文档的ID、索引等元数据存入事件的[@metadata][_id]字段,无需修改输入部分。
输出配置修改
更新JDBC输出的SQL语句,新增ES文档ID的插入逻辑,并通过ON DUPLICATE KEY UPDATE处理重复数据:
output { if "PRV_API_REQUEST" in [message] { jdbc { driver_class => "com.mysql.jdbc.Driver" connection_string => "jdbc:mysql://***.***.***.***/indexname?user=test&password=****" enable_event_as_json_keyword => true statement => [ "INSERT INTO indexname (logLevel, timestamp, requestURL, date, response_code, es_doc_id) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE logLevel = VALUES(logLevel), timestamp = VALUES(timestamp), requestURL = VALUES(requestURL), date = VALUES(date), response_code = VALUES(response_code)", "logLevel", "timestamp", "requestURL", "date", "[response][code]", "[@metadata][_id]" ] } } }
关键修改点说明
- 在
INSERT的字段列表和VALUES中新增es_doc_id字段,对应取值为ES文档ID的[@metadata][_id] - 添加
ON DUPLICATE KEY UPDATE子句:当插入的es_doc_id已存在时,会自动更新指定字段;若无需更新重复数据,可改为ON DUPLICATE KEY IGNORE直接忽略重复条目
内容的提问来源于stack exchange,提问作者Ali farahzadi
相关产品推荐
相关产品推荐

