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 ...
随机推荐
- 201871010110-李华 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 (1)理解并掌握代码风格及设计规范:(2)通过任务3进行协作开发,尝试进行代码复审,在进行同伴复审的过程中体会结对 ...
- Leedcode算法专题训练(哈希表)
Java 中的 HashSet 用于存储一个集合,可以查找元素是否在集合中.如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在.例如对于只有小写字符的元素,就可以用一个长度为 2 ...
- Druid 监控分布式解决方案
什么是 Druid Monitor Druid 是一个非常强大的数据库连接池,但是它的强大并不仅仅体现在作为一个高性能连接池加快数据访问上和连接管理上,它内置了一个强大的监控工具:Druid Moni ...
- Maven相关知识总结
目录 认识Maven Maven下载安装 Maven能用来做什么 Maven核心概念 开发目录 坐标和仓库 POM文件 POM文件内容 Maven依赖管理 构建生命周期 构建多模块系统 聚合 继承 聚 ...
- 面试有关TCP常问的几个问题
在面试中网络问题是一定会考察的,而TCP协议则是考察网络知识的重点.经常会被问道的问题如下: 请讲一下TCP协议建立连接的过程 请介绍TCP协议中的三次握手和四次挥手是怎么样的 为什么TCP协议要三次 ...
- Docker笔记(二) 安装常用软件
常用环境安装 这里收集一些常用环境的安装步骤,可直接复制进行使用,节省安装时间,后续会随时补充 安装MySQL5.7.32 下载mysql5.7.32的镜像 ( 记得下载镜像要先确保镜像仓库中存在这个 ...
- 06- web兼容性测试与web兼容性测试工具
web兼容性概述 定义:软件兼容性测试是指检查软件之间能否正确地进行交互和共享信息.随着用户对来自各种类型软件之间共享数据能力和充分利用空间同时执行多个程序能力的要求,测试软件之间能否协作变得越来越重 ...
- 【JVM】JVM中的垃圾收集器
垃圾收集器组合 Serial+Serial Old Serial+CMS ParNew+CMS ParNew+Serial Old Paralle Scavenge + Serial Old Para ...
- IIS6目录解析漏洞的实验
Windows 打开IIS管理器的方式 这个是网站IIS网站目录 右击默认网站中的属性,可以查看网站的属性,比如网站根目录,或者是端口 这个是网站的目录C:\www,有三个文件分别 ...
- windows-DLL注入
DLL注入 刚刚整理的代码注入(远程线程注入)现在整理这个DLL注入,DLL注入比较常用,相比远程代码注入DLL注入没有什么太多的限制,而且实现起来比较简单,当然远程线程需要注意的问题DLL很 ...