Databus中文教程


简介

在互联网架构中,数据系统通常归类于真实源系统,作为主要的存储,服务于用户的写入、以及数据存储或为读取和其他复杂的查询提供索引。二级存储里的数据经常从主数据存储中获得,并经过自定义的转化、有时通过复杂的逻辑处理。同样的,数据缓存层的数据也来源于主数据存储。但是当主数据变化时需要将数据刷新或者置为无效。在这些各式各样的数据结构中基本的要求就是保证可靠的数据捕获,流转和处理主数据变化。

我们建立了Databus,一个隐藏源的分布式数据变化捕获系统,它是LinkedIn的数据处理通道不可或缺的一部分。Databus传输层提供了毫秒级的低延迟,且每台服务器的吞吐量每秒可以处理数千事件,同时支持无限的回溯功能和丰富的订阅功能。

用例

通常情况下,主OLTP数据存储处理用户的写入和少量读取,而其他的定制化的系统提供复杂的查询或者从缓存中加速查询。这种架构中最常见的数据系统包括关系型数据库,NoSQL数据存储,缓存引擎,搜索索引和图像搜索引擎。这个专业化的系统关键在于有一个可靠和可扩展的数据管道,这个数据管道可以捕捉这些数据系统的数据变化,并通过其他复杂的系统路由它们。构建这样的数据管道有两个解决方案。

应用驱动双写

这个模型中,应用层写入数据库的同时,写入另一个消息系统。这看起来通过应用代码写数据库很容易实现,而且在我们的控制中。然而它引入了一个一致性问题,因为没有一个复杂的协调协议(比如两阶段提交),很难保证数据库和消息系统共同完成和共同失败。所有的系统都需要处理完全相同的写入,并需要将它们序列化到完全相同的序列中。如果写入操作有条件或者部分更新,就会更加复杂。

数据库日志挖掘

这个模型中,我们从数据库的事务和提交的日志中抽取变更。这就解决了我们的一致性问题,但是实际上很难实现,因为数据库像Oracle和Mysql(在LinkedIn中主要的存储工具)有事务日志格式和自己的主从复制方案,不能在升级的过程中保证稳定的磁盘操作。如果我们用应用处理数据变更并写入二级数据存储,我们需要备份系统成为用户空间和隐藏源的。这在快速发展的技术公司中数据源的独立性非常重要,因为它避免了应用中的锁和二进制接口。

结合以上两种方式的优缺点,我们决定使用日志挖掘方式,优先考虑易于实现的一致性和“单一真实源”。在本文中,我们引入了Databus,在LinkedIn内部的数据变更捕获通道,它支持Oracle数据源和广泛的下游应用。社交图索引支持LinkedIn所有的图像查询,支持所有成员查询的人物搜索索引和各种读取副本,而且通过Databus保持一致的。

更详细的结构、用例和性能评价,在2012年的云计算ACM研讨会上发表的http://www.slideshare.net/ShirshankaDas/databus-socc-2012

如何构建?

Databus需要一个ORACLE许可的分布式库,请在这里接受这个许可,并在这里下载11.2.0.2.0版本的ojdbc6.jar。下载了驱动jar之后,请将它拷贝到sandbox-repo/com/oracle/ojdbc6/11.2.0.2.0/下,并重名为ojdbc6-11.2.0.2.0.jar,我们已经提供了一个.ivy文件示例帮助你构建。

没有这一步Databus不会构建。下载jar之后,拷贝到sandbox-repo文件夹下:

  • sandbox-repo/com/oracle/ojdbc6/11.2.0.2.0/ojdbc6-11.2.0.2.0.jar
  • sandbox-repo/com/oracle/ojdbc6/11.2.0.2.0/ojdbc6-11.2.0.2.0.ivy

构建系统

当前Databus需要gradle1.0或者更高版本。构建的命令是:

  • gradle -Dopen_source=true assemble -- 构建jar和命令行包
  • gradle -Dopen_source=true clean -- 清理构建路径
  • gradle -Dopen_source=true test -- 运行所有打好包的单元测试

许可

Databus将基于Apache2.0许可下授权。

完整文档

wiki中有完整的文档和示例。

Relay示例

PersonRelayServer.java是编写的DatabusRelay示例。它能够启动一个relay进程,源代码被打包成可启动的命令行包。压缩文件在build/databus2-example-relay-pkg/distributions/databus2-example-relay-pkg.tgz。这个relay获取"Person"视图的变更流。

解压成文件夹后,请用cd进入目录并用下面的命令启动relay:

  • ./bin/start-example-relay.sh person

如果relay启动成功,curl命令就会有下面的输出:

  • $ curl http://localhost:11115/sources
  • [{“name”:“com.linkedin.events.example.person.Person”,“id”:40}]

Client示例

PersonClientMain.java是DatabusClient的示例。它可以轻松的启动客户端进程,源代码被打包成可启动的命令行包。压缩包在build/databus2-example-client-pkg/distributions/databus2-example-client-pkg.tgz。这个客户端从之前启动的relay获取数据,并订阅Person表。

解压到一个文件夹中后,请使用cd进入目录并使用以下命令启动:

  • ./bin/start-example-client.sh person

如果客户端成功的连接到我们先前创建的relay,使用curl命令会有以下的输出(表明有一个从localhost连接到relay的客户端):

  • $curl http://localhost:11115/relayStats/outbound/http/clients
  • ["localhost"]

原创文章,转载请注明出处:转载自小马过河 - Databus中文教程


马军伟
关于作者 马军伟
写的不错,支持一下

先给自己定个小目标,日更一新。