数据稽核场景
基于ES双中心使用场景,需要近实时周期性验证2个ES索引双写的数据差异,并采取措施保证数据的一致性。
数据稽核方案
由于ES一般承载的数据量较大,无法直接查询到内存中进行明细比对,采用的方案如下:根据业务时间字段查询2个集群索引相同时间段内数据总量,并计算对比所有数据关键字段的CRC32累计值。对比结果有差异的时间段不断细分,重复进行数据量及CRC32比对,最终在内存中进行小数据量明细比对,找出不一致的数据。
数据稽核步骤
- 获取指定时间范围内索引数据时间段划分类型
查询并统计指定时间范围内的索引数据,找出时间最大和最小值,计算时间差。时间段类型包括:天、小时、分钟、秒,时间差超过1天的按照天类型,超过1小时但不超过1天的按照小时类型,超过1分钟但不超过1小时的按照分钟类型,超过1秒但不超过1分钟的按照秒类型。 - 使用date_histogram将指定时间段索引数据细分
查询并按时间段类型聚合,使用date_histogram分别获取2个索引各个时间段内的数据总量。 - 比对2个索引相同时间段内的数据总量 比对2个索引相同时间段内的数据总量,若不一致则不再进行CRC32比对
- 计算并比对数据总量相同的时间段的CRC32值
使用scroll查询方式,查询数据量相同的时间段内明细数据并按指定字段排序,通过CRC32累计计算指定字段值,比对最终的CRC32值。若CRC32值相同,则认为该时间段内数据一致。 - 汇总数据量不同及CRC32值不同的时间段,重复进行2、3、4步 按照天、小时、分钟、秒的顺序细化时间段,重复进行2、3、4步。
- 较小数据量进行内存明细比对,存储比对结果供后续处理
单个时间段内数据量小于10000时,可以直接查询至内存中进行双向比对,得到明细差异结果并存储。 - 周期性进行1-6步 设置定时任务,如每天凌晨对前一天数据进行稽核比对。或每10分钟对相隔10分钟前的数据进行对比(确保对比时间数据不再变动)。若要进行同步,可针对差异数据进行双中心数据更正或补录。
测试环境
测试程序运行硬件环境:windows7 CPU 2.2GHZ 内存8G
测试程序运行软件环境:jdk1.8、springboot1.4.1
测试环境容器集群:es-test
索引:index_2019_08_19
比对索引:index_2019_08_17
时间字段:startTime
唯一主键:traceId、id组合
测试方式
- 新建索引index_2019_08_17,结构与index_2019_08_19保持一致
- 通过reindex方式将index_2019_08_19数据写入index_2019_08_17
- 修改或删除index_2019_08_17、index_2019_08_19中部分数据
- 按照ES数据稽核步骤进行比对
测试结果
- 稽核速度
单个索引总数据量230W左右,2个索引数据各差异1条,稽核完成时间平均在60s以内
- 资源使用
稽核过程中使用2个线程池,每个线程池各10个线程,中间比对线程2个,最多22个线程,CPU使用率20%-40%之间,内存使用200M-500M之间。
总结
ES数据稽核功能可以实现,但需注意一些问题
- 业务数据中必须有唯一主键或联合主键
- 制定稽核执行周期时,需考虑数据延迟导致的稽核不准确问题,保证稽核时间范围内,数据无变化