论坛首页 Java企业应用论坛

阿里巴巴开源项目: 基于mysql数据库binlog的增量订阅&消费

浏览 54860 次
精华帖 (5) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-03-13  
kongshanxuelin 写道
实际应用中碰到一个问题:当client关掉时,再次期间内的增量数据,在client重新启动后,这些增量数据不会通知到client?


对了,我给的那个sample例子的配置是不能做到重新通知的

因为quick start的那份配置,是基于memory模式保存上一次binlog消费的位置,一旦你重启或者客户端断开,位置信息就会丢失,然后就会继续从当前binlog的最新位置给你消费。

如果你要使用可以持久化binlog位置信息的功能,需要修改 canal.properties文件

#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml


使用default-instance.xml模式,但这个模式目前需要依赖一个zookeeper环境。

最近比较忙,这块详细的AdminGuide/DevGuide文档还没补上,如果有问题,可以给我留言
0 请登录后投票
   发表时间:2013-03-13  
或者可以考虑实现一份基于本地File存储binlog位置信息,这样可以不依赖zookeeper,我记录一个issue,等空点了就实现一把
0 请登录后投票
   发表时间:2013-03-13  
agapple 写道
或者可以考虑实现一份基于本地File存储binlog位置信息,这样可以不依赖zookeeper,我记录一个issue,等空点了就实现一把

有没有详细一点的文档啊?如果基于内存,就比较悲剧,我现在只能捕获一下client的断开连接的信号,然后去重启,因为我要用在一个实时性要求很高但可靠性要求不那么高的场合,所以凑合着先用,不过最好能给出一点详细文档,比如如何扩展,这简单一句确实让人莫捕捉头脑啊
0 请登录后投票
   发表时间:2013-03-13   最后修改:2013-03-13
agapple 写道
kongshanxuelin 写道
实际应用中碰到一个问题:当client关掉时,再次期间内的增量数据,在client重新启动后,这些增量数据不会通知到client?


对了,我给的那个sample例子的配置是不能做到重新通知的

因为quick start的那份配置,是基于memory模式保存上一次binlog消费的位置,一旦你重启或者客户端断开,位置信息就会丢失,然后就会继续从当前binlog的最新位置给你消费。

如果你要使用可以持久化binlog位置信息的功能,需要修改 canal.properties文件

#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml


使用default-instance.xml模式,但这个模式目前需要依赖一个zookeeper环境。

最近比较忙,这块详细的AdminGuide/DevGuide文档还没补上,如果有问题,可以给我留言


怎么配?什么版本?望回复!
0 请登录后投票
   发表时间:2013-03-13  
kongshanxuelin 写道
agapple 写道
kongshanxuelin 写道
实际应用中碰到一个问题:当client关掉时,再次期间内的增量数据,在client重新启动后,这些增量数据不会通知到client?


对了,我给的那个sample例子的配置是不能做到重新通知的

因为quick start的那份配置,是基于memory模式保存上一次binlog消费的位置,一旦你重启或者客户端断开,位置信息就会丢失,然后就会继续从当前binlog的最新位置给你消费。

如果你要使用可以持久化binlog位置信息的功能,需要修改 canal.properties文件

#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml


使用default-instance.xml模式,但这个模式目前需要依赖一个zookeeper环境。

最近比较忙,这块详细的AdminGuide/DevGuide文档还没补上,如果有问题,可以给我留言


怎么配?什么版本?望回复!


最新稳定版本: https://raw.github.com/alibaba/canal/gh-pages/download/canal.deployer-1.0.2.tar.gz

配置带存储的步骤:
1. 下载zookeeper,搭建zookeeper环境
建议用zookeeper 3.4.5稳定版本,官方文档:http://zookeeper.apache.org/doc/r3.4.5/zookeeperAdmin.html

至于如何搭建我就不细说了,网上一搜一大把

2. 下载canal版本,最新是1.0.2版本,刚发布 (目前我们自己在用主要也就这版本)

3. 部署canal
a. 解压缩
mkdir canal
tar canal.deployer-1.0.2.tar.gz -C canal

b. 修改配置文件
vi conf/canal.properties

主要修改2点:
canal.zkServers=10.20.144.22:2181,10.20.144.51:2181 ##填上你第一步搭建的zookeeper环境地址

#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml

默认为memory,注意屏蔽掉,前面加个#号,然后放开default-instance.xml的配置,去掉前面的#号

其他的instance.properties配置,请参考我的quickstart中的配置,https://github.com/alibaba/canal/wiki/QuickStart

4. 启动.

5. 客户端链接
  客户端发生了数据消费后,canal server会在zookeeper上记录相应的消费位点,下次重新启动时就可以继续上一次位点,不会发生数据丢失.
[zk: localhost:2181(CONNECTED) 0] get /otter/canal/destinations/example/1001/cursor
{"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"10.20.144.15","port":3306}},"postion":{"included":false,"journalName":"mysql-bin.002072","position":58682700,"timestamp":1363173461000}}


如有问题,请及时联系
0 请登录后投票
   发表时间:2013-03-14   最后修改:2013-03-14
agapple 写道
kongshanxuelin 写道
agapple 写道
kongshanxuelin 写道
实际应用中碰到一个问题:当client关掉时,再次期间内的增量数据,在client重新启动后,这些增量数据不会通知到client?


对了,我给的那个sample例子的配置是不能做到重新通知的

因为quick start的那份配置,是基于memory模式保存上一次binlog消费的位置,一旦你重启或者客户端断开,位置信息就会丢失,然后就会继续从当前binlog的最新位置给你消费。

如果你要使用可以持久化binlog位置信息的功能,需要修改 canal.properties文件

#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml


使用default-instance.xml模式,但这个模式目前需要依赖一个zookeeper环境。

最近比较忙,这块详细的AdminGuide/DevGuide文档还没补上,如果有问题,可以给我留言


怎么配?什么版本?望回复!


最新稳定版本: https://raw.github.com/alibaba/canal/gh-pages/download/canal.deployer-1.0.2.tar.gz

配置带存储的步骤:
1. 下载zookeeper,搭建zookeeper环境
建议用zookeeper 3.4.5稳定版本,官方文档:http://zookeeper.apache.org/doc/r3.4.5/zookeeperAdmin.html

至于如何搭建我就不细说了,网上一搜一大把

2. 下载canal版本,最新是1.0.2版本,刚发布 (目前我们自己在用主要也就这版本)

3. 部署canal
a. 解压缩
mkdir canal
tar canal.deployer-1.0.2.tar.gz -C canal

b. 修改配置文件
vi conf/canal.properties

主要修改2点:
canal.zkServers=10.20.144.22:2181,10.20.144.51:2181 ##填上你第一步搭建的zookeeper环境地址

#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml

默认为memory,注意屏蔽掉,前面加个#号,然后放开default-instance.xml的配置,去掉前面的#号

其他的instance.properties配置,请参考我的quickstart中的配置,https://github.com/alibaba/canal/wiki/QuickStart

4. 启动.

5. 客户端链接
  客户端发生了数据消费后,canal server会在zookeeper上记录相应的消费位点,下次重新启动时就可以继续上一次位点,不会发生数据丢失.
[zk: localhost:2181(CONNECTED) 0] get /otter/canal/destinations/example/1001/cursor
{"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"10.20.144.15","port":3306}},"postion":{"included":false,"journalName":"mysql-bin.002072","position":58682700,"timestamp":1363173461000}}


如有问题,请及时联系


感谢,可以了:),我们也有很多跨机房的实时同步数据的需求,以前都是用JMS做的,先小范围内试用一下,觉得可以的话,以后就用你这个做数据同步了,alibaba在java开源方面还是做的相当不错的:)
0 请登录后投票
   发表时间:2013-03-14  
kongshanxuelin 写道
agapple 写道
kongshanxuelin 写道
agapple 写道
kongshanxuelin 写道
实际应用中碰到一个问题:当client关掉时,再次期间内的增量数据,在client重新启动后,这些增量数据不会通知到client?


对了,我给的那个sample例子的配置是不能做到重新通知的

