Databus for Oracle

Databus for OracleDatabus组成Relay:数据抓取端读取数据源变更行(ROW),并将变更行数据序列化到内存缓冲区。监听客户端请求并传输缓冲区的数据。Client:数据客户端检查Relay端的数据变更,并同步数据。如果与Relay之间数据变更相差太大、会执行追溯功能。注:单个客户端既可以处理全部Databus数据流,也可以作为集群的一部分处理一小部分数据流。bootstrap-pr…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

Databus组成

Relay :数据抓取端

  • 读取数据源变更行(ROW),并将变更行数据序列化到内存缓冲区。
  • 监听客户端请求并传输缓冲区的数据。

Client:数据客户端

  • 检查Relay端的数据变更,并同步数据。
  • 如果与Relay之间数据变更相差太大、会执行追溯功能。

注:单个客户端既可以处理全部Databus数据流,也可以作为集群的一部分处理一小部分数据流。

bootstrap-producer:追溯数据生产端

  1. 这是一个特殊客户端,用于将Relay上的变更数据存储到Mysql数据库。
  2. Mysql数据库用于追溯数据。

bootstrap-server:追溯数据服务端

  1. 监听Client端执行追溯的功能请求。

databus-example for Oracle

这里记录运行databus自带的person的example的过程。

  1. 首先准备Oracle环境,这里我安装的oracle-xe 11g 。管理员密码orale,sid:XE,端口1521。
  2. databus是用gradle构建的java应用,所以本地首先需要安装gradle环境和java环境。gradle版本>=1.8即可。java版本>=1.6即可。
  3. 在github上下载databus源代码,解压解压好目录是databus-master。
  4. 在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编码,其实不需要,因为这里不涉及中文。

  1. 关于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编译太慢直接放弃了)

  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;

  1. 修改reateUser在第51行
 sqlplus sys/oracle\@${DBNAME} as sysdba << __EOF__

这里我改为sys/oracle ,这是我的Oracle数据源的sysdba用户名密码。

  1. 修改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

Databus for Oracle

java是向下兼容的,我用的jdk8,编译的时候只是会警告有些方法过期而已,是可以成功编译的。
编译好了会在build文件夹下生成很多编译后的文件。

在运行实例之前先要执行数据库脚本以及生成avro序列化文件

  1. 运行createUser
 sh ./db/oracle/bin/createUser.sh person person xe tbs_person /u01/app/oracle/oradata/XE/person/
  1. 运行createSchema
cd ./db/oracle/fwk
sh /home/databus-master/db/oracle/bin/createSchema.sh person/person@xe /home/databus-master/databus2-example/database/person/
  1. 生成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

接下即可运行测试了。

  1. 运行relay
tar -zxvf build/databus2-example-relay-pkg/distributions/databus2-example-relay-pkg-2.0.0.tar.gz
sh start-example-relay.sh person
  1. 运行client
tar -zxvf build/databus2-example-client-pkg/distributions/databus2-example-client-pkg-2.0.0.tar.gz
sh start-example-client.sh person 
  1. 开始测试,登录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;
  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的文章资料比较少,我整理了一下有价值的资料地址,我的实验也参考了下面的文章:

  1. databus/wiki
  2. inkedin 的 databus 部署
  3. databus bootstrap 部署
  4. Databus架构分析与初步实践(for mysql)(上篇)
  5. Databus架构分析与初步实践(for mysql)(下篇)
  6. Databus部分翻译
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181285.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • make menuconfig学习

    make menuconfig学习1.简介menuconfig是一套图像化配置工具,由ncurses库提供软件支持。ncurses库提供了一系列的函数以便使用者调用它们去生成基于文本的用户界面。menuconfig本身的软件只负责提供menuconfig工作的这一套逻辑,比如说通过上下左右调整光标,Enter选中等,并不负责提供内容。menuconfig运行之后会读取Kconfig、读取/写入.config文件,Kconfi…

    2022年5月20日
    83
  • 安装 | 最新MATLAB 2020b(64位)安装教程完整版[通俗易懂]

    安装 | 最新MATLAB 2020b(64位)安装教程完整版[通俗易懂]博主github:https://github.com/MichaelBeechan博主CSDN:https://blog.csdn.net/u011344545精简安装链接:https://blog.csdn.net/u011344545/article/details/109728674下载链接链接:https://pan.baidu.com/s/1g61g2qJO2MtZVkeMsuxhuQ提取码:打赏连接:https://blog.csdn.net/u011344545/article/

    2022年5月10日
    63
  • SpringBoot❤SpringClould常用注解史诗级汇总[通俗易懂]

    SpringBoot❤SpringClould常用注解史诗级汇总[通俗易懂]什么是注解?什什么是注解Java注解是附加在代码中的⼀一些元信息,⽤用于⼀一些⼯工具在编译、运⾏行行时进⾏行行解析和使⽤用,起到说明、配置的功能注解本质上继承Annotation接⼝口,我们可以通过反射获取注解的相关信息,从⽽而做些逻辑操作springboot⾥里里⾯面⼤大量量使⽤用了了注解,@Controller、@RestController、@Service、@Autowire等一、SpringBoot注解1.1.@SpringBootApplication包含@Confi

    2022年7月20日
    10
  • 如何用matlab编写分段函数_matlab里分段函数怎么写

    如何用matlab编写分段函数_matlab里分段函数怎么写1.matlab如何写分段函数最低0.27元开通文库会员,查看完整内容>原发布者:295931600一元分段函数图2.二元分段函数绘图例如:把下面的函数保存为_xy.m文件functionPxy=Piecewise_xy(x,y)Pxy=0.5457*exp(-0.75*y^2-3.75*x^2-1.5*x).*(x+y>1)+。0.7575*exp(-y^2-6*x^2).*(…

    2022年4月30日
    242
  • idea202112激活码永久【永久激活】

    (idea202112激活码永久)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月21日
    96
  • android之实现打开相册、拍照录像、播放视频、保存图片到系统相册\指定位置、图片压缩[通俗易懂]

    android之实现打开相册、拍照录像、播放视频、保存图片到系统相册\指定位置、图片压缩[通俗易懂]———照相录像——//实现照相、录像的功能publicvoidcameraForphoto(){Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);Filefile=newFile(Environment.getExternalStorageDirecto…

    2022年9月16日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号