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 ...
随机推荐
- PAT A1025 考生排名问题
题目要求:有n个考场,每个考场有若干个考生,现给出各个考场中考生的准考证号与分数,按照分数从高到低排序,并按顺序输出所有考生的准考证号,排名,考场号以及所在的考场排名 #include<cstd ...
- Java(25-40)【数据类型转换、运算符、方法入门】
1.ASCII编码表 0--48 A--65 a--97 2. Unicode万国码 字符'中'为20013 3.算数运算符 double类型的加上int类型结果为double byte short ...
- 001 - 使用鸿蒙WebView创建简单浏览器 step 1
打开官网,找到WebView的文档(模拟器不支持) 鸿蒙webview的开发指南(原始链接,方便大家识别并点击):https://developer.harmonyos.com/cn/docs/doc ...
- 《青橙商城》day01避坑指南
1.persistence-api报红 问题: 在模块qingcheng_pojo下的pom.xml中,报红 <dependencies> <dependency> <g ...
- ISODateTimeFormat 转换2019-08-15T00:36:49.366456463Z 日期格式
import java.text.*; import java.text.SimpleDateFormat; import java.util.*; import org.joda.time.Date ...
- Linux安装MySQL8高版本压缩包(通用)
前言 前段时间领导让我部署测试环境,希望安装高版本的MySQL,过程遇到很多问题,特此记录帮助迷失的人们 下载 MySQL官方下载地址:https://dev.mysql.com/downloads/ ...
- kali 中文乱码解决
在命令行输入"dpkg-reconfigure locales".进入图形化界面之后,(空格是选择,Tab是切换,*是选中),选中en_US.UTF-8和zh_CN.UTF-8,确 ...
- Python 巡检接入钉钉机器人
前段时间,为了快速实现巡检服务器设备的健康状态,我简单的写了一个巡检工具,该工具已经可以满足我的大部分需求了,不过,每次都要自己手动去点击巡检才能知道今天设备的状态,由于每天巡检严重影响我学习逆向技术 ...
- Android APK程序的smali动态调试
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/71250622 一.Apktool的下载和安装 Apktool是Android逆向分 ...
- hdu4909 状态压缩(偶数字符子串)
题意: 给你一个字符串,里面最多有一个'?','?'可以表示'a' - 'z',也可以什么都不表 示,这里要明确,什么都不表示不是不存在的意思,当aa什么都不表示的时候aa 也不等于aa? ...