canal
1. 作用:
同步mysql;做拉链表;更新redis
某些情况无法从日志中获取信息,而又无法利用sqoop等ETL工具对数据实时的监控
2. canal的工作原理:
canal的工作原理很简单,就是把自己伪装成slave,假装从master复制数据。
3. mysql的binlog
MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
一般来说开启二进制日志大概会有1%的性能损耗 。二进制有两个最重要的使用场景:
其一:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves来达到master-slave数据一致的目的。
其二:自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。
二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
4. 分类
mysql binlog的格式,是有三种,分别是STATEMENT, MIXED, ROW。在配置文件中可以选择配置binlog_format=row
它们的区别在于:
statement
语句级,binlog会记录每次一执行写操作的语句。
相对row模式节省空间,但是可能产生不一致性,比如update tt set create_date=now()
如果用binlog日志进行恢复,由于执行时间不同可能产生的数据就不同。
优点: 节省空间; 缺点: 有可能造成数据不一致。
row
行级, binlog会记录每次操作后每行记录的变化。
优点:保持数据的绝对一致性。因为不管sql是什么,引用了什么函数,他只记录执行后的效果。 缺点:占用较大空间。
mixed
statement的升级版,一定程度上解决了,因为一些情况而造成的statement模式不一致问题
在某些情况下譬如: 当函数中包含 UUID() 时; 包含 AUTO_INCREMENT 字段的表被更新时; 执行 INSERT DELAYED 语句时; 用 UDF 时;会按照 ROW的方式进行处理
优点:节省空间,同时兼顾了一定的一致性。
缺点:还有些极个别情况依旧会造成不一致,另外statement和mixed对于需要对binlog的监控的情况都不方便。
5. binlog的开启
在mysql的配置文件(Linux: /etc/my.cnf , Windows: \my.ini)下,修改配置
在[mysqld] 区块 设置/添加 log-bin=mysql-bin
这个表示binlog日志的前缀是mysql-bin ,以后生成的日志文件就是 mysql-bin.123456 的文件后面的数字按顺序生成。 每次mysql重启或者到达单个文件大小的阈值时,新生一个文件,按顺序编号。
mysql准备,建议安装mysql 5.6及以上版本
mysql赋予canal权限
GRANT ALL PRIVILEGES ON *.* TO canal@'%' IDENTIFIED BY 'canal'
SELECT * FROM mysql.`user`
具体操作如下:
[kris@hadoop101 bin]$ which mysql /usr/bin/mysql [kris@hadoop101 bin]$ sudo find / -name my.cnf //mysql的my.cnf文件所在的目录 /usr/my.cnf
sudo vim /usr/my.cnf server-id=1 log-bin=mysql-bin binlog_format=row binlog-do-db=gmall [kris@hadoop101 mysql]$ pwd /var/lib/mysql
重启mysql
[kris@hadoop101 mysql]$ sudo service mysql restart
Shutting down MySQL.... [确定]
Starting MySQL.....
在mysql中:
CALL init_data('2019-05-04',10,20,10,TRUE)
可以看到mysql-bin.000001文件大小发生的变化
[kris@hadoop101 mysql]$ ll //sudo ls -l 总用量 176448 -rw-rw---- 1 mysql mysql 56 3月 15 01:11 auto.cnf drwx------ 2 mysql mysql 4096 3月 20 19:15 azkaban drwx------ 2 mysql mysql 4096 5月 4 22:42 gmall -rw-r----- 1 mysql root 253742 5月 4 22:38 hadoop101.err -rw-rw---- 1 mysql mysql 5 5月 4 22:37 hadoop101.pid -rw-rw---- 1 mysql mysql 79691776 5月 4 22:42 ibdata1 -rw-rw---- 1 mysql mysql 50331648 5月 4 22:42 ib_logfile0 -rw-rw---- 1 mysql mysql 50331648 3月 15 01:10 ib_logfile1 drwx------ 2 mysql mysql 4096 4月 23 01:32 metastore drwx--x--x 2 mysql mysql 4096 3月 15 01:10 mysql -rw-rw---- 1 mysql mysql 19755 5月 4 22:42 mysql-bin.000001 -rw-rw---- 1 mysql mysql 19 5月 4 22:37 mysql-bin.index srwxrwxrwx 1 mysql mysql 0 5月 4 22:37 mysql.sock drwx------ 2 mysql mysql 4096 3月 15 01:10 performance_schema -rw-r--r-- 1 root root 125 3月 15 01:10 RPM_UPGRADE_HISTORY -rw-r--r-- 1 mysql mysql 125 3月 15 01:10 RPM_UPGRADE_MARKER-LAST drwx------ 2 mysql mysql 4096 4月 19 16:16 sparkmall drwxr-xr-x 2 mysql mysql 4096 3月 15 01:10 test
canal的下载路径 https://github.com/alibaba/canal/releases
安装并修改配置:
vim conf/canal.properties ################################################# canal.id = 1 canal.ip = canal.port = 11111 canal.metrics.pull.port = 11112 canal.zkServers = # flush data to zk canal.zookeeper.flush.period = 1000 canal.withoutNetty = false # tcp, kafka, RocketMQ canal.serverMode = tcp # flush meta cursor/parse position to file canal.file.data.dir = ${canal.conf.dir} canal.file.flush.period = 1000
这个文件是canal的基本通用配置,主要关心一下端口号,不改的话默认就是11111
vim conf/example/instance.properties
instance.properties是针对要追踪的mysql的实例配置
## mysql serverId , v1.0.26+ will autoGen 不能与mysql的server-id重复 canal.instance.mysql.slaveId=20 # enable gtid use true/false canal.instance.gtidon=false # position info canal.instance.master.address=hadoop101:3306 canal.instance.master.journal.name= canal.instance.master.position= canal.instance.master.timestamp= canal.instance.master.gtid= # rds oss binlog canal.instance.rds.accesskey= canal.instance.rds.secretkey= canal.instance.rds.instanceId= # table meta tsdb info canal.instance.tsdb.enable=true #canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb # username/password canal.instance.dbUsername=canal canal.instance.dbPassword=canal canal.instance.connectionCharset = UTF-8 canal.instance.defaultDatabaseName =test # enable druid Decrypt database password canal.instance.enableDruid=false #canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2 /JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ== ...
6. 启动:
[kris@hadoop101 bin]$ ./startup.sh found canal.pid , Please run stop.sh first ,then startup.sh [kris@hadoop101 bin]$ rm -rf canal.pid [kris@hadoop101 bin]$ ./startup.sh cd to /opt/module/canal/bin for workaround relative path LOG CONFIGURATION : /opt/module/canal/bin/../conf/logback.xml canal conf : /opt/module/canal/bin/../conf/canal.properties CLASSPATH :/opt/module/canal/bin/../conf:/opt/module/canal/bin ...
启动之后jps 9239 CanalLauncher 检查 vim /bigdata/canal/logs/example.log 中是否有报错