概览

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源码解读(一)的更多相关文章

  1. SDWebImage源码解读之SDWebImageDownloaderOperation

    第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...

  2. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  3. SDWebImage源码解读 之 UIImage+GIF

    第二篇 前言 本篇是和GIF相关的一个UIImage的分类.主要提供了三个方法: + (UIImage *)sd_animatedGIFNamed:(NSString *)name ----- 根据名 ...

  4. SDWebImage源码解读 之 SDWebImageCompat

    第三篇 前言 本篇主要解读SDWebImage的配置文件.正如compat的定义,该配置文件主要是兼容Apple的其他设备.也许我们真实的开发平台只有一个,但考虑各个平台的兼容性,对于框架有着很重要的 ...

  5. SDWebImage源码解读_之SDWebImageDecoder

    第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...

  6. SDWebImage源码解读之SDWebImageCache(上)

    第五篇 前言 本篇主要讲解图片缓存类的知识,虽然只涉及了图片方面的缓存的设计,但思想同样适用于别的方面的设计.在架构上来说,缓存算是存储设计的一部分.我们把各种不同的存储内容按照功能进行切割后,图片缓 ...

  7. SDWebImage源码解读之SDWebImageCache(下)

    第六篇 前言 我们在SDWebImageCache(上)中了解了这个缓存类大概的功能是什么?那么接下来就要看看这些功能是如何实现的? 再次强调,不管是图片的缓存还是其他各种不同形式的缓存,在原理上都极 ...

  8. AFNetworking 3.0 源码解读 总结(干货)(下)

    承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...

  9. AFNetworking 3.0 源码解读 总结(干货)(上)

    养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...

随机推荐

  1. 201871030108-冯永萍 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    实验三 软件工程结对项目 项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs ...

  2. 软工案例分析之OJ

    项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 案例分析作业要求 我在这个课程的目标是 和我的团队开发一个真正的软件,一起提升开发与合作的能力 这 ...

  3. Toolkit 大更新:UI 更美观,用起来更方便!

    前言 前段时间有小伙伴在群里聊天,说到 Toolkit 下载量到 4.9k 了.就突然想起来,很久没有更新这个插件. PS:我是用它申请了 License,一般时候使用 Json 格式化功能. 趁着周 ...

  4. JavaWeb 补充(Servlet)

    Servlet: server applet 概念: 运行在服务器端的小程序     * Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则.     * 将来我们自 ...

  5. 曾侯乙编钟引发的遐想之Java设计模式:状态模式

    目录 示例 简单例子 改进代码 状态模式 定义 意图 主要解决问题 何时使用 优缺点 曾侯乙编钟 状态模式-命令模式-策略模式 示例 一个类对外提供了多个行为,同时该类对象有多种状态,不同状态下对外的 ...

  6. eks 使用案例 部署jenkins

    https://aws.amazon.com/cn/blogs/storage/deploying-jenkins-on-amazon-eks-with-amazon-efs/ 这个链接挺好的,包含了 ...

  7. seaweedfs分布式文件使用示例

    安装seaweedfs分布式文件存储 启动一个测试集群:2 filer(8801-8802) + 3 master(9331-9333) + 3 volume(8081-8083) 下载seaweed ...

  8. 华中科大MOOC 操作系统原理讨论题

    1没有安装操作系统的计算机启动过程和结果? 启动会比较快,但功能很局限,无法使用常见的软件应用,对于普通用户来说,功能很局限,对于专业工程师来说,想使用没有操作系统的计算机也有难度.启动后进入 BIO ...

  9. 我的自定义多交互live2d折腾经历

    在@m0d1 大佬的督促(?)下有了这篇复盘.不过因为可能很多地方讲得不全面+理解不够深入,故不打算把这篇当成是教程/指南,那就算是一个指北吧= = (划重点:不是教程!不是教程!不是教程! 省流简介 ...

  10. Semi-Prime(set)

    Prime Number Definition An integer greater than one is called a prime number if its only positive di ...