读取数据源变更行(ROW),并将变更行数据序列化到内存缓冲区。
监听客户端请求并传输缓冲区的数据。
检查Relay端的数据变更,并同步数据。
如果与Relay之间数据变更相差太大、会执行追溯功能。
注:单个客户端既可以处理全部Databus数据流,也可以作为集群的一部分处理一小部分数据流。
1.这是一个特殊客户端,用于将Relay上的变更数据存储到Mysql数据库。
2.Mysql数据库用于追溯数据。
1.监听Client端执行追溯的功能请求。
这里记录运行databus自带的person的example的过程。
1.首先准备Oracle环境,这里我安装的oracle-xe 11g 。管理员person,密码person,sid:ORCL,端口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编码,其实不需要,因为这里不涉及中文。
5.关于gradle版本,如果本地的gradle环境是5以前的,那么无所谓,如果是gradle5需要更改build.gradle文件。
文件所在路径:cd databus-master/
task wrapper(type: Wrapper) {
gradleVersion = ‘1.8’
}
注:改为如下,否则编译的时候会报错:Cannot add task ‘wrapper’ as a task with that name already exists
wrapper {
gradleVersion = ‘1.8’
}
tasks.withType(JavaCompile) { options.encoding = “UTF-8” }
本次编译使用版本是gradle5.4
效果图1:
6.在com.linkedin.databus2.core.container.netty.ServerContainer的initializeContainerJmx()方法中添加如下内容。这里如果不更改在运行relay的时候会产生Cannot bind to URL rmi://localhost:1099 ServiceUnavailableException错误。
文件路径:
cd /home/databus-master/databus-core/databus-core-container/src/main/java/com/linkedin/databus2/core/container/netty
添加:
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;
效果图2-1:
效果图2-2:
7.修改reateUser在第51行
文件路径:
cd /home/databus-master/db/oracle/bin
sqlplus admin/admin\@${DBNAME} as sysdba << __EOF__
这里改为admin/admin,这是我的Oracle数据源的sysdba用户名密码
效果图3:
8.修改sources-person.json,更改第4行,改为我们要连接的数据源信息。这里如果写错了那么运行clien的时候会报数据库连接错误。
文件路径
/home/databus-master/databus2-example/databus2-example-relay-pkg/conf
注:如果最后发现relay启动后,client连接不上,这里的localhost最好改为ip地址
{
"name" : "person",
"id" : 1,
"uri" : "jdbc:oracle:thin:person/person@localhost:1521:orcl",
"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文件夹下生成很多编译后的文件。
效果图5:
cd /home/databus-master/build
10.在运行实例之前先要执行数据库脚本以及生成AVRO序列化文件
此处是为了添加用户,以及表空间。tbs_databus,对应的是/home/databus-master/databus2-example/database/person/中tablespace文件的值
cd /home/databus-master/db/oracle/bin
sh ./createUser.sh person person orcl tbs_databus /home/oracle/dbf/
注:该sh脚本中有一些适应性参数需要调整,比如脚本里默认的临时表空间为tmp1。本人设置的临时表空间是tmp。故需要修改:
效果图6:
此处是为数据库添加package、index、主键、procedure、trigger
cd /home/databus-master/db/oracle/fwk
sh /home/databus-master/db/oracle/bin/createSchema.sh person/person@orcl /home/databus-master/databus2-example/database/person/
如 com.linkedin.events.example.person.Person.1.avsc com.linkedin.events.example.person.Person_V1.java
这步可以省略 官方的例子已经给你生成好了
avroOutDir javaOutDir 自定义 不需要太准确 生成好之后 拷贝到相应的目录就可以了
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 ADMIN -password admin -database jdbc:oracle:thin:@127.0.0.1:1521:ORCL
接下即可运行测试了。
运行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看到捕获的信息
效果图7:
DataBus该项目是使用gradle构建的,其需要导入redis的依赖,此处使用简单的例子演示:
1、下载redis,配置redis.conf,使得redis可以后台运行,并把bind配置为本机ip
2、在databus-master\下的subprojects.gradle中添加jedis的依赖:
效果图8如下:
3、进入cd /home/databus-master/databus2-example/databus2-example-client/,编辑build.gradle,引用redis依赖
效果图9如下:
4.进入
/home/databus-master/databus2-example/databus2-example-client/src/main/java/com/linkedin/databus/client/example,编辑PersonConsumer.java,在processEvent方法中写业务逻辑:
5.最终编译,重复操作8-10
在person表中插入数据,最终可以在redis中看到变化的值: