淘宝单网站建设,单页静态网站怎么做,做外贸在什么网站好,电商运营怎么做如何从零开始前言如今大型的IT系统中#xff0c;都会使用分布式的方式#xff0c;同时会有非常多的中间件#xff0c;如redis、消息队列、大数据存储等#xff0c;但是实际核心的数据存储依然是存储在数据库#xff0c;作为使用最广泛的数据库#xff0c;如何将mysql的数据与中间件的…前言如今大型的IT系统中都会使用分布式的方式同时会有非常多的中间件如redis、消息队列、大数据存储等但是实际核心的数据存储依然是存储在数据库作为使用最广泛的数据库如何将mysql的数据与中间件的数据进行同步既能确保数据的一致性、及时性也能做到代码无侵入的方式呢如果有这样的一个需求数据修改后需要及时的将mysql中的数据更新到elasticsearch,我们会怎么进行实现呢数据同步方案选择针对上文的需求经过思考初步有如下的一些方案代码实现针对代码中进行数据库的增删改操作时同时进行elasticsearch的增删改操作。mybatis实现通过mybatis plugin进行实现截取sql语句进行分析 针对insert、update、delete的语句进行处理。显然这些操作如果都是单条数据的操作是很容易处理的。但是实际开发中总是会有一些批量的更新或者删除操作这时候就很难进行处理了。Aop实现不管是通过哪种Aop方式根据制定的规则如规范方法名注解等进行切面处理但依然还是会出现无法处理批量操作数据的问题。logstashlogstash类似的同步组件提供的文件和数据同步的功能可以进行数据的同步只需要简单的配置就能将mysql数据同步到elasticsearch但是logstash的原理是每秒进行一次增量数据查询将结果同步到elasticsearch实时性要求特别高的可能无法满足要求。且此方案的性能不是很好造成资源的浪费。代码实现技术难度低侵入性强实时性高。基于mybatis有一定的技术难度但是无法覆盖所有的场景Aop实现技术难度低半侵入性需要规范代码依然无法覆盖所有的场景logstash技术难度低无侵入性无需开发但会造成资源浪费。那么是否有什么更好的方式进行处理吗mysql binlog同步实时性强对于应用无任何侵入性且性能更好不会造成资源浪费那么就有了我今天的主角——canalcanal介绍canal 是阿里巴巴的一个开源项目基于java实现整体已经在很多大型的互联网项目生产环境中使用包括阿里、美团等都有广泛的应用是一个非常成熟的数据库同步方案基础的使用只需要进行简单的配置即可。canal是通过模拟成为mysql 的slave的方式监听mysql 的binlog日志来获取数据binlog设置为row模式以后不仅能获取到执行的每一个增删改的脚本同时还能获取到修改前和修改后的数据基于这个特性canal就能高性能的获取到mysql数据数据的变更。使用canal的介绍在官网有非常详细的说明如果想了解更多大家可以移步官网(https://github.com/alibaba/canal)了解。我这里补充下使用中不太容易理解部分。canal的部署主要分为server端和client端。server端部署好以后可以直接监听mysql binlog,因为server端是把自己模拟成了mysql slave所以只能接受数据没有进行任何逻辑的处理具体的逻辑处理需要client端进行处理。client端一般是需要大家进行简单的开发。https://github.com/alibaba/canal/wiki/ClientAPI 有一个简单的示例很容易理解。canal Adapter为了便于大家的使用官方做了一个独立的组件AdapterAdapter是可以将canal server端获取的数据转换成几个常用的中间件数据源现在支持kafka、rocketmq、hbase、elasticsearch针对这几个中间件的支持直接配置即可无需开发。上文中如果需要将mysql的数据同步到elasticsearch直接运行 canal Adapter修改相关的配置即可。常见问题无法接收到数据程序也没有报错一定要确保mysql的binlog模式为row模式canal原理是解析Binlog文件并且直接中文件中获取数据的。Adapter 使用无法同步数据按照官方文档检查配置项如sql的大小写字段的大小写可能都会有影响如果还无法搞定可以自己获取代码调试下Adapter的代码还是比较容易看懂的。canal Adapter elasticsearch 改造因为有了canal和canal Adapter这个神器同步到elasticsearch、hbase等问题都解决了但是自己的开发的过程中发现Adapter使用还是有些问题因为先使用的是elasticsearch同步功能所以对elasticsearch进行了一些改造elasticsearch初始化一个全新的elasticsearch无法使用因为没有创建elasticsearch index和mapping,增加了对应的功能。 elasticsearch配置文件mapping节点增加两个参数 enablefieldmap: true fieldmap: id: text BuildingId: text HouseNum: text Floors: text IdProjectInfo: text HouseDigitNum: text BuildingNum: text BuildingName: text Name: text projectid: text bIdProjectInfo: text cinitid: text pCommunityId: textenablefieldmap 是否需要自动生成fieldmap默认为false,如果需要启动的时候就生成这设置为true,并且设置 fieldmap,类似elasticsearch mapping中每个字段的类型。esconfig bug处理代码中获取binlog的日志处理时必须要获取数据库名但是当获取binlog为type query时是无法获取 数据库名的此处有bug导致出现 Outer adapter write failed ,且未输出错误日志修复此bug.后续计划增加rabbit MQ的支持增加redis的支持源码源码地址https://github.com/itmifen/canal