因为quick start的那份配置,是基于memory模式保存上一次binlog消费的位置,一旦你重启或者客户端断开,位置信息就会丢失,然后就会继续从当前binlog的最新位置给你消费。

如果你要使用可以持久化binlog位置信息的功能,需要修改 canal.properties文件

#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml


使用default-instance.xml模式,但这个模式目前需要依赖一个zookeeper环境。

最近比较忙,这块详细的AdminGuide/DevGuide文档还没补上,如果有问题,可以给我留言


怎么配?什么版本?望回复!


最新稳定版本: https://raw.github.com/alibaba/canal/gh-pages/download/canal.deployer-1.0.2.tar.gz

配置带存储的步骤:
1. 下载zookeeper,搭建zookeeper环境
建议用zookeeper 3.4.5稳定版本,官方文档:http://zookeeper.apache.org/doc/r3.4.5/zookeeperAdmin.html

至于如何搭建我就不细说了,网上一搜一大把

2. 下载canal版本,最新是1.0.2版本,刚发布 (目前我们自己在用主要也就这版本)

3. 部署canal
a. 解压缩
mkdir canal
tar canal.deployer-1.0.2.tar.gz -C canal

b. 修改配置文件
vi conf/canal.properties

主要修改2点:
canal.zkServers=10.20.144.22:2181,10.20.144.51:2181 ##填上你第一步搭建的zookeeper环境地址

#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml

默认为memory,注意屏蔽掉,前面加个#号,然后放开default-instance.xml的配置,去掉前面的#号

其他的instance.properties配置,请参考我的quickstart中的配置,https://github.com/alibaba/canal/wiki/QuickStart

4. 启动.

5. 客户端链接
  客户端发生了数据消费后,canal server会在zookeeper上记录相应的消费位点,下次重新启动时就可以继续上一次位点,不会发生数据丢失.
[zk: localhost:2181(CONNECTED) 0] get /otter/canal/destinations/example/1001/cursor
{"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"10.20.144.15","port":3306}},"postion":{"included":false,"journalName":"mysql-bin.002072","position":58682700,"timestamp":1363173461000}}


如有问题,请及时联系


感谢,可以了:),我们也有很多跨机房的实时同步数据的需求,以前都是用JMS做的,先小范围内试用一下,觉得可以的话,以后就用你这个做数据同步了,alibaba在java开源方面还是做的相当不错的:)


多谢支持,目前canal支持mysql解析会有些限制,具体issue: https://github.com/alibaba/canal/issues/10

避免的操作:
1. 业务操作避免带删除性质的ddl,比如字段删除,rename table , drop table
2. 业务操作避免添加字段时调整顺序,只能添加到末尾.

如果真不可避免出现出现上述操作中的情况,只要不回退canal解析位置,就可以正常往下解析,不会出现数据错乱.
不过需要考虑:当canal解析延迟比较大,此时进行带删除性质的ddl操作,待解析的binlog中还存在对应ddl的表数据,那还是会出现问题。(尽可能选择合适的时间进行ddl操作)

-------------------- 华丽的分割线

目前canal只是解决了数据的增量变更获取,后面有一个专门的产品otter,解决数据库同步的问题。

目前支持的数据库同步:
1. 单向同步
2. 双向同步
3. 双A同步

双A和双向的区别,双A会在两地同一时间,修改同一条记录,目前otter可以保证双A机房的数据最终一致性
0 请登录后投票
   发表时间:2013-03-15  
agapple 写道
kongshanxuelin 写道
agapple 写道
kongshanxuelin 写道
agapple 写道
kongshanxuelin 写道
实际应用中碰到一个问题:当client关掉时,再次期间内的增量数据,在client重新启动后,这些增量数据不会通知到client?


对了,我给的那个sample例子的配置是不能做到重新通知的

因为quick start的那份配置,是基于memory模式保存上一次binlog消费的位置,一旦你重启或者客户端断开,位置信息就会丢失,然后就会继续从当前binlog的最新位置给你消费。

如果你要使用可以持久化binlog位置信息的功能,需要修改 canal.properties文件

#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml


使用default-instance.xml模式,但这个模式目前需要依赖一个zookeeper环境。

