随笔分类 -  中间件

摘要:新的篇章即将拉起,是时候给自己的这两年来个总结了。 一、篇前总结 这两年,从北京来到了杭州。从一个北漂变成了杭漂,买了房,买了车,养了条柯基,在这座江南城市生了根。父母健康,家庭和睦。日子过得温馨,感谢父母,感谢媳妇。 这两年,完成了研究生的课程,通过了研究生的答辩。不枉我们杭州北京来回跑,飞机高铁 阅读全文
posted @ 2019-05-06 16:58 飞轩 阅读(979) 评论(0) 推荐(0) 编辑
摘要:这是Canal在新版本引入的一个内容,主要是为了解决由于历史的DDL导致表结构与现有表结构不一致,导致的同步失败的问题。采用的是Druid和Fastsql,来记录表结构到DB中,如果需要进行回滚时,得从DB中根据时间点去查到对应的库表结构,然后进行业务的处理。也就是,如果我们想要这样的效果,需要开启 阅读全文
posted @ 2018-05-31 13:49 飞轩 阅读(734) 评论(0) 推荐(0) 编辑
摘要:从Canal的整体架构中,我们可以看出,在Canal中,比较重要的一些领域有Parser、Sink、Store、MetaManager、CanalServer、CanalInstance、CanalClient、Connection等等。下面我们仔细分析下Canal的领域模型。 一、Parser 核 阅读全文
posted @ 2018-05-31 10:52 飞轩 阅读(557) 评论(0) 推荐(0) 编辑
摘要:本文详解canal的整体架构。 一、整体架构 说明: server代表一个canal运行实例,对应于一个jvm instance对应于一个数据队列 (1个server对应1..n个instance) instance模块: eventParser (数据源接入,模拟slave协议和master进行交 阅读全文
posted @ 2018-05-30 17:24 飞轩 阅读(1246) 评论(0) 推荐(1) 编辑
摘要:本文讲解canal中的一些配置含义。 一、配置加载图 二、配置文件canal.properties 2.1 common参数定义 比如可以将instance.properties的公用参数,抽取放置到这里,这样每个instance启动的时候就可以共享. 【instance.properties配置定 阅读全文
posted @ 2018-05-30 16:32 飞轩 阅读(2928) 评论(1) 推荐(0) 编辑
摘要:Canal的数据传输有两块,一块是进行binlog订阅时,binlog转换为我们所定义的Message,第二块是client与server进行TCP交互时,传输的TCP协议。 一、EntryProtocal 这块是binlog的一个存储。主要的格式如下: 二、CanalProtocal 这块主要定义 阅读全文
posted @ 2018-05-30 14:07 飞轩 阅读(862) 评论(0) 推荐(0) 编辑
摘要:client的工作过程,需要我们自己去编写对应的逻辑,我们目前只能从example写的例子来看。目前examle中提供了两个例子,一个是单机的,一个是集群的cluster,我们后续如果需要进行开发的话,其实也是开发我们自己的client,以及client的一些逻辑。我们主要看下集群的client是如 阅读全文
posted @ 2018-05-29 16:42 飞轩 阅读(1691) 评论(0) 推荐(0) 编辑
摘要:一、序列图 二、源码分析 2.1 Sink Sink阶段所做的事情,就是根据一定的规则,对binlog数据进行一定的过滤。我们之前跟踪过parser过程的代码,发现在parser完成后,会把数据放到一个环形队列TransactionBuffer中,也就是这个方法: 我们具体看下add这个方法。 判断 阅读全文
posted @ 2018-05-25 15:01 飞轩 阅读(800) 评论(2) 推荐(1) 编辑
摘要:一、序列图 1.1 启动 1.2 停止 二、源码分析 2.1 启动 这部分代码其实在ServerRunningMonitor的start()方法中。针对不同的destination,启动不同的CanalInstance。主要的方法在于initRunning()。 首先在zk中新增一个临时节点,表示的 阅读全文
posted @ 2018-05-24 17:50 飞轩 阅读(1893) 评论(0) 推荐(0) 编辑
摘要:本文主要解析下canal server的启动过程,希望能有所收获。 一、序列图 1.1 启动 1.2 停止 二、源码分析 整个server启动的过程比较复杂,看图难以理解,需要辅以文字说明。 首先程序的入口在CanalLauncher的main方法中。 2.1 加载配置文件 从canal.prope 阅读全文
posted @ 2018-05-24 15:25 飞轩 阅读(4877) 评论(0) 推荐(0) 编辑
摘要:本文主要分析的部分是instance启动时,parser的一个启动和工作过程。主要关注的是AbstractEventParser的start()方法中的parseThread。 一、序列图 二、源码分析 parseThread中包含的内容比较清晰,代码不是很长,我们逐步分析下。 2.1 构造数据库连 阅读全文
posted @ 2018-05-24 10:55 飞轩 阅读(1421) 评论(0) 推荐(0) 编辑
摘要:binlog的寻找过程可能的场景如下: instance第一次启动 发生数据库主备切换 canal server HA情况下的切换 所以这个过程是能够保证binlog不丢失的关键点。 本文从源码的角度来分析下启动过程中的binlog寻找过程。 一、流程图 下图是根据源码画出的流程图,需要结合源码分析 阅读全文
posted @ 2018-05-23 22:12 飞轩 阅读(6902) 评论(0) 推荐(1) 编辑
摘要:众所周知,Otter的代码打包后,是通过Jetty启动的,Otter代码的启动脚本中自带了开启Jetty远程DEBUG的脚本,所以我们只需要在启动Otter Manager和Otter Node的时候,带上如下参数: 其中8888就是我们远程debug的端口号。 然后在IDEA中开启远程调试,具体的 阅读全文
posted @ 2018-02-01 14:04 飞轩 阅读(608) 评论(1) 推荐(0) 编辑
摘要:最近在搞数据同步相关的内容,需要对otter的代码进行扩展,所以需要先熟悉一下otter的源码。首先我们整体来看下otter的工程结构。otter的工程结构比较复杂,需要花费一定的时间来理解各个部分的内容,仅仅通过官方文档无法准确的理解各个模块的内容,现分析如下: otter整体的工程结构如下: 其 阅读全文
posted @ 2018-01-22 14:49 飞轩 阅读(524) 评论(0) 推荐(0) 编辑
摘要:一、ShardingContext 在Sharding Jdbc中,我们其实需要抓住一个核心类,也就是ShardingContext,分片上下文,里面定义了下面几个内容: 里面的几个参数很简单易懂,但是里面包含的内容也是整个中间件的核心内容。 二、preparedStatement 这块对应于代码中 阅读全文
posted @ 2017-11-22 08:42 飞轩 阅读(1032) 评论(0) 推荐(0) 编辑
摘要:Sharding jdbc中的很多地方涉及到算法,比如主从配置这块、分库分表这块。本文主要从源码角度介绍下,目前主要包含哪些算法,以及这些算法的内容。 一、读写分离(主从配置) 这块的代码主要在core模块中的api/algorithm/masterslave下面,这块的算法的主要目的,其实是在读的 阅读全文
posted @ 2017-11-22 08:41 飞轩 阅读(3507) 评论(0) 推荐(0) 编辑
摘要:最新的2.0版本的Sharding Jdbc版本,由于需要支持动态配置加载,所以最新的模块信息如下: 其中各个模块的内容如下: sharding jdbc core:核心模块,主要包含的是一个分库分表、读写分离的中间件的核心内容,包括规则配置、sql解析、sql改写、sql路由、sql执行、结果集合 阅读全文
posted @ 2017-11-20 16:33 飞轩 阅读(1491) 评论(0) 推荐(0) 编辑
摘要:[TOC] KafkaConsumer是从kafka集群消费消息的客户端。这是kafka的高级消费者,而SimpleConsumer是kafka的低级消费者。何为高级?何为低级? 我们所谓的高级,就是可以自动处理kafka集群的失败信息,也可以适应kafka集群中消息的分区迁移。这个客户端也可以与服 阅读全文
posted @ 2017-11-16 13:30 飞轩 阅读(3650) 评论(0) 推荐(2) 编辑
摘要:[TOC] 在KafkaServer中的入口在: 首先根据相关参数,实例化KafkaApis,然后实例化KafkaRequestHandlerPool。下面我们首先看下KafkaRequestHandlerPool。 一、KafkaRequestHandlerPool 在run方法中,我们可以看到, 阅读全文
posted @ 2017-11-15 10:42 飞轩 阅读(783) 评论(0) 推荐(0) 编辑
摘要:[TOC] 今天我们主要分析下broker被选为controller之后,主要干了什么。门面代码先列出来: 一个门面,涉及到的监听器和其他内容比较多,我们一一分析。 一、controller epoch 首先从zk的节点/controller_epoch下获取之前的epoch,然后将其+1后持久化到 阅读全文
posted @ 2017-11-13 16:41 飞轩 阅读(1085) 评论(0) 推荐(0) 编辑