1.canal简介
+ n! R& W- x3 x! E$ W" r$ ^6 Q0 F" S7 o% R( c* n: X
; `/ C5 d' s8 u6 \, {. k2 Acanal可以用来监控数据库数据的变化,从而获得新增、修改的数据。6 U% T! D7 m; u7 U4 J4 N) Q
原理相对比较简单:
8 x1 @. u- U( Y6 P v, G(1)canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议# g+ K9 j0 r4 C& U% E/ k
(2) mysql master收到dump请求,开始推送binary log给slave(也就是canal)
( ~' p5 o: Q& Y( _(3) canal解析binary log对象(原始为byte流)
1 u" o% s. ^1 p7 r2.环境部署
* B# Y! O4 U0 }6 Q% }9 B* ?: q% A! P! F8 }
0 Q4 [. Y/ j2 I" z(1)mysql开启binlog模式$ q) U3 A9 R$ m# W" d7 E+ M
查看当前mysql是否开启binlog模式,如果log_bin的值为OFF是未开启,为ON是已开启。
/ f. v7 E O* `$ l h# K; U1 wSHOW VARIABLES LIKE '%log_bin%'
9 w$ ?; R- s8 D& K. N修改/etc/my.cnf 需要开启binlog模式。(修改完成之后,重启mysqld的服务。)% o! `9 R @, g6 q3 N% \4 z* m
log-bin=mysql-bin 1 T+ K+ L, `& f& x7 M3 ^
binlog-format=ROW& l1 M; t% r8 v: D$ A$ b: C
server_id=1
# v0 [7 V! n8 c1 [0 a1 d进入mysql
: X( X: S' l, J! W5 Q# G) ~* Zmysql -h localhost -u root -p
) S& d/ B* A9 X R+ o创建账号 用于测试使用(使用root账号创建用户并授予权限)
" A4 i& z9 R$ @9 Wcreate user canal@'%' IDENTIFIED by 'canal';
. F3 n* x( d$ R+ o- b, \3 LGRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%';
" P$ b/ q% ?4 F2 G- YFLUSH PRIVILEGES;% _/ x* J4 s8 {& P0 k1 A0 Q+ G* q3.canal服务端安装配置
2 q$ U: K7 U2 E/ Q
/ V1 a3 V5 x M7 Q(1)下载地址canal, i* _$ d7 X2 a; n7 L: r
https://github.com/alibaba/canal/releases/tag/canal-1.0.24 * F3 D0 n1 X- }/ e# M @ V(2)下载之后 上传到linux系统中,解压缩到指定的目录/usr/local/canal
" G5 |1 B! z, R* M Y解压缩之后的目录结构如下:
% h; W9 ]+ _0 j- ]( n. M(3)修改 exmaple下的实例配置(修改如图所示的几个参数)
. u% E' [: B$ @ nvi conf/example/instance.properties
B! F4 Q" ]& Q; L5 r+ g! G(4)指定读取位置Y2 ^5 P: B/ u G; y p1 T9 k
进入mysql中执行下面语句查看binlog所在位置
J; S& O2 n% d
如果fifile中binlog文件不为 mysql-bin.000001 可以重置mysql
+ x l# T/ ~2 ~* q( f* P1 bmysql> reset master;$ u" x+ N' ?" ]5 K! R, ]- ?+ ^& h查看canal配置文件* `" d+ P3 P" I3 }$ E
vim /usr/local/canal/conf/example/meta.dat" }& l6 ]0 O2 w, |3 }+ Q3 U找到对应的binlog信息更改一致即可' t% Z, Z% b+ M
"journalName":"mysql-bin.000001","position":120,"6 a4 {5 N- t4 w# ~2 t) v( e" \8 t注意:如果不一致,可能导致以下错误$ y( q$ U- C2 l. H8 @6 a
c.a.otter.canal.server.netty.handler.SessionHandler - something goes wrong with channel:[id: 0x7f2e9be3, /192.168.200.56:52225 => /192.168.200.128:11111],exception=java.io.IOException: Connection reset by peer1 }. ^4 E6 c6 h9 V* Z(5)启动服务:
+ }, S' G- F, d: e9 @[root@localhost canal]# ./bin/startup.sh 8 z4 H* I* K7 w* d5 ](6)查看日志:! u. c* c( d" [6 B
cat /usr/local/canal/logs/canal/canal.log
2 x4 K1 w. J& o* P1 Q) Q/ X9 w
4.数据监控微服务
9 d7 W# v6 X) q; {, g4 B8 y- W% s2 G z4 L. P" {- O3 E
当用户执行数据库的操作的时候,binlog日志会被canal捕获到,并解析出数据。我们就可以将解析出来的数据进行相应的逻辑处理。0 p8 q! Q! e5 b3 h
https://github.com/chenqian56131/spring-boot-starter-canal. z. i+ C2 n" }2 |/ W- b
以上开源项目,实现了springboot与canal的集成。比原生的canal更加优雅。
) o& a4 }# L6 x. P8 B1 E使用前需要将starter-canal安装到本地仓库。我们可以参照它提供的canal-test,进行代码实现。" j( Z# J9 j& F
(1)创建工程模块changgou_canal,pom引入依赖; m7 b: I; u: r
& O, w# k# V& P' z/ C$ T
com.xpand9 F, ?% W: Z; y# c' W6 m4 g7 [ H
starter-canal9 J3 w4 j( f2 k: ]
0.0.1-SNAPSHOT! |/ F) k3 g+ g' ~
9 }; r/ G9 n% I/ D4 C+ o7 h$ O(2)创建包com.changgou.canal ,包下创建启动类1 p" q" z5 L2 b, B8 v T
@SpringBootApplication
' ]6 x8 t C9 `& @% f. N@EnableCanalClient //声明当前的服务是canal的客户端6 e. Z: G3 j( ~7 t8 q8 `' h b
public class CanalApplication {
0 ? Y0 c, U: X/ u7 V! |/ f0 ?public static void main(String[] args) {
( F l; Z' i- {% H2 a+ }SpringApplication.run(CanalApplication.class,args);! l {: |5 N! T5 o
}" T2 ]8 S4 ^: V* p! f1 b( G
}
{+ i5 [7 ?5 z3 }(3)添加配置文件application.properties
- }9 h2 m/ t0 a+ T5 K" z, `$ J/ a# X: `canal.client.instances.example.port=11111
' I# M4 Z5 e, N# r6 S1 Zcanal.client.instances.example.batchSize=1000
& Q' R3 g6 B8 t6 j5 H3 h7 Cspring.rabbitmq.host=192.168.200.128
$ G4 G9 r0 G0 F(4)创建com.changgou.canal.listener包,包下创建类
/ z, y- G, W0 e1 K! v% G@CanalEventListener //声明当前的类是canal的监听类 " s/ j+ P6 H5 O9 y- @& |
public class BusinessListener {
& h0 _4 h4 O5 w" M( R' c1 E@Autowired" j+ \6 s2 r+ i& R/ {
private RabbitTemplate rabbitTemplate;Z1 V8 O y0 P( p
/**
6 X8 U6 q) {1 C+ ] A( {*
0 s3 _% j* C6 ~. ]* @param eventType 当前操作数据库的类型
8 g& \) G* e0 \# P# _" k' I6 r* @param rowData 当前操作数据库的数据& P4 Y+ E; K. a0 d: M
*/+ _' c2 l3 e- [3 J' o
@ListenPoint(schema = "business",table = "tb_ad"). T) k. e& E3 r# Q* K
public void adUpdate(CanalEntry.EventType eventType,CanalEntry.RowData rowData){
, x. \* ^" i; k6 w) u! k; F" nSystem.out.println("广告表数据发生改变");
: v7 S, {! }7 B+ d6 y' d, A4 Y* T//获取改变之前的数据
9 L5 O, v) [+ A/ j1 H/ ZrowData.getBeforeColumnsList().forEach((c)-> System.out.println("改变前的数据:"+c.getName()+"::"+c.getValue()));
" z6 w3 G/ H9 b: }2 T6 |# G& C//获取改变之后的数据0 k$ N* N6 T5 F6 i9 R1 u! Y/ Q
rowData.getAfterColumnsList().forEach((c)-> System.out.println("改变之后的C, ~6 ~7 |) d5 E) e
数据:"+c.getName()+"::"+c.getValue()));
' F9 x5 K: y# [% Q}
) o' h" U0 E6 M( Q9 h7 {}3 a" N+ m/ d. |) B2 Q* X; T/ H测试:启动数据监控微服务,修改business的tb_ad表,观察控制台输出。4 Z; \# P8 e/ ]3 `. L. r# q7 }
2 b8 Y, a6 O; Q( YJava吧 收集整理 java论坛 www.java8.com
本文介绍了如何使用Canal监控MySQL数据库的变化,通过模拟MySQL slave与master交互,接收binlog并解析数据。首先,检查并配置MySQL开启binlog,然后部署Canal服务端,包括下载、解压、修改配置及启动。接着,通过创建canal用户并授权,确保Canal能正常工作。在服务端启动后,通过监听类监听数据库变化,当tb_ad表数据发生变化时,打印出更新前后数据。这是一个关于数据库变更监控和Spring Boot集成Canal的实战教程。
894

被折叠的 条评论
为什么被折叠?