最近比较忙,这块详细的AdminGuide/DevGuide文档还没补上,如果有问题,可以给我留言


怎么配?什么版本?望回复!


最新稳定版本: https://raw.github.com/alibaba/canal/gh-pages/download/canal.deployer-1.0.2.tar.gz

配置带存储的步骤:
1. 下载zookeeper,搭建zookeeper环境
建议用zookeeper 3.4.5稳定版本,官方文档:http://zookeeper.apache.org/doc/r3.4.5/zookeeperAdmin.html

至于如何搭建我就不细说了,网上一搜一大把

2. 下载canal版本,最新是1.0.2版本,刚发布 (目前我们自己在用主要也就这版本)

3. 部署canal
a. 解压缩
mkdir canal
tar canal.deployer-1.0.2.tar.gz -C canal

b. 修改配置文件
vi conf/canal.properties

主要修改2点:
canal.zkServers=10.20.144.22:2181,10.20.144.51:2181 ##填上你第一步搭建的zookeeper环境地址

#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml

默认为memory,注意屏蔽掉,前面加个#号,然后放开default-instance.xml的配置,去掉前面的#号

其他的instance.properties配置,请参考我的quickstart中的配置,https://github.com/alibaba/canal/wiki/QuickStart

4. 启动.

5. 客户端链接
  客户端发生了数据消费后,canal server会在zookeeper上记录相应的消费位点,下次重新启动时就可以继续上一次位点,不会发生数据丢失.
[zk: localhost:2181(CONNECTED) 0] get /otter/canal/destinations/example/1001/cursor
{"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"10.20.144.15","port":3306}},"postion":{"included":false,"journalName":"mysql-bin.002072","position":58682700,"timestamp":1363173461000}}


如有问题,请及时联系


感谢,可以了:),我们也有很多跨机房的实时同步数据的需求,以前都是用JMS做的,先小范围内试用一下,觉得可以的话,以后就用你这个做数据同步了,alibaba在java开源方面还是做的相当不错的:)


多谢支持,目前canal支持mysql解析会有些限制,具体issue: https://github.com/alibaba/canal/issues/10

避免的操作:
1. 业务操作避免带删除性质的ddl,比如字段删除,rename table , drop table
2. 业务操作避免添加字段时调整顺序,只能添加到末尾.

如果真不可避免出现出现上述操作中的情况,只要不回退canal解析位置,就可以正常往下解析,不会出现数据错乱.
不过需要考虑:当canal解析延迟比较大,此时进行带删除性质的ddl操作,待解析的binlog中还存在对应ddl的表数据,那还是会出现问题。(尽可能选择合适的时间进行ddl操作)

-------------------- 华丽的分割线

目前canal只是解决了数据的增量变更获取,后面有一个专门的产品otter,解决数据库同步的问题。

目前支持的数据库同步:
1. 单向同步
2. 双向同步
3. 双A同步

双A和双向的区别,双A会在两地同一时间,修改同一条记录,目前otter可以保证双A机房的数据最终一致性


我们面临的最大问题就是增量数据同步,以前用JMS,不知道是不是本身写的程序问题,增量数据会莫名其妙的丢失导致一些脏数据(基础数据问题会引起最终算法结果有偏差),先试用一下你这个东东看看,运行一段时间看看效果吧
0 请登录后投票
   发表时间:2013-03-16  
kongshanxuelin 写道
agapple 写道
kongshanxuelin 写道
agapple 写道
kongshanxuelin 写道
agapple 写道
kongshanxuelin 写道
实际应用中碰到一个问题:当client关掉时,再次期间内的增量数据,在client重新启动后,这些增量数据不会通知到client?


对了,我给的那个sample例子的配置是不能做到重新通知的

因为quick start的那份配置,是基于memory模式保存上一次binlog消费的位置,一旦你重启或者客户端断开,位置信息就会丢失,然后就会继续从当前binlog的最新位置给你消费。

如果你要使用可以持久化binlog位置信息的功能,需要修改 canal.properties文件

#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml


使用default-instance.xml模式,但这个模式目前需要依赖一个zookeeper环境。

