您好,登录后才能下订单哦!
这期内容当中小编将会给大家带来有关基于canal client实现canal同步es的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
canal是阿里开源的一款纯java语言的mysql增量订阅工具,主要是伪装成slave节点,向mysql发送 dump协议官方原理如图:
官方的解释:
server代表一个canal运行实例,对应于一个jvm
instance对应于一个数据队列 (1个server对应1..n个instance)
个人是这么理解的instance当做一个mq中的topic队列(kafka中的broker),canal client相当于mq中的消费者.instance接收到数据通过parse解析之后经过sink进行数据加工,最后存储到sore中,由canal client来进行消费.
由于业务数据量较大,单表超亿,根据实际业务对数据库进行分库分表,es中存储主键和账号对应关系,访问数据库时先送es中获取主键再查db,这样可以直接打到对应分片上秒回
起初打算采用官方提供的工具实现,后续发现官方的不太符合我们的需求(或许是自己没搞明白官方的工具),并切我们是分库分表的,按照官方的配置太过繁琐.一个表到底层就分了几百张表,所以决定就基于canal client自己实现了同步es,全量和增量.不过踩了不少得吭.
采用es的bulk api批量更新 .设置自定义模板,后续翻阅官方的源码,其实大致也是这么实现的,只不过官方的具有通用性而已.
启动方法:
连接canal server代码:
解析binlog的代码也很简单,不过自己实现的不具备通用性,勿喷:
将数据进行组装批量提交:
就这个不困扰了.es和msyql总是差那么10-100条不等,后续找到的原因,由于设置批量是1000,而数据库更新操作tps较低,所以造成两者之间数据延时.将批量数逐个降低测试最后调整到50批次,es和mysql数据时延降低到毫级了.
全量同步的较为简单.个人是这样实现的.首先将mysql中20亿数据量导出到文本文件,我们只需要主键和账号两个字段即可,并且是分库分表的,导出非常快.1亿的数据量30秒以内全部导出.然后通过缓冲流一行一行读取文件,调用bulk api批量入es,es 5个数据节5分片一副本,单节点40核物理机 内存512G jvm设置31G raid0 sas盘,1亿数据量基本5分钟以内就可导入es中,目前线上运行2月没发现异常.
上述就是小编为大家分享的基于canal client实现canal同步es的示例分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。