设为首页 收藏本站
查看: 928|回复: 0

[经验分享] MySQL增量订阅&消费组件Canal POC

[复制链接]

尚未签到

发表于 2017-12-12 18:12:07 | 显示全部楼层 |阅读模式
  POC的目的:
  1、与MYSQL的对接方式,配置文档
  2、订阅的延迟
  3、订阅后宕机消息会不会丢失
  4、能不能从指定的点开始重新订阅
  5、高并发写入的时候,日志的顺序是否还能保持,不考虑消费的情况订阅是否会延迟

###写完word文档直接拷贝过来,格式一般般。。。

Canal介绍
  官网地址:https://github.com/alibaba/canal

Mysql主备复制原理

DSC0000.png

从上层来看,复制分成三步:



  • master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);
  • slave将master的binary log events拷贝到它的中继日志(relay log);
  • slave重做中继日志中的事件,将改变反映它自己的数据。
Canal工作原理

DSC0001.png



  • 原理相对比较简单:
  • canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
  • mysql master收到dump请求,开始推送binary log给slave(也就是canal)
  • canal解析binary log对象(原始为byte流)

Canal安装部署

下载canal

直接下载,访问:https://github.com/alibaba/canal/releases,也可以在linux上直接联网下载:

服务端包:https://github.com/alibaba/canal/releases/download/v1.0.23/canal.deployer-1.0.23.tar.gz

客户端包:https://github.com/alibaba/canal/releases/download/v1.0.23/canal.example-1.0.23.tar.gz


解压canal
  Mkdir /app/canal
  Mkdir /app/canal-example
  Tar zxvf canal.deployer-1.0.23.tar.gz -C /app/canal
  Tar zxvf canal.example-1.0.23.tar.gz -C /app/canal-example

MySQL配置修改

a. canal的原理是基于mysql binlog技术,所以这里一定需要开启mysql的binlog写入功能,建议配置binlog模式为row.

**针对阿里云RDS账号默认已经有binlog dump权限,不需要任何权限或者binlog设置,可以直接跳过这一步**

[mysqld]

log-bin=mysql-bin #添加这一行就ok

binlog-format=ROW #选择row模式

server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复

b. canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限.


CREATE USER canal>
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';

-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;

FLUSH PRIVILEGES;

针对已有的账户可直接通过grant


Canal配置修改
  

vi conf/example/instance.properties  

#################################################  

## mysql serverId  

canal.instance.mysql.slaveId = 1234  

  

# position info,需要改成自己的数据库信息  

canal.instance.master.address = 172.16.0.158:3306   

canal.instance.master.journal.name =   

canal.instance.master.position =   

canal.instance.master.timestamp =   

  

#canal.instance.standby.address =   

#canal.instance.standby.journal.name =  

#canal.instance.standby.position =   

#canal.instance.standby.timestamp =   

  

# username/password,需要改成自己的数据库信息  

canal.instance.dbUsername = canal    

canal.instance.dbPassword = canal  

canal.instance.defaultDatabaseName =canal  

canal.instance.connectionCharset = UTF-8  

  

# table regex  

canal.instance.filter.regex = .*\\..*  

  

#################################################  

说明:



  • canal.instance.connectionCharset 代表数据库的编码方式对应到java中的编码类型,比如UTF-8,GBK , ISO-8859-1

Canal-Server启停
  

sh bin/startup.sh 启动  

sh bin/stop.sh  停止  

vi logs/canal/canal.log  查看canal日志  

vi logs/example/example.log  查看instance的日志  


Canal-Client启停
  

Cd /app/canal-example  

sh bin/startup.sh 启动canal客户端  

sh bin/stop.sh  停止canal客户端  

tail -f /app/canal-example/logs/example/entry.log 查看canal客户端订阅的日志  

  尝试修改mysql数据库,如上述我们配置的库是canal,我们创建一个userinfo的用户表,可以在entry.log里面打印出userinfo的信息

Canal-Client开发
  到此为止整个canal环境搭建完成。
  不过canal-example是一个已经编译好的包,如果我们需要对源码进行修改,输出一些我们自己想要的信息,可以重新开发canal客户端。
  客户端源码官方下载地址:https://github.com/alibaba/canal/wiki/ClientExample


  • Simple客户端例子:SimpleCanalClientTest
  • Cluster客户端例子:ClusterCanalClientTest

Canal-Server HA配置
  更多配置策略请参考官方文档:https://github.com/alibaba/canal/wiki/AdminGuide
  a. 修改canal.properties,加上zookeeper配置
  