最近比较忙,这块详细的AdminGuide/DevGuide文档还没补上,如果有问题,可以给我留言


怎么配?什么版本?望回复!


最新稳定版本: https://raw.github.com/alibaba/canal/gh-pages/download/canal.deployer-1.0.2.tar.gz

配置带存储的步骤:
1. 下载zookeeper,搭建zookeeper环境
建议用zookeeper 3.4.5稳定版本,官方文档:http://zookeeper.apache.org/doc/r3.4.5/zookeeperAdmin.html

至于如何搭建我就不细说了,网上一搜一大把

2. 下载canal版本,最新是1.0.2版本,刚发布 (目前我们自己在用主要也就这版本)

3. 部署canal
a. 解压缩
mkdir canal
tar canal.deployer-1.0.2.tar.gz -C canal

b. 修改配置文件
vi conf/canal.properties

主要修改2点:
canal.zkServers=10.20.144.22:2181,10.20.144.51:2181 ##填上你第一步搭建的zookeeper环境地址

#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml

默认为memory,注意屏蔽掉,前面加个#号,然后放开default-instance.xml的配置,去掉前面的#号

其他的instance.properties配置,请参考我的quickstart中的配置,https://github.com/alibaba/canal/wiki/QuickStart

4. 启动.

5. 客户端链接
  客户端发生了数据消费后,canal server会在zookeeper上记录相应的消费位点,下次重新启动时就可以继续上一次位点,不会发生数据丢失.
[zk: localhost:2181(CONNECTED) 0] get /otter/canal/destinations/example/1001/cursor
{"@type":"com.alibaba.otter.canal.protocol.position.LogPosition","identity":{"slaveId":-1,"sourceAddress":{"address":"10.20.144.15","port":3306}},"postion":{"included":false,"journalName":"mysql-bin.002072","position":58682700,"timestamp":1363173461000}}


如有问题,请及时联系


感谢,可以了:),我们也有很多跨机房的实时同步数据的需求,以前都是用JMS做的,先小范围内试用一下,觉得可以的话,以后就用你这个做数据同步了,alibaba在java开源方面还是做的相当不错的:)


多谢支持,目前canal支持mysql解析会有些限制,具体issue: https://github.com/alibaba/canal/issues/10

避免的操作:
1. 业务操作避免带删除性质的ddl,比如字段删除,rename table , drop table
2. 业务操作避免添加字段时调整顺序,只能添加到末尾.

如果真不可避免出现出现上述操作中的情况,只要不回退canal解析位置,就可以正常往下解析,不会出现数据错乱.
不过需要考虑:当canal解析延迟比较大,此时进行带删除性质的ddl操作,待解析的binlog中还存在对应ddl的表数据,那还是会出现问题。(尽可能选择合适的时间进行ddl操作)

-------------------- 华丽的分割线

目前canal只是解决了数据的增量变更获取,后面有一个专门的产品otter,解决数据库同步的问题。

目前支持的数据库同步:
1. 单向同步
2. 双向同步
3. 双A同步

双A和双向的区别,双A会在两地同一时间,修改同一条记录,目前otter可以保证双A机房的数据最终一致性


我们面临的最大问题就是增量数据同步,以前用JMS,不知道是不是本身写的程序问题,增量数据会莫名其妙的丢失导致一些脏数据(基础数据问题会引起最终算法结果有偏差),先试用一下你这个东东看看,运行一段时间看看效果吧


从我们使用经验来看,丢数据基本不会在binlog解析这一阶段,因为它的逻辑很简单,解析错误就停下。

之前我们在实际线上也发生过几次丢数据的事件,发现丢数据的基本在数据处理上,比如异常没控制好,错误返回ack等(还好当时记录了严格的数据日志)

系统运行近一年后,我们才敢关闭数据日志,之前宁可牺牲一些同步性能,哈哈

推荐使用logback,支持日志自动归档压缩和过期清理,tar.gz压缩比可以达到10%以下
0 请登录后投票
   发表时间:2013-03-18  
麻烦问一下:这个支持mysql 5.6吗?5.6的binlog的event事件加了checksum了的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics