0% found this document useful (0 votes)
62 views6 pages

【IT老齐132】Canal入门

Uploaded by

panbo362472407
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
62 views6 pages

【IT老齐132】Canal入门

Uploaded by

panbo362472407
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 6

VIP 五大权益:

https://www.itlaoqi.com/chapter.html?sid=124&cid=2584
一、仅需498开通永久VIP,课程永久更新,永远没有二次收费
二、永久VIP(简称VIP),从Java多线程到分布式架构上百小时精品课,所有课程提供完整
笔记课件,不说垃圾话,不做垃圾课
三、VIP,加老齐V信: itlaoqi001,学习问题V信1对1答疑解惑
四、VIP,1对1制定学习计划、优化简历、offer建议、职业规划
五、VIP,架构选型、技术方案 ,只要我有经验一定知无不言
PS:
创业不易,设置VIP也属实为了养家糊口,望兄弟们海涵。
希望通过我的经验能帮你有效提高收入,找到更好的工作。
-------------------------------------
IT老齐官网:www.itlaoqi.com
公Z号:IT老齐
如有任何问题都欢迎加我V:itlaoqi001
-------------------------------------

本文演示如何Canal如何接入MySQL实现数据写操作监听。
关于Canal如何接入消息队列、Redis、Canal的高可用HA后文继续讲解。

安装MySQL 8.0.28(192.168.31.230)
firewall‐cmd ‐‐zone=public ‐‐add‐port=3306/tcp ‐‐permanent
firewall‐cmd ‐‐reload

cd /home/
wget ‐‐no‐check‐certificate https://manongbiji.oss‐cn‐
beijing.aliyuncs.com/ittailkshow/canal/download/world.sql
wget ‐‐no‐check‐certificate https://repo.mysql.com/mysql80‐community‐releas
e‐el7‐5.noarch.rpm
yum localinstall ‐y mysql80‐community‐release‐el7‐5.noarch.rpm
#自动安装MySQL 8.0.28
yum install ‐y mysql‐community‐server

调整配置文件
sudo cat >> /etc/my.cnf <<‐'EOF'
server‐id=1
log‐bin=mysql‐bin
binlog_format=row
binlog‐do‐db=world
EOF

systemctl start mysqld

获取初始密码
grep 'temporary password' /var/log/mysqld.log
2022-03-31T04:20:25.133810Z 6 [Note] [MY-010454] [Server] A temporary password is
generated for root@localhost: Jby&XTOc.7iN
mysql ‐uroot ‐pJby&XTOc.7iN

#修改root密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'asA
S123456!';
#MySQL降低密码强度
set global validate_password.policy=0;
set global validate_password.length=4;

#创建canal同步账户
CREATE USER canal@'%' IDENTIFIED with mysql_native_password BY 'canal';
#授权canal用户允许远程到mysql实现主从复制
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';

CREATE USER remote@'%' IDENTIFIED with mysql_native_password BY 'remote';


grant all privileges on *.* to remote@'%';

#初始化数据库
source /home/world.sql
安装Canal-Server
安装JDK
yum ‐y install java‐1.8.0‐openjdk‐devel.x86_64
sudo cat >> /etc/profile <<‐'EOF'
export JAVA_HOME=/usr/lib/jvm/java‐1.8.0‐openjdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
EOF
source /etc/profile
echo $JAVA_HOME

下载canal-deployer最新版
# 下载脚本
wget ‐‐no‐check‐certificate https://manongbiji.oss‐cn‐
beijing.aliyuncs.com/ittailkshow/canal/download/canal.deployer‐
1.1.5.tar.gz

mkdir /home/canal
tar zxvf canal.deployer‐1.1.5.tar.gz ‐C /home/canal

vi conf/example/instance.properties
#调整serverId
canal.instance.mysql.slaveId=10

# master地址
canal.instance.master.address=192.168.31.230:3306
...
# 关闭tsdb
canal.instance.tsdb.enable=false

#确认canal同步用的用户名、密码
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal

#启动服务
sh bin/startup.sh
#canal admin 端口
firewall‐cmd ‐‐zone=public ‐‐add‐port=11110/tcp ‐‐permanent
#canal 监听端口
firewall‐cmd ‐‐zone=public ‐‐add‐port=11111/tcp ‐‐permanent
#canal 指标监控端口
firewall‐cmd ‐‐zone=public ‐‐add‐port=11112/tcp ‐‐permanent
firewall‐cmd ‐‐reload

tail canal.log

2022‐03‐31 13:46:19.413 [main] INFO com.alibaba.otter.canal.deployer.CanalL


auncher ‐ ## set default uncaught exception handler
2022‐03‐31 13:46:19.503 [main] INFO com.alibaba.otter.canal.deployer.CanalL
auncher ‐ ## load canal configurations
2022‐03‐31 13:46:19.524 [main] INFO com.alibaba.otter.canal.deployer.CanalS
tarter ‐ ## start the canal server.
2022‐03‐31 13:46:19.627 [main] INFO com.alibaba.otter.canal.deployer.CanalC
ontroller ‐ ## start the canal server[172.17.0.1(172.17.0.1):11111]
2022‐03‐31 13:46:21.250 [main] INFO com.alibaba.otter.canal.deployer.CanalS
tarter ‐ ## the canal server is running now ......

开发数据监听程序
pom.xml
<dependencies>
<dependency>
<groupId>com.alibaba.otter</groupId>
<artifactId>canal.client</artifactId>
<version>1.1.5</version>
</dependency>
<dependency>
<groupId>com.alibaba.otter</groupId>
<artifactId>canal.protocol</artifactId>
<version>1.1.5</version>
</dependency>
</dependencies>

编写数据监听程序
package com.itlaoqi;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.client.CanalConnectors;
import com.alibaba.otter.canal.protocol.CanalEntry;
import com.alibaba.otter.canal.protocol.Message;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;

import java.net.InetSocketAddress;
import java.util.List;

public class AD {
public static void main(String[] args) throws InterruptedException, Invalid
ProtocolBufferException {
//TODO 获取连接
CanalConnector canalConnector = CanalConnectors.newSingleConnector(new Inet
SocketAddress("192.168.31.231", 11111), "example", "", "");
while (true) {
//TODO 连接
canalConnector.connect();
//TODO 订阅数据库
canalConnector.subscribe("world.*");
//TODO 获取数据
Message message = canalConnector.get(100);
//TODO 获取Entry集合
List<CanalEntry.Entry> entries = message.getEntries();
//TODO 判断集合是否为空,如果为空,则等待一会继续拉取数据
if (entries.size() <= 0) {
System.out.println("当次抓取没有数据,休息一会。。。。。。");
Thread.sleep(1000);
} else {
//TODO 遍历entries,单条解析
for (CanalEntry.Entry entry : entries) {
//1.获取表名
String tableName = entry.getHeader().getTableName();
//2.获取类型
CanalEntry.EntryType entryType = entry.getEntryType();
//3.获取序列化后的数据
ByteString storeValue = entry.getStoreValue();
//4.判断当前entryType类型是否为ROWDATA
if (CanalEntry.EntryType.ROWDATA.equals(entryType)) {
//5.反序列化数据
CanalEntry.RowChange rowChange =
CanalEntry.RowChange.parseFrom(storeValue);
//6.获取当前事件的操作类型
CanalEntry.EventType eventType = rowChange.getEventType();
//7.获取数据集
List<CanalEntry.RowData> rowDataList = rowChange.getRowDatasList();
//8.遍历rowDataList,并打印数据集
for (CanalEntry.RowData rowData : rowDataList) {
JSONObject beforeData = new JSONObject();
List<CanalEntry.Column> beforeColumnsList = rowData.getBeforeColumnsList();
for (CanalEntry.Column column : beforeColumnsList) {
beforeData.put(column.getName(), column.getValue());
}

JSONObject afterData = new JSONObject();


List<CanalEntry.Column> afterColumnsList = rowData.getAfterColumnsList();
for (CanalEntry.Column column : afterColumnsList) {
afterData.put(column.getName(), column.getValue());
}

//数据打印
System.out.println("Table:" + tableName +
",EventType:" + eventType +
",Before:" + beforeData +
",After:" + afterData);
}
} else {
System.out.println("当前操作类型为:" + entryType);
}
}
}
}
}
}

You might also like