canal.zkServers=172.16.7.122:2181  

canal.instance.global.spring.xml =>  

  b. 创建example目录,并修改instance.properties
  

canal.instance.mysql.slaveId = 1234 ##另外一台机器改成1235,保证slaveId不重复即可  

canal.instance.master.address = 172.16.0.158:3306  

  注意: 两台机器上的instance目录的名字需要保证完全一致,HA模式是依赖于instance name进行管理,同时必须都选择default-instance.xml配置
  启动两台机器的canal,启动后,你可以查看logs/example/example.log,只会看到一台机器上出现了启动成功的日志。查看一下zookeeper中的节点信息,也可以知道当前工作的节点为172.16.0.157:11111
DSC0002.png

  Canal pom版本需要1.0.22或以上,否则zkclient可能发生冲突
  

<dependency>  
    <groupId>com.alibaba.otter</groupId>
  
    <artifactId>canal.client</artifactId>
  
    <version>1.0.22</version>
  
</dependency>
  


Canal POC

消费位点
  Canal client接收到日志之后要提交ack确认
  

connector.ack(batchId); // 提交确认  

  canal server在接收了客户端的ack后,就会记录客户端提交的最后位点,如果canal client没有提交位点,则下一次canal client启动的时候  会将最后记录的位点把日志重新推送过来,直到canal client提交ack确认为止。

订阅延迟
  Canal-server单点模式下,订阅延迟平均22.65毫秒,HA模式下,订阅延迟平均24.16毫秒,具体数据请参考附录。

宕机消息是否丢失
  停止正在工作的172.16.0.157的canal server,这时172.16.0.158会立马启动example instance,提供新的数据服务。与此同时,客户端也会随着canal server的切换,通过获取zookeeper中的最新地址,与新的canal server建立链接,继续消费数据,整个过程自动完成。
DSC0003.png


从指定的点开始订阅

mysql链接时的起始位置(instance.properties)



  • canal.instance.master.journal.name + canal.instance.master.position : 精确指定一个binlog位点,进行启动
  • canal.instance.master.timestamp : 指定一个时间戳,canal会自动遍历mysql binlog,找到对应时间戳的binlog位点后,进行启动
  • 不指定任何信息:默认从当前数据库的位点,进行启动。(show master status)
  另外,可以从一个指定的点开始获取日志:
  

CanalEntry.getHeader().getLogfileOffset()  

  


高并发下的日志顺序
  高并发下测试方案:
  mysql的主键id是自增的,无论业务如何高并发,但插入到mysql的id肯定是自增且有序的,我们以此为基准来判断canal订阅到日志是否也是有序的。
  首先在canal客户端获取id列的值,分批存入一个数组,然后对这个数组进行冒泡排序,如果在冒泡算法中出现一次冒泡,则说明canal订阅到的日志出现乱序。
  实验结果:
  本地开发机(i5-5200U CPU @2.2GHz 2.19GHz 8Gb内存),共开启1000个线程,每个线程插入1000条记录,mysql最大连接数设置1000,总共100万条记录,canal client没有输出乱序日志,并且canal client输入的分批次(canal自动分批)size总和为100万。另外,当插入数据库动作完成之后,canal-client输出也同时完成,说明订阅并没有出现较大的延迟,整个过程持续840s,1190tps/s。
DSC0004.png

  数据库也共100万条记录:
DSC0005.png


附录

订阅延迟—canal server单点

canal-client收到日志时间


mysql插入时间


订阅延迟(ms)


1489994604188.00


1489994604142.00


46.00


1489994605180.00


1489994605149.00


31.00


1489994606165.00


1489994606151.00


14.00


1489994607165.00


1489994607153.00


12.00


1489994608199.00


1489994608155.00


44.00


1489994609199.00


1489994609157.00


42.00


1489994610187.00


1489994610160.00


27.00


1489994611184.00


1489994611163.00


21.00


1489994612176.00


1489994612172.00


4.00


1489994613208.00


1489994613174.00


34.00


1489994614197.00


1489994614175.00


22.00


1489994615186.00


1489994615176.00


10.00


1489994616184.00


1489994616178.00


6.00


1489994617189.00


1489994617180.00


9.00


1489994618208.00


1489994618182.00


26.00


1489994619206.00


1489994619185.00


21.00


1489994620202.00


1489994620187.00


15.00


1489994621195.00


1489994621188.00


7.00


1489994622230.00


1489994622189.00


41.00


1489994623220.00


1489994623190.00


30.00


1489994624210.00


