Databus for Oracle
Databus组成
Relay :数据抓取端
- 读取数据源变更行(ROW),并将变更行数据序列化到内存缓冲区。
- 监听客户端请求并传输缓冲区的数据。
Client:数据客户端
- 检查Relay端的数据变更,并同步数据。
- 如果与Relay之间数据变更相差太大、会执行追溯功能。
注:单个客户端既可以处理全部Databus数据流,也可以作为集群的一部分处理一小部分数据流。
bootstrap-producer:追溯数据生产端
- 这是一个特殊客户端,用于将Relay上的变更数据存储到Mysql数据库。
- Mysql数据库用于追溯数据。
bootstrap-server:追溯数据服务端
- 监听Client端执行追溯的功能请求。
databus-example for Oracle
这里记录运行databus自带的person的example的过程。
- 首先准备Oracle环境,这里我安装的oracle-xe 11g 。管理员密码orale,sid:XE,端口1521。
- databus是用gradle构建的java应用,所以本地首先需要安装gradle环境和java环境。gradle版本>=1.8即可。java版本>=1.6即可。
- 在github上下载databus源代码,解压解压好目录是databus-master。
- 在oracle官网下载ojdbc6.jar重命名放到如下目录:
databus-master/sandbox-repo/com/oracle/ojdbc6/11.2.0.2.0/ojdbc6-11.2.0.2.0.jar
其实做好如上操作即可开始编译了,databus wiki是这么介绍了,不过看有人编译会指定utf-8编码,其实不需要,因为这里不涉及中文。
- 关于gradle版本,如果本地的gradle环境是5以前的,那么无所谓,如果是gradle5需要更改build.gradle文件。
task wrapper(type: Wrapper) {gradleVersion = '1.8'
}
改为如下,否则编译的时候会报错:Cannot add task ‘wrapper’ as a task with that name already exists
wrapper {gradleVersion = '1.8'
}
我本次编译使用版本是gradle5.1(试了最新的5.4.1编译太慢直接放弃了)
- 在com.linkedin.databus2.core.container.netty.ServerContainer的initializeContainerJmx()方法中添加如下内容。这里如果不更改在运行relay的时候会产生Cannot bind to URL rmi://localhost:1099 ServiceUnavailableException错误。
LocateRegistry.createRegistry(_containerStaticConfig.getJmx().getRmiRegistryPort());
最后完整结果:
protected void initializeContainerJmx(){if (_containerStaticConfig.getJmx().isRmiEnabled()){try{JMXServiceURL jmxServiceUrl =new JMXServiceURL("service:jmx:rmi://" +_containerStaticConfig.getJmx().getJmxServiceHost() + ":" +_containerStaticConfig.getJmx().getJmxServicePort() +"/jndi/rmi://" +_containerStaticConfig.getJmx().getRmiRegistryHost() + ":" +_containerStaticConfig.getJmx().getRmiRegistryPort() + "/jmxrmi" +_containerStaticConfig.getJmx().getJmxServicePort());LocateRegistry.createRegistry(_containerStaticConfig.getJmx().getRmiRegistryPort())_jmxConnServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxServiceUrl, null,getMbeanServer());}catch (Exception e){LOG.warn("Unable to instantiate JMX server", e);}}}
注意首行导包:import java.rmi.registry.LocateRegistry;
- 修改reateUser在第51行
sqlplus sys/oracle\@${DBNAME} as sysdba << __EOF__
这里我改为sys/oracle ,这是我的Oracle数据源的sysdba用户名密码。
- 修改sources-person.json,更改第4行,改为我们要连接的数据源信息。这里如果写错了那么运行clien的时候会报数据库连接错误。
{"name" : "person","id" : 1,"uri" : "jdbc:oracle:thin:person/person@localhost:1521:XE","slowSourceQueryThreshold" : 2000,"sources" :[{"id" : 101,"name" : "com.linkedin.events.example.person.Person","uri": "person.person","partitionFunction" : "constant:1"}]
}
以上都操作好了即可编译了:
gradle -Dopen_source=true assemble
java是向下兼容的,我用的jdk8,编译的时候只是会警告有些方法过期而已,是可以成功编译的。
编译好了会在build文件夹下生成很多编译后的文件。
在运行实例之前先要执行数据库脚本以及生成avro序列化文件
- 运行createUser
sh ./db/oracle/bin/createUser.sh person person xe tbs_person /u01/app/oracle/oradata/XE/person/
- 运行createSchema
cd ./db/oracle/fwk
sh /home/databus-master/db/oracle/bin/createSchema.sh person/person@xe /home/databus-master/databus2-example/database/person/
- 生成avro序列化文件
cd /home/databus-master/build/databus2-cmdline-tools-pkg/distributions
tar -zxvf databus2-cmdline-tools-pkg-2.0.0.tar.gz
cd bin
sh dbus2-avro-schema-gen.sh -namespace com.linkedin.events.example.person -recordName Person -viewName "sy\$person" -avroOutDir /home/databus-master/myperson-avro/avroOut -avroOutVersion 1 -javaOutDir /home/databus-master/myperson-avro/javaOut -userName person -password person -database jdbc:oracle:thin:@localhost:1521:xe
接下即可运行测试了。
- 运行relay
tar -zxvf build/databus2-example-relay-pkg/distributions/databus2-example-relay-pkg-2.0.0.tar.gz
sh start-example-relay.sh person
- 运行client
tar -zxvf build/databus2-example-client-pkg/distributions/databus2-example-client-pkg-2.0.0.tar.gz
sh start-example-client.sh person
- 开始测试,登录Oracle的person用户执行插入或者更新语句:
INSERT INTO person(id,first_name, last_name,birth_date) VALUES(1,'Trump', 'Donald',sysdate);
update person p set p.BIRTH_DATE = sysdate -100 where p.ID = 1;
- 可以在clien.log看到捕获的信息
但是我发现执行delete语句是无法捕获的,查看数据库脚本发现,databus-example在建立触发器的时候,只建立了inser/update的触发器,没有delete相关的触发器。
继续查文档,看到这个文档Databus-2.0-Client-Event-Model-and-Consumer-API.
其中Data Change Events章节中有提到可以捕获update(包含insert)和delete两个操作应该也是可以捕获的。
到此为止,我们能够捕获Oracle数据库变更的行信息。但需要针对每个表新加字段txn,对每个表建立触发器。但捕获到了的数据不像ogg一样可以直接同步到目标库,目前来看这部分需要写代码单独处理。
网络上关于databus的文章资料比较少,我整理了一下有价值的资料地址,我的实验也参考了下面的文章:
- databus/wiki
- inkedin 的 databus 部署
- databus bootstrap 部署
- Databus架构分析与初步实践(for mysql)(上篇)
- Databus架构分析与初步实践(for mysql)(下篇)
- Databus部分翻译
Databus for Oracle相关推荐
- databus 支持oracle么,Databus
系统如果要应付大规模的请求,一条必经之路就是数据库的分割,单服务器的性能早晚都会成为负载的短板.而数据库分割,通常有Master/Salve或者集群Cluster的方式,这些方式通常都是基于同种类型的 ...
- 微服务系列(五):事件驱动的数据管理
编者的话|本文来自 Nginx 官方博客,是「Chris Richardson 微服务」系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第三篇描述了微服务架构模块 ...
- 微服务实战(五):微服务的事件驱动数据管理
http://dockone.io/article/936 微服务实践(五):微服务的事件驱动数据管理 [编者的话]本文是使用微服务创建应用系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了 ...
- 微服务实践(五):微服务的事件驱动数据管理
[编者的话]本文是使用微服务创建应用系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二篇和第三篇描述了微服务架构模块间通讯的不同方面:第四篇研究了服务发现中的问题.本 ...
- 【转】微服务实践(五):微服务的事件驱动数据管理
[编者的话]本文是使用微服务创建应用系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第三篇描述了微服务架构模块间通讯的不同方面:第四篇研究了服务发现中的问题.本篇 ...
- 事件驱动数据管理 微服务和分布式数据管理问题
单体应用程序通常具有一个单一的关系型数据库.使用关系型数据库的一个主要优点是您的应用程序可以使用 ACID 事务,这些事务提供了以下重要保障: 原子性( Atomicity) 所作出的改变是原子操作, ...
- Mysql保存是事件驱动吗_【CHRIS RICHARDSON 微服务系列】事件驱动的数据管理-5
编者的话 |本文来自 Nginx 官方博客,是「Chris Richardson 微服务」系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第三篇描述了微服务架构模 ...
- 设计数据密集型应用 第五章:复制
设计数据密集型应用 第五章:复制 与可能出错的东西比,'不可能'出错的东西最显著的特点就是:一旦真的出错,通常就彻底玩完了. --道格拉斯·亚当斯(1992) 文章目录 设计数据密集型应用 第五章:复 ...
- 数据密集型应用——分布式数据复制
分布式数据 无共享架构中运行数据库软件的每台机器/虚拟机都称为节点,每个节点使用各自的处理器,内存和磁盘.节点之间的任何协调,都在软件层面使用传统网络实现.其数据分布在多个节点上有两种常见的方式:复制 ...
最新文章
- 怎么使一个浮点数删除小数部分C语言,如何得出一个浮点数的小数部分,要把各个位保存到一个数组里边。...
- EF code First数据迁移学习笔记
- manually set focus for tag library
- CNN常用卷积方法一览
- VLC测试IPv4 IGMP/IPv6 MLD协议
- php哈希取模,PHP取模hash和一致性hash操作Memcached分布式集群
- 使用Word2010直接编辑、发布博客→博客园cnblogs
- Linux内核多线程(五)
- ffmpeg 合并 flv 文件
- 先验概率、后验概率、贝叶斯公式的通俗解释
- 服务器机械硬盘坏了怎么修复,硬盘修复软件:如何修复硬盘错误?
- Linux logviewer的功能,基于终端的日志工具logview
- cml sml区别_【投资组合理论】CAL、CML、SML的区别和联系
- HashSet为什么要设置PRESENT
- 乐富支付:互联网金融下的民企新生态
- nginx基础:nginx访问限制
- 【黑苹果/Hackintosh】只能从usb启动,复制到磁盘efi分区启动无效问题解决
- D3D11的简单字体
- 集线器,交换机与路由器
- 既然心里活着的还是那个年轻人,我们申请跟未来的“小程序员”们一起过个节...
热门文章
- 012.西门子PLC对M440变频器三段速控制
- windows 快捷键大全 窗口最大化快捷键,最小化,重命名等
- 帝国CMS7.5情书模板/精美情书大全站/同步生成带手机站带采集
- 最佳线程数 6666 epoll触发量
- 【离散数学】实践一 用C语言实现二进制加法器
- 曼联客胜维拉:压力和低潮期下负重前行
- 再也不怕用错可视化图表,一文教你合理使用图表组件
- 在子域和域之间共享cookie
- android linearlayout 代码,Android如何从代码向另一个LinearLayout添加Linearlayout
- 无焦望远镜系统的优化