otter源码解读(一)

概览
lib存放的是项目依赖包,由于项目用到的包比较杂,可能有的包已经不在maven仓库中提供了,所以提供了一个lib包,执行里面的install命令,就可以把包安装到本地maven仓库。
manager是管理端源码,otter是一个典型的管理系统架构,manager用来管理以及配置各种资源,node,zookeeper,canal,datasource以及表这些实体资源均在manager端配置,其中manager把各个资源的工作流抽象成pipeline和channel,一个pipeline对应一个单向同步用到的资源和配置的集合,pipeline在channel中设置,一个channel是一个完整独立的工作单元,一个channel中可以有多个pipeline,比如:单向同步只需一个pipeline,双向同步需要两个方向相反的pipeline。在manager配置好各种资源之后就可以开启channel,开始同步数据了,启动之后的工作就交给node和zookeeper完成,就算manager崩了也不会终止同步。可以在manager关闭同步流程。
node是工作组件的源码,内嵌canal,完成从数据库dump binglog的工作(Select),binlog经过node中的ETL流程,被按照定义的行为同步到目标数据源。node中的SETL流程是整个otter中最经典也最关键的部分,其中用到了大量zookeeper分布式协作以及HA的功能,还多处使用了java并发知识。node中通过SEDA模型简化了串并行程序的复杂度,通过zookeeper保证了多节点可以协同工作,提高工作效率和资源利用率。比如单向同步的两个node就可以分布式协作,S/E在源端,T/L在目标端,E/T可并行,S/L必须串行执行。
shared是共用代码,主要实现了仲裁器的逻辑,setl中自定义逻辑以及节点间通讯逻辑和zk集群状态监控。
细说

com.alibaba.otter.manager.biz.autokeeper包主要完成manager端zk状态监控和数据采集的功能,
AutoKeeperCollector实现了自InitializingBean(Spring中的一个接口)
@Overridepublic void afterPropertiesSet() throws Exception {
collectorExecutor = Executors.newScheduledThreadPool(singleSize, new NamedThreadFactory("collector-thread",true));
startCollect();
}
并且被注册到spring容器中:
<bean id="autoKeeperCollector" class="com.alibaba.otter.manager.biz.autokeeper.impl.AutoKeeperCollector" >
<property name="collectInterval">
<value>300</value>
</property>
</bean>
所以容器一启动就会实例化AutoKeeperCollector,在AutoKeeperCollector中就会自动调用采集zk数据的代码。
AutoKeeperCollector中主要是通过远程调用zk的四字指令来完成对zk状态的查看:
private static final String CMD_STAT = "echo stat | nc %s %s";
private static final String CMD_CONS = "echo cons | nc %s %s";
private static final String CMD_DUMP = "echo dump | nc %s %s";
private static final String CMD_WCHC = "echo wchc | nc %s %s";
脚本调用是通过一个外部脚本调用工具Exec类完成的。
AutoKeeperPersist是数据持久化接口,被AutoKeeperData实现,AutoKeeperData主要用来持有zk数据,AutoKeeperPersist中的persist()持久化方法,被AutoKeeperCollector定时调用。
AutoKeeperCollector的startCollect()方法:
private void startCollect() {
// 启动定时工作任务
collectorExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
List<AutoKeeperCluster> autoKeeperClusters = autoKeeperClusterService.listAutoKeeperClusters();
if (!autoKeeperClusters.isEmpty()) {
autoKeeperData.persist();
for (AutoKeeperCluster autoKeeperCluster : autoKeeperClusters) {
List<String> servers = autoKeeperCluster.getServerList();
for (String address : servers) {//调用四字命令api
collectorServerStat(address);
collectorConnectionStat(address);
collectorWatchStat(address);
collectorEphemeralStat(address);
}
}
}
}
}, delay, collectInterval, TimeUnit.SECONDS);
}
AutoKeeperStatService定义了查询zk信息的接口:
/**
* 根据serverIp查询对应的统计信息,包括Connection/Watch/Ephemeral等统计信息
*
* @param serverIp
* @return
*/
public AutoKeeperServerStat findServerStat(String serverIp);
/**
* 根据sessionId查询对应的统计信息,包括详细的Connection/Watch/Ephemeral等统计信息
*
* @param sessionId
* @return
*/
public AutoKeeperServerStat findServerStatBySessionId(String sessionId);
/**
* 根据sessionId查询对应的connction链接
*
* @param sessionId
* @return
*/
public AutoKeeperConnectionStat findConnectionBySessionId(String sessionId);
/**
* 根据临时节点路径查询对应的connection统计信息
*
* @param path
* @return
*/
public AutoKeeperConnectionStat findConnectionByEphemeralPath(String path);
/**
* 根据watcher路径查询对应的connection统计信息
*
* @param path
* @return
*/
public List<AutoKeeperConnectionStat> findConnectionByWatcherPath(String path);
AutoKeeperStatServiceImpl是AutoKeeperStatService的实现, AutoKeeperStatServiceImpl也被注入到spring中:
<bean id="autoKeeperStatService"
class="com.alibaba.otter.manager.biz.autokeeper.impl.AutoKeeperStatServiceImpl">
</bean>
otter源码解读(一)的更多相关文章
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
- SDWebImage源码解读 之 NSData+ImageContentType
第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...
- SDWebImage源码解读 之 UIImage+GIF
第二篇 前言 本篇是和GIF相关的一个UIImage的分类.主要提供了三个方法: + (UIImage *)sd_animatedGIFNamed:(NSString *)name ----- 根据名 ...
- SDWebImage源码解读 之 SDWebImageCompat
第三篇 前言 本篇主要解读SDWebImage的配置文件.正如compat的定义,该配置文件主要是兼容Apple的其他设备.也许我们真实的开发平台只有一个,但考虑各个平台的兼容性,对于框架有着很重要的 ...
- SDWebImage源码解读_之SDWebImageDecoder
第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...
- SDWebImage源码解读之SDWebImageCache(上)
第五篇 前言 本篇主要讲解图片缓存类的知识,虽然只涉及了图片方面的缓存的设计,但思想同样适用于别的方面的设计.在架构上来说,缓存算是存储设计的一部分.我们把各种不同的存储内容按照功能进行切割后,图片缓 ...
- SDWebImage源码解读之SDWebImageCache(下)
第六篇 前言 我们在SDWebImageCache(上)中了解了这个缓存类大概的功能是什么?那么接下来就要看看这些功能是如何实现的? 再次强调,不管是图片的缓存还是其他各种不同形式的缓存,在原理上都极 ...
- AFNetworking 3.0 源码解读 总结(干货)(下)
承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...
- AFNetworking 3.0 源码解读 总结(干货)(上)
养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...
随机推荐
- OO电梯系列优化分享
目录 前言 HW5 HW6 第二次作业uml协作图 HW7 第三次作业uml协作图 前言 本单元作业在优化方面确实有一些想法值得分享,故单开一篇博客分享一下三次作业的优化以及架构. 三次作业的共同之处 ...
- 一文彻底搞定Hystrix!
前言 Netflix Hystrix断路器是什么? Netflix Hystrix是SOA/微服务架构中提供服务隔离.熔断.降级机制的工具/框架.Netflix Hystrix是断路器的一种实现,用于 ...
- Spring Boot入门学习
1. Spring Boot概述 1.1.什么是Spring Boot SpringBoot是一个可使用Java构建微服务的微框架.是Spring框架及其社区对"约定优先于配置"理 ...
- HMS Toolkit自动化环境配置,助您高效集成HMS Core
HMS Toolkit是一个IDE插件,提供包括应用创建.编码和转换.调测和测试.提交上架等多个端到端开发工具,借助HMS Toolkit可提升3倍以上集成开发效率,可以帮助开发者以更高的开发效率.更 ...
- hibernate的三种查询方式
hibernate的三种查询方式 目录 hibernate的三种查询方式 1.HQL查询 1.1.SQL概述 1.2.实体查询 1.3.带where的查询 1.3.属性查询 1.4.实体的更新和删除 ...
- 西门子PLC开发笔记(一):PLC介绍,西门子S1200系列接线、编程、下载和仿真
前言 西门西PLC.台达触摸屏.法兰克机床等等多年以前玩得比较多,改造机床.维修机床.给机床编程等等,没事还能扯个零件啥的,之前也没总结过,有时间就重新整理下. 本章后面以西门1200实物为例, ...
- TLS Poison - When TLS Hack you
0x00 前言 本次学习的是2020 Blackhat 的一篇文章When TLS Hacks you,简单来说,作者提出了一种新的SSRF攻击思路:利用DNS重绑定和TLS协议的会话恢复进行攻击.具 ...
- 这种ERP系统核查工作实际是在做无用功
前段时间跟朋友聊起他们公司持续了好几年的ERP核查工作,此时他正在一家分公司做核查.ERP核查工作我是知道的,一个季度一次,每个模块出一个人去子公司巡回巡查,主要核查ERP系统的使用情况. 核查工作主 ...
- hdu1146
题意: 题意最蛋疼,其实是水题,这个题意整的我wa了一个多小时,我就改改题意吧..有一条河,刚开始的时候在左岸有一条船,这条船最多能运n个货物,一趟的时间是t,有m个货物,每个货物有自己到 ...
- adbi学习:so hook实现机制
本篇我们来看看adbi的实现原理,其实里面的知识点前面差不多都有涉及了,没多少新知识.adbi利用hijack程序将libexample.so注入到指定的进程中,并且在进程中加载libexample. ...