- 博客(130)
- 资源 (5)
- 收藏
- 关注
原创 做中间件的这两年总结(201704-201905)
新的篇章即将拉起,是时候给自己的这两年来个总结了。一、篇前总结这两年,从北京来到了杭州。从一个北漂变成了杭漂,买了房,买了车,养了条柯基,在这座江南城市生了根。父母健康,家庭和睦。日子过得温馨,感谢父母,感谢媳妇。这两年,完成了研究生的课程,通过了研究生的答辩。不枉我们杭州北京来回跑,飞机高铁卧铺的来回切换。每次都从南京转车,一晚卧铺的卧铺到北京。飞机取消了好几次。在学校前面的宾馆住了好多次...
2019-05-06 16:59:20
431
原创 NIO基础之同步、异步、阻塞、非阻塞
这里区分几个概念,也是常见但是容易混淆的概念,就是标题中的同步、异步、阻塞、非阻塞。一、同步与异步同步与异步,关心的是消息通信的机制。也就是调用者和被调用者之间,消息是如何进行通知的。如果是调用者主动等待调用的结果,那么就是同步。如果是被调用者主动去通知调用者,就是异步。从上面的描述中,我们可以看到。同步还是异步,主要是看的消息通知的方式,一个是调用者主动等待,一个是调用者被通知。二、阻塞与...
2019-02-11 14:10:21
316
原创 【源码分析】HashMap源码再读-基于Java8
最近工作不是太忙,准备再读读一些源码,想来想去,还是先从JDK的源码读起吧,毕竟很久不去读了,很多东西都生疏了。当然,还是先从炙手可热的HashMap,每次读都会有一些收获。当然,JDK8对HashMap有一次优化一、一些参数我们首先看到的,应该是它的一些基本参数,这对于我们了解HashMap有一定的作用。他们分别是:参数说明capacity容量,默认为16,最大为2^...
2019-01-30 13:53:06
255
原创 【Canal源码分析】TableMetaTSDB
这是Canal在新版本引入的一个内容,主要是为了解决由于历史的DDL导致表结构与现有表结构不一致,导致的同步失败的问题。采用的是Druid和Fastsql,来记录表结构到DB中,如果需要进行回滚时,得从DB中根据时间点去查到对应的库表结构,然后进行业务的处理。也就是,如果我们想要这样的效果,需要开启TSDB的功能,同时要新增库表来记录表结构的变更。这个基本上是在parser启动时,寻找位点时需...
2018-05-31 13:49:21
1647
原创 【Canal源码分析】重要类图
从Canal的整体架构中,我们可以看出,在Canal中,比较重要的一些领域有Parser、Sink、Store、MetaManager、CanalServer、CanalInstance、CanalClient、Connection等等。下面我们仔细分析下Canal的领域模型。一、Parser核心是AbstractEventParser,主要干活的是MysqlEventParser。...
2018-05-31 10:52:29
454
原创 【Canal源码分析】整体架构
本文详解canal的整体架构。一、整体架构说明:server代表一个canal运行实例,对应于一个jvminstance对应于一个数据队列 (1个server对应1..n个instance)instance模块:eventParser (数据源接入,模拟slave协议和master进行交互,协议解析)eventSink (Parser和Store链接器,进...
2018-05-30 17:24:36
1887
原创 【Canal源码分析】配置项
本文讲解canal中的一些配置含义。一、配置加载图二、配置文件canal.properties2.1 common参数定义比如可以将instance.properties的公用参数,抽取放置到这里,这样每个instance启动的时候就可以共享. 【instance.properties配置定义优先级高于canal.properties】 参数名 含义...
2018-05-30 16:32:37
789
原创 【Canal源码分析】数据传输协议
Canal的数据传输有两块,一块是进行binlog订阅时,binlog转换为我们所定义的Message,第二块是client与server进行TCP交互时,传输的TCP协议。一、EntryProtocal这块是binlog的一个存储。主要的格式如下:Entry Header version [协议的版本号,default = 1] ...
2018-05-30 14:07:56
617
原创 【Canal源码分析】client工作过程
client的工作过程,需要我们自己去编写对应的逻辑,我们目前只能从example写的例子来看。目前examle中提供了两个例子,一个是单机的,一个是集群的cluster,我们后续如果需要进行开发的话,其实也是开发我们自己的client,以及client的一些逻辑。我们主要看下集群的client是如何实现和消费的,又是怎么和server进行数据交互的。我们来看看具体的代码:protec...
2018-05-29 16:43:46
1884
原创 【Canal源码分析】Sink及Store工作过程
一、序列图二、源码分析2.1 SinkSink阶段所做的事情,就是根据一定的规则,对binlog数据进行一定的过滤。我们之前跟踪过parser过程的代码,发现在parser完成后,会把数据放到一个环形队列TransactionBuffer中,也就是这个方法:transactionBuffer.add(entry);我们具体看下add这个方法。public...
2018-05-25 15:01:13
558
原创 【Canal源码分析】Canal Instance启动和停止
一、序列图1.1 启动1.2 停止二、源码分析2.1 启动这部分代码其实在ServerRunningMonitor的start()方法中。针对不同的destination,启动不同的CanalInstance。主要的方法在于initRunning()。private void initRunning() { if (!isStart())...
2018-05-24 17:52:42
1490
原创 【Canal源码分析】Canal Server的启动和停止过程
本文主要解析下canal server的启动过程,希望能有所收获。一、序列图1.1 启动1.2 停止二、源码分析整个server启动的过程比较复杂,看图难以理解,需要辅以文字说明。首先程序的入口在CanalLauncher的main方法中。2.1 加载配置文件String conf = System.getProperty("cana...
2018-05-24 15:27:52
1682
原创 【Canal源码分析】parser工作过程
本文主要分析的部分是instance启动时,parser的一个启动和工作过程。主要关注的是AbstractEventParser的start()方法中的parseThread。一、序列图二、源码分析parseThread中包含的内容比较清晰,代码不是很长,我们逐步分析下。2.1 构造数据库连接erosaConnection = buildErosaConnect...
2018-05-24 10:58:48
1148
原创 【Canal源码分析】Binlog的寻找过程
binlog的寻找过程可能的场景如下:instance第一次启动发生数据库主备切换canal server HA情况下的切换所以这个过程是能够保证binlog不丢失的关键点。本文从源码的角度来分析下启动过程中的binlog寻找过程。一、流程图下图是根据源码画出的流程图,需要结合源码分析来一起看。 二、源码分析入口在AbstractEventParser的s...
2018-05-23 22:15:53
1252
原创 【Otter】otter代码在IDEA远程DEBUG方法
众所周知,Otter的代码打包后,是通过Jetty启动的,Otter代码的启动脚本中自带了开启Jetty远程DEBUG的脚本,所以我们只需要在启动Otter Manager和Otter Node的时候,带上如下参数:sh start.sh debug 8888其中8888就是我们远程debug的端口号。然后在IDEA中开启远程调试,具体的步骤为:Debug->Remote-
2018-02-01 14:05:29
421
原创 【源码】otter工程结构
最近在搞数据同步相关的内容,需要对otter的代码进行扩展,所以需要先熟悉一下otter的源码。首先我们整体来看下otter的工程结构。otter的工程结构比较复杂,需要花费一定的时间来理解各个部分的内容,仅仅通过官方文档无法准确的理解各个模块的内容,现分析如下:otter整体的工程结构如下:otter|--manager |--biz |--deployer
2018-01-22 14:51:58
949
原创 一个Java程序员的2018年展望与2017年总结
回顾2017年,可以说是对我而言有重大转折的一年。我们选择放弃了北京,来到了杭州,开始了新的生活。房子的事情也基本上落实了,虽然其中经历了种种坎坷,但是结局还是美好的,现在在等贷款放贷。中国人嘛,没有属于自己的房子,总觉得没有那种落地生根的感觉,住在出租房里面,总感觉不是那么回事。我们养了一条狗,当然养狗的过程也经历了种种波折,被骗的经历也是很丰富,就当破财消灾了。当然了,爹妈反正是不同意我们养狗的
2018-01-02 09:38:21
7537
2
原创 【源码解析】Sharding-Jdbc模块分析
最新的2.0版本的Sharding-Jdbc版本,由于需要支持动态配置加载,所以最新的模块信息如下:|-sharding-jdbc |-sharding-jdbc-core |-api |-constant |-exception |-executor |-hint |-jdbc
2017-11-20 16:34:34
799
原创 【Kafka源码】KafkaConsumer
一偏移量和消费者位置Offsets And Consumer position1 TopicPartition2 committed position提交偏移量二消费分组和主题订阅Consumer Groups and Topic Subscriptions三检测消费者失败Detecting Consumer Failures三举例1 自动提交Automatic Offset Commi
2017-11-16 13:31:22
576
原创 【Kafka源码】处理请求
一KafkaRequestHandlerPool二KafkaApishandle1 ApiKeys枚举类三Request数据结构1 requestId2 header3 body在KafkaServer中的入口在:apis = new KafkaApis(socketServer.requestChannel, replicaManager, groupCoordinator,
2017-11-15 10:42:59
998
原创 【Kafka源码】broker被选为controller之后的连锁反应
一controller epoch二注册监听器1 registerReassignedPartitionsListener11 initiateReassignReplicasForTopicPartition12 onPartitionReassignment2 registerIsrChangeNotificationListener3 registerPreferredReplic
2017-11-13 16:42:35
2628
原创 【Kafka源码】KafkaController启动过程
一入口二实例化Controller三Controller启动1 registerSessionExpirationListener11 onControllerResignation12 controllerElectorelect2 controllerElectorstartup21 leaderChangeListener22 elect之前聊过了很多Kafka启动过程中的一
2017-11-08 17:31:23
624
原创 【Kafka源码】ReplicaManager启动过程
一入口二ReplicaManager实例化三启动ReplicaManager1 maybeShrinkIsr2 maybePropagateIsrChanges在KafkaServer启动过程的入口中,会启动Replica Manager,众所周知,这是一个副本管理器。replica在Kafka中扮演的角色很重要,是保证消息不丢失的一个重要概念。replica的个人理解概念如下:produ
2017-11-08 11:26:25
485
原创 【Kafka源码】SocketServer启动过程
SocketServer主要用于接收外部的网络请求,并把请求添加到请求队列中。一、入口在KafkaServer.scala中的start方法中,有这样的入口:socketServer = new SocketServer(config, metrics, kafkaMetricsTime)socketServer.startup()这块就是启动了一个SocketServer,我们具体看一下。二、构
2017-11-07 14:16:38
588
原创 【Kafka源码】日志处理
目前来说,kafka的日志中记录的内容比较多,具体的存储内容见这篇博客,写的比较好。可以看到,存储的内容还是比较多的,当存储文件比较大的时候,我们应该如何处理这些日志?下面我们通过kafka启动过程的源码,分析下kafka的日志处理过程。一、入口方法在kafkaServer.scala中的start方法中,有一个这样的调用:/* start log manager */logManager = c
2017-11-06 21:12:10
1243
原创 【Kafka源码】Kafka启动过程
一般来说,我们是通过命令来启动kafka,但是命令的本质还是调用代码中的main方法,所以,我们重点看下启动类Kafka。源码下下来之后,我们也可以通过直接运行Kafka.scala中的main方法(需要指定启动参数,也就是server.properties的位置)来启动Kafka。因为kafka依赖zookeeper,所以我们需要提前启动zookeeper,然后在server.properties
2017-10-23 17:22:49
967
原创 【Kafka源码】Kafka代码模块
Kafka源码依赖于Scala环境,首先需要安装scala,这块请自行百度进行安装。传送门当然,我们要分析源码,需要下载源码,请自行从github上面下载。 说明:本文使用的kafka版本为0.10.0.1,这是目前公司使用的版本。下面说明下kafka源码的工程结构: 下面主要对core目录模块进行说明,这块是kafka的核心。admin:管理员模块,操作和管理topic,parition
2017-10-23 11:18:11
483
原创 【源码】canal和otter的高可靠性分析
一般来说,我们对于数据库最主要的要求就是:数据不丢。不管是主从复制,还是使用类似otter+canal这样的数据库同步方案,我们最基本的需求是,在数据不丢失的前提下,尽可能的保证系统的高可用,也就是在某个节点挂掉,或者数据库发生主从切换等情况下,我们的数据同步系统依然能够发挥它的作用–数据同步。本文讨论的场景是数据库发生主从切换,本文将从源码的角度,来看看otter和canal是如何保证高可用和高可
2017-10-17 15:35:25
933
翻译 【文档】七、Mysql Binlog不同事件类型的事件内容
下面主要讲述了每个类型的事件中的固定和可变部分的数据。Start_log_event_v3/START_EVENT_V3这个事件出现在v1或v3的binlog文件的开头部分。对于4.0和4.1版本的Mysql,这个事件只是被写在服务启动后的第一个binlog文件中,到达一定的条件后,会产生新的日志文件,但是新的日志文件中不包含这个事件。对于所有的Mysql5.0及以上版本,每个日志文件都会以FORM
2017-10-10 08:09:56
399
翻译 【文档】六、Mysql Binlog版本
binlog文件格式有以下几种: - v1:用于3.23版本 - v3:用于4.0.2到4.1版本 - v4:用于5.0及以上版本v2版本只在4.0.x版本中使用,目前已经不再支持了。处理binlog的程序必须支持以上所有的版本。这部分描述了服务器是如何区分所有的格式的,以便辨别binlog使用的版本。mysqlbinlog也是使用的相同的规则。重要的常量: - START_EVENT_V3
2017-10-10 08:09:25
749
翻译 【文档】五、Mysql Binlog事件结构
这个部分描述了事件被写入binlog或者delay log中的属性。所有的事件有相同的整体结构,也就是包含事件头和事件数据:+===================+| event header |+===================+| event data |+===================+具体的内容随着Mysql版本的升级而不同,这导致了binlo
2017-10-09 10:23:00
363
翻译 【文档】四、Mysql Binlog事件含义详解
下面对binlog中事件做个简单说明:UNKNOWN_EVENT这个事件类型应该永远不会出现。它从不会写入binlog中。如果binlog中的事件没法被识别成其他已知事件,他被当做UNKNOWN_EVENT。START_EVENT_V3在binlog文件最开始的符号事件(在Mysql的4.0和4.1版本中,这个事件只会在服务启动时,写到第一个binlog文件中)。这个事件在3.23到4.1版
2017-10-08 15:54:40
655
翻译 【文档】三、Mysql Binlog事件类文件和类型
在内部,服务器使用C++类文件来表示binlog事件。标准在log_event.h文件中,这些类的方法代码在log_event.cc中。log_event是基础类。其他的详细的事件子类都是来源于他。一个事件的二进制序列包含头和数据两部分。类型码在每个事件的头部出现。事件可能的类型码定义在log_event_type枚举类中:enum Log_event_type { UNKNOWN_EVENT
2017-10-08 15:04:52
424
翻译 【文档】二、Binlog结构和内容概述
binlog是一系列文件,这些文件包含了Mysql服务实例中数据的变化。 - binlog包含一系列二进制日志文件,还包含一个索引文件。 - 每个日志文件包含了一个4字节的魔法数,后面跟着描述数据变化的事件内容。 - 魔法数字可以是0xfe 0x62 0x69 0x6e=0xfe ‘b”i”n’(这是在log_event.h中定义的BINLOG_MAGIC常量) - 每个事件
2017-10-08 14:33:29
663
翻译 【文档】一、Mysql BinLog概述
Binlog是一系列日志文件,他们包含的内容是Mysql数据内容的改变。如果想开启binlog功能,需要在启动时带上–log-bin参数。binlog是从Mysql3.23.14版本开始的。它包含所有更新数据的sql语句。它还包含可能更新数据的语句(比如,删除不存在的数据行的语句),除非日志的记录是以基于行的。sql语句是以描述修改的事件形式存储的。binlog也包含每个语句的执行时间。binlog
2017-10-08 14:07:16
266
翻译 【Kafka】Consumer配置
从0.9.0.0开始,下面是消费者的配置。 名称 描述 类型 默认值 bootstrap.servers 消费者初始连接kafka集群时的地址列表。不管这边配置的什么地址,消费者会使用所有的kafka集群服务器。消费者会通过这些地址列表,找到所有的kafka集群机器。 list key.deserializer 实现了Deserializer的key的反序列化
2017-08-31 09:59:52
482
翻译 【Kafka】Producer配置
名称 描述 类型 默认值 bootstrap.servers kafka集群地址,ip+端口,以逗号隔开。不管这边配置的是什么服务器,客户端会使用所有的服务器。配置的列表只会影响初始发现所有主机。配置的格式应该是:ip:port,ip:port,因为配置的内容只是用于服务集群的初始发现(集群地址可能会变化),配置可以不包含所有的服务器(你可能需要配置多于一个,防止某个服务挂掉)
2017-08-29 14:08:42
2340
翻译 【Kafka】Broker之Server.properties的重要参数说明
名称 描述 类型 默认值 有效值区间 重要程度 zookeeper.connect zk地址 string 高 advertised.host.name 过时的:只有当advertised.listeners或listeners没有配置的时候才会生效。使用advertised.listeners代替。发布在zk上的hostname,供客户端使用。
2017-08-28 10:49:22
868
转载 【Guava】PreConditions来校验参数
前置条件:让方法调用的前置条件判断更简单。在我们的日常开发中,经常要对入参进行一定的参数校验,比如是否为空,参数的取值范围是否符合要求等等。这种参数校验如果我们单独进行校验的话,代码的重复率比较高,也不是很优雅。Guava提供了一个类PreConditions来统一校验我们的参数,同时可以抛出对应的异常信息,将参数校验的工作进行了统一。下面是它提供的几种校验方法: 方法声明(不包含额外参数)
2017-08-22 09:13:21
586
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人