mysql 数据同步到elastic中
本文中不提及实现,仅提供方案;
增量数据同步
方案一:
通过logstash,官方提供的工具,快速实现数据同步;值得注意的是选择logstash时需要和elastic的版本做对应,由于elastic 版本不兼容,选择logstash的也需要对应版本;
logstash集群部署有一些麻烦,当然也可以直接购买云产品;
方案二
通过binlog的方式进行同步;同样的时有云产品,也可以通过cannal实现对mysql的binlog的订阅;订阅到binlog 以后对数据进行解析,通过java代码的方式进行同步;为了提高并发和容灾,集群下可以使用mq削峰;将订阅到binlog 通过mq发送,由订阅的客户端进行消费,极大的提高数据的处理速度;
集群下有可能出现乱序的问题,这部分需要在代码中对消息的创建时间进行记录,如果是同一条数据,需要根据创建时间对数据进行最终的修改,比如先修改后删除了某条数据,由于投递和消费的速度不一致,导致数据先被删除了,然后又被修改了,导致这条数据最后在es中是出于修改的状态而不是删除;
优缺点对比
logstash的缺点
- logstash 日志监控不是很方便,出现异常不容易即时排查
- 他的实现方式需要依赖自增ID或者可以标识当前数据为最新数据的时间戳字段,如果以上两个条件不满足则无法使用;
- sql编写的能力要求较高;通常情况下需要同步到es一般会融合几个表的数据,这边建议可以创建视图;
- 由于上述特性,如果使用的是时间戳,那么有可能出现数据丢失的情况;
- 集群可用方案较少
logstash的优点
- 上手快,毕竟是一个工具,又输入,处理,输出三部分组成,并且又大量案例,很快就能实现数据同步,增量全量均可;
- 0 代码,通过配置即可操作;
- 插件众多,并且可以自定义三个部分的插件,比较友好;
全量数据同步
- logstash 通过配置起始时间即可
- 通过调度任务;
核心思想
- 如何捞取有效数据
- 如何批量处理数据