1489994624192.00


18.00


1489994625202.00


1489994625195.00


7.00


1489994626236.00


1489994626199.00


37.00


1489994627227.00


1489994627200.00


27.00


1489994628217.00


1489994628202.00


15.00


1489994629211.00


1489994629203.00


8.00


1489994630212.00


1489994630205.00


7.00


1489994631210.00


1489994631206.00


4.00


1489994632249.00


1489994632208.00


41.00


1489994633250.00


1489994633210.00


40.00


1489994634215.00


1489994634211.00


4.00


1489994635216.00


1489994635212.00


4.00


1489994636257.00


1489994636214.00


43.00


1489994637285.00


1489994637241.00


44.00


1489994638278.00


1489994638243.00


35.00


1489994639283.00


1489994639246.00


37.00


1489994640283.00


1489994640248.00


35.00


1489994641271.00


1489994641250.00


21.00


1489994642262.00


1489994642251.00


11.00


1489994643255.00


1489994643252.00


3.00


1489994644268.00


1489994644254.00


14.00


1489994645268.00


1489994645255.00


13.00


1489994646300.00


1489994646256.00


44.00


1489994647292.00


1489994647259.00


33.00


1489994648287.00


1489994648260.00


27.00


1489994649273.00


1489994649262.00


11.00


1489994650267.00


1489994650263.00


4.00


1489994651302.00


1489994651265.00


37.00


1489994652293.00


1489994652268.00


25.00


1489994653288.00


1489994653270.00


18.00


1489994654298.00


1489994654271.00


27.00


1489994655289.00


1489994655273.00


16.00


1489994656278.00


1489994656275.00


3.00


1489994657282.00


1489994657277.00


5.00


1489994658325.00


1489994658280.00


45.00


1489994659313.00


1489994659282.00


31.00


1489994660291.00


1489994660284.00


7.00


1489994661299.00


1489994661286.00


13.00


1489994662290.00


1489994662287.00


3.00


1489994663331.00


1489994663288.00


43.00


1489994664318.00


1489994664291.00


27.00


1489994665332.00


1489994665293.00


39.00


1489994666327.00


1489994666295.00


32.00


1489994667321.00


1489994667297.00


24.00


1489994668315.00


1489994668300.00


15.00


1489994669316.00


1489994669301.00


15.00


1489994670311.00


1489994670302.00


9.00


1489994671334.00


1489994671304.00


30.00


1489994672334.00


1489994672306.00


28.00


1489994673332.00


1489994673307.00


25.00


1489994674327.00


1489994674309.00


18.00


1489994675324.00


1489994675310.00


14.00


1489994676317.00


1489994676312.00


5.00


1489994677325.00


1489994677313.00


12.00


1489994678319.00


1489994678314.00


5.00


1489994679352.00


1489994679315.00


37.00


1489994680356.00


1489994680317.00


39.00


1489994681351.00


1489994681318.00


33.00


1489994682344.00


1489994682320.00


24.00


1489994683342.00


1489994683324.00


18.00


1489994684369.00


1489994684326.00


43.00


1489994685368.00


1489994685327.00


41.00


1489994686361.00


1489994686329.00


32.00


1489994687353.00


1489994687330.00


23.00


1489994688345.00


1489994688331.00


14.00


1489994689357.00


1489994689333.00


24.00


1489994690345.00


1489994690334.00


11.00


1489994691346.00


1489994691336.00


10.00


1489994692340.00


1489994692337.00


3.00


1489994693376.00


1489994693339.00


37.00


1489994694404.00


1489994694362.00


42.00


1489994695397.00


1489994695363.00


34.00


1489994696389.00


1489994696366.00


23.00


1489994697395.00


1489994697367.00


28.00


1489994698392.00


1489994698369.00


23.00


1489994699378.00


1489994699370.00


8.00


1489994700408.00


1489994700372.00


36.00


1489994701401.00


1489994701375.00


26.00


1489994702400.00


1489994702377.00


23.00


1489994703392.00


1489994703379.00


13.00

  平均:22.65ms

订阅延迟—canal server集群(两个节点-主从)

canal-client收到日志时间


mysql插入时间


订阅延迟(s)


1490007771482.00


1490007771476.00


6.00


1490007772508.00


1490007772478.00


30.00


1490007773524.00


1490007773488.00


36.00


1490007774494.00


1490007774489.00


5.00


1490007775512.00


1490007775491.00


21.00


1490007776527.00


1490007776493.00


34.00


1490007777552.00


1490007777500.00


52.00


1490007778539.00


1490007778502.00


37.00


1490007779522.00


1490007779504.00


18.00


1490007780528.00


1490007780506.00


22.00


1490007781538.00


1490007781521.00


17.00


1490007782552.00


1490007782523.00


29.00


1490007783531.00


1490007783525.00


6.00


1490007784551.00


1490007784527.00


24.00


1490007785562.00


1490007785528.00


34.00


1490007786567.00


1490007786530.00


37.00


1490007787539.00


1490007787531.00


8.00


1490007788558.00


1490007788532.00


26.00


1490007789576.00


1490007789534.00


42.00


1490007790576.00


1490007790536.00


40.00


1490007791540.00


1490007791537.00


3.00


1490007792584.00


1490007792539.00


45.00


1490007793555.00


1490007793541.00


14.00


1490007794565.00


1490007794543.00


22.00


1490007795573.00


1490007795544.00


29.00


1490007796590.00


1490007796545.00


45.00


1490007797562.00


1490007797547.00


15.00


1490007798565.00


1490007798548.00


17.00


1490007799572.00


1490007799551.00


21.00


1490007800568.00


1490007800553.00


15.00


1490007801580.00


1490007801554.00


26.00


1490007802588.00


1490007802555.00


33.00


1490007803595.00


1490007803557.00


38.00


1490007804577.00


1490007804558.00


19.00


1490007805583.00


1490007805559.00


24.00


1490007806596.00


1490007806560.00


36.00


1490007807566.00


1490007807562.00


4.00


1490007808581.00


1490007808564.00


17.00


1490007809596.00


1490007809567.00


29.00


1490007810607.00


1490007810570.00


37.00


1490007811578.00


1490007811571.00


7.00


1490007812591.00


1490007812572.00


19.00


1490007813610.00


1490007813586.00


24.00


1490007814629.00


1490007814588.00


41.00


1490007815601.00


1490007815590.00


11.00


1490007816614.00


1490007816591.00


23.00


1490007817622.00


1490007817592.00


30.00


1490007818600.00


1490007818594.00


6.00


1490007819611.00


1490007819596.00


15.00


1490007820612.00


1490007820598.00


14.00


1490007821623.00


1490007821600.00


23.00


1490007822632.00


1490007822602.00


30.00


1490007823641.00


1490007823618.00


23.00


1490007824641.00


1490007824619.00


22.00


1490007825658.00


1490007825621.00


37.00


1490007826664.00


1490007826622.00


42.00


1490007827632.00


1490007827623.00


9.00


1490007828646.00


1490007828625.00


21.00


1490007829633.00


1490007829627.00


6.00


1490007830650.00


1490007830628.00


22.00


1490007831660.00


1490007831630.00


30.00


1490007832672.00


1490007832631.00


41.00


1490007833645.00


1490007833633.00


12.00


1490007834656.00


1490007834635.00


21.00


1490007835668.00


1490007835637.00


31.00


1490007836661.00


1490007836639.00


22.00


1490007837668.00


1490007837640.00


28.00


1490007838678.00


1490007838642.00


36.00


1490007839689.00


1490007839644.00


45.00


1490007840665.00


1490007840646.00


19.00


1490007841666.00


1490007841647.00


19.00


1490007842677.00


1490007842649.00


28.00


1490007843688.00


1490007843662.00


26.00


1490007844699.00


1490007844667.00


32.00


1490007845703.00


1490007845669.00


34.00


1490007846696.00


1490007846672.00


24.00


1490007847696.00


1490007847674.00


22.00


1490007848704.00


1490007848678.00


26.00


1490007849715.00


1490007849680.00


35.00


1490007850698.00


1490007850681.00


17.00


1490007851703.00


1490007851682.00


21.00


1490007852714.00


1490007852684.00


30.00


1490007853722.00


1490007853685.00


37.00


1490007854692.00


1490007854687.00


5.00


1490007855733.00


1490007855689.00


44.00


1490007856702.00


1490007856690.00


12.00


1490007857702.00


1490007857692.00


10.00


1490007858726.00


1490007858693.00


33.00


1490007859699.00


1490007859694.00


5.00


1490007860720.00


1490007860695.00


25.00


1490007861720.00


1490007861697.00


23.00


1490007862728.00


1490007862698.00


30.00


1490007863705.00


1490007863700.00


5.00


1490007864706.00


1490007864701.00


5.00

  平均:24.16ms

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-423420-1-1.html 上篇帖子: 记性不好,多记记吧 下篇帖子: MySQL各版本解释和下载
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表