阅读 82

Elasticsearch + Canal 搜索实践

1.项目背景

机顶盒需要搜索业务,有这个需求,所以我很荣幸做了这个项目。

2.项目架构

java开发的搜索主程序,核心是elasticsearch 6.4.0,同步组件使用的是阿里开源的canal,数据库是MySql。如下是架构图,省略了一点点内容。


3.项目成果

目前,已经上线了,也迭代了2个版本,效果还可以。不加缓存TPS能达到800多吧,加上缓存可以1w+。

4.项目开发过程简述

        这个项目是从2020年初开始的,那时候正好是疫情爆发,只能在家弄,一直到10月才完工。最开始的时候对es一无所知,一点点学习es的DSL语句,然后转成java api,开始挺痛苦的,等熟悉了就很轻松了。

这个项目主要分两个部分:搜索和同步。

搜索:这个不难,只要DSL写好,翻译成对应的api就好,正常搜索的时候,外部通过http请求到主程序,程序再去es中查询。

同步:稍微有点麻烦,分为实时同步和全量同步。全量同步是根据业务SQL查询所有站点数据,然后同步到es中,通过bulk批量处理,速度也能接受。实时同步用的是canal,它是伪装成mysql的一个slave,获取到数据库的binlog,数据库有数据变更后,会同步一份binlog过来,java程序中的canal client会获取到这些记录,然后根据业务去数据库查数据,再同步到es中。

4.注意事项

    (a) Canal实时同步:阿里开源出来的,折腾了很久,中间也请领导协调阿里的资源,(感谢我的领导黄总和阿里的七峰同学),之前出现同步非常慢的情况,后来跟阿里同学沟通后知道了自己的问题,canal的处理流程是串行的,同步速度取决于程序中的业务处理速度,所以我用了多线程,提高并发处理能力,但要做好异常处理,一旦多线程这里出问题,canal同步就停止了,这狠狠坑了我一次。当时生产刚上线是好的,但没多久,就同步失败,上下线不成功。后来发现是取多线程的时候没做控制,找到问题后,do it !,加上控制后就可以了。

(b)Canal 报错:Could not find first log file name in binary log index file。这个报错是日志文件被转移或者删掉了,导致canal找不到,网上查了好久,最后选了一个性价比高的解决方案,定时任务去扫描canal的日志,如果出现这个错,就重启canal服务,并清理meta.dat。

(c)Elasticsearch的搜索建议词结果不准确的坑。这个折磨了我很久,建议词如果要准确要加上下文检索contexts,如果是python写很简单,但es的java版api支持的不是很好,最后去Stack Overflow上找,看到了个官方的回复,用模板查询方法,SearchTemplateRequestBuilder,自己定制化写DSL就能很好的解决。

暂时先写这些,有问题可以私信我。

作者:沙场号角

原文链接:https://www.jianshu.com/p/efaea93549af

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