java数据同步解决方案_数据同步解决方案-canal

本文介绍了如何使用Canal监控MySQL数据库的变化,通过模拟MySQL slave与master交互,接收binlog并解析数据。首先,检查并配置MySQL开启binlog,然后部署Canal服务端,包括下载、解压、修改配置及启动。接着,通过创建canal用户并授权,确保Canal能正常工作。在服务端启动后,通过监听类监听数据库变化,当tb_ad表数据发生变化时,打印出更新前后数据。这是一个关于数据库变更监控和Spring Boot集成Canal的实战教程。

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

435300e4227d534afa920ff32386c57d.png原理相对比较简单:

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

831d4ebef5c91ee43db887c56c2494e8.png如果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

859b4ef2711de7be6dbf50a35820dc22.png4.数据监控微服务

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值