ES双中心数据稽核(同步)

数据稽核场景

基于ES双中心使用场景,需要近实时周期性验证2个ES索引双写的数据差异,并采取措施保证数据的一致性。

数据稽核方案

由于ES一般承载的数据量较大,无法直接查询到内存中进行明细比对,采用的方案如下:根据业务时间字段查询2个集群索引相同时间段内数据总量,并计算对比所有数据关键字段的CRC32累计值。对比结果有差异的时间段不断细分,重复进行数据量及CRC32比对,最终在内存中进行小数据量明细比对,找出不一致的数据。

数据稽核步骤

  1. 获取指定时间范围内索引数据时间段划分类型
    查询并统计指定时间范围内的索引数据,找出时间最大和最小值,计算时间差。时间段类型包括:天、小时、分钟、秒,时间差超过1天的按照天类型,超过1小时但不超过1天的按照小时类型,超过1分钟但不超过1小时的按照分钟类型,超过1秒但不超过1分钟的按照秒类型。
  2. 使用date_histogram将指定时间段索引数据细分
    查询并按时间段类型聚合,使用date_histogram分别获取2个索引各个时间段内的数据总量。
  3. 比对2个索引相同时间段内的数据总量 比对2个索引相同时间段内的数据总量,若不一致则不再进行CRC32比对
  4. 计算并比对数据总量相同的时间段的CRC32值
    使用scroll查询方式,查询数据量相同的时间段内明细数据并按指定字段排序,通过CRC32累计计算指定字段值,比对最终的CRC32值。若CRC32值相同,则认为该时间段内数据一致。
  5. 汇总数据量不同及CRC32值不同的时间段,重复进行2、3、4步 按照天、小时、分钟、秒的顺序细化时间段,重复进行2、3、4步。
  6. 较小数据量进行内存明细比对,存储比对结果供后续处理
    单个时间段内数据量小于10000时,可以直接查询至内存中进行双向比对,得到明细差异结果并存储。
  7. 周期性进行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组合

测试方式

  1. 新建索引index_2019_08_17,结构与index_2019_08_19保持一致
  2. 通过reindex方式将index_2019_08_19数据写入index_2019_08_17
  3. 修改或删除index_2019_08_17、index_2019_08_19中部分数据
  4. 按照ES数据稽核步骤进行比对

测试结果

  1. 稽核速度

单个索引总数据量230W左右,2个索引数据各差异1条,稽核完成时间平均在60s以内

  1. 资源使用

稽核过程中使用2个线程池,每个线程池各10个线程,中间比对线程2个,最多22个线程,CPU使用率20%-40%之间,内存使用200M-500M之间。

总结

ES数据稽核功能可以实现,但需注意一些问题

  • 业务数据中必须有唯一主键或联合主键
  • 制定稽核执行周期时,需考虑数据延迟导致的稽核不准确问题,保证稽核时间范围内,数据无变化

猜你喜欢

转载自blog.csdn.net/yml_try/article/details/108659522