Canal TCP模式部署

Canal TCP模式部署

概览

canal 分两部分canal-server 服务端和canal-client 客户消费端。server负责去读取解析binlog;client客户端负责消费server读取到的解析好的记录。

部署环境

数据库:MySQL8.0

操作系统: Mac

canal-server版本:canal.deployer-1.1.4

canal-client版本:canal.client:1.1.4

准备

  • 对于自建mysql,需要先开启binlong写入功能,配置binlog-format为row模式,my.cnf配置如下
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
    • 注意:针对阿里云 RDS for MySQL , 默认打开了 binlog , 并且账号默认具有 binlog dump 权限 , 不需要任何权限或者 binlog 设置,可以直接跳过这一步
    • my.cnf如果没有的话要自己新建一个,不禁要问,这是为什么,那是因为,软件版本的mysql并没有my.cnf
    • 搜索全文查找命令:find / -name my.cnf
    • 创建一个命令:sudo touch /etc/my.cnf
    • 为什么是664,那是因为mysql.service会默认777是不安全的配置文件,会自动忽略掉命令:sudo chmod 664 /etc/my.cnf
    • 新增如上配置内容命令:sudo vim /etc/my.cnf
    • 系统偏好设置》》MYSQL》》重启mysql
  • 创建可以读取mysql的binlog的用户
-- 使用命令登录:mysql -u root -p
-- 创建用户 用户名:canal 密码:Canal@123456
create user 'canal'@'%' identified by 'Canal@123456';
-- 授权 *.*表示所有库
grant SELECT, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'canal'@'%' identified by 'Canal@123456';

  • 系统偏好设置》》MYSQL》》重启mysql

  • 验证mysql配置

    -- 改了配置文件之后,重启MySQL,使用命令查看是否打开binlog模式:
    mysql> show variables like 'log_bin%';
    +---------------------------------+---------------------------------------+
    | Variable_name                   | Value                                 |
    +---------------------------------+---------------------------------------+
    | log_bin                         | ON                                    |
    | log_bin_basename                | /usr/local/mysql/data/mysql-bin       |
    | log_bin_index                   | /usr/local/mysql/data/mysql-bin.index |
    | log_bin_trust_function_creators | OFF                                   |
    | log_bin_use_v1_row_events       | OFF                                   |
    +---------------------------------+---------------------------------------+
    5 rows in set (0.01 sec)
    
    -- 查看binlog-format是否为row模式
    mysql> show variables like 'binlog_format';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | binlog_format | ROW   |
    +---------------+-------+
    1 row in set (0.00 sec)
    
    -- 查看binlog日志文件列表:
    mysql> show binary logs;
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000001 |       177 |
    | mysql-bin.000002 |     38609 |
    +------------------+-----------+
    2 rows in set (0.00 sec)
    
    -- 查看mysql-bin.000002 最开始的位点为4
    mysql> show binlog events in 'mysql-bin.000002' from 0 limit 2;
    +------------------+-----+----------------+-----------+-------------+---------------------------------------+
    | Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                  |
    +------------------+-----+----------------+-----------+-------------+---------------------------------------+
    | mysql-bin.000002 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.27-log, Binlog ver: 4 |
    | mysql-bin.000002 | 123 | Previous_gtids |         1 |         154 |                                       |
    +------------------+-----+----------------+-----------+-------------+---------------------------------------+
    2 rows in set (0.00 sec)
    
    

Canal-server部署启动

  • 下载canal.deployer-1.1.6.tar.gz,地址:https://github.com/alibaba/canal/releases

  • 解压缩

    mkdir /Users/xiaowu/SoftWare/canal/canal-server
    tar zxvf canal.deployer-1.1.6.tar.gz  -C /Users/xiaowu/SoftWare/canal/canal-server
    
    

    解压完成后,进入 /tmp/canal 目录,ls 看到如下结构

    bin	conf	lib	logs
    
  • 修改instance配置文件,如下为需要修改的信息

    vi conf/example/instance.properties
    
    #position info,需要改成自己的数据库信息
    canal.instance.master.address = 127.0.0.1:3306 
    #username/password,需要改成自己的数据库信息
    canal.instance.dbUsername = canal  
    canal.instance.dbPassword = Canal@123456
    canal.instance.defaultDatabaseName =order_test
    canal.instance.connectionCharset = UTF-8
    #table regex要监听的库表信息
    canal.instance.filter.regex = order_test.order_base_item
    
    • canal.instance.connectionCharset 代表数据库的编码方式对应到 java 中的编码类型,比如 UTF-8,GBK , ISO-8859-1
    • 如果系统是1个 cpu,需要将 canal.instance.parser.parallel 设置为 false
  • 修改server配置文件

    vim conf/canal.properties 
    
    # tcp, kafka, RocketMQ
    canal.serverMode = tcp
    
  • 替换bin下mysql-connector-java-5.1.47.jar 为mysql8.0版本jar为mysql-connector-java-8.0.18.jar

  • 启动

    sh bin/startup.sh
    
  • 查看 server 日志

    tail -100f logs/canal/canal.log
    
  • 查看 instance 的日志,正常会出现如下日志

    tail -100f logs/example/example.log
    
    c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start successful....
    
  • 关闭,切勿强制kill,强制关闭会影响canal对binlog消费位点的记录

    sh bin/stop.sh
    

Canal-client客户端springboot部署可执行jar

  • 新建springboot项目,git地址

https://github.com/YuGonge/canal-tcp

  • 运行jar

nohup java -jar canal-tcp-1.0-SNAPSHOT.jar &

部署目录/logs 可查看日志

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要完整实现Canal TCP模式的数据同步,需要涉及到多个组件和步骤。下面是一个简化的示例,展示了如何使用Java实现Canal TCP模式的数据同步: 1. 首先,你需要在服务器上安装和配置Canal Server。你可以从Canal的官方网站下载并按照文档进行安装和配置。 2. 在你的Java项目中,添加Canal客户端依赖。你可以在Maven项目中添加以下依赖项: ```xml <dependency> <groupId>com.alibaba.otter</groupId> <artifactId>canal.client</artifactId> <version>1.1.5</version> </dependency> ``` 3. 创建一个Java类,用于建立与Canal Server的TCP连接并进行数据同步。以下是一个简单的示例: ```java import com.alibaba.otter.canal.client.CanalConnector; import com.alibaba.otter.canal.client.CanalConnectors; import com.alibaba.otter.canal.protocol.Message; import com.alibaba.otter.canal.protocol.CanalEntry.*; import java.net.InetSocketAddress; import java.util.List; public class CanalTCPClient { public static void main(String[] args) { String canalServerIP = "127.0.0.1"; int canalServerPort = 11111; String destination = "example"; String username = ""; String password = ""; CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress(canalServerIP, canalServerPort), destination, username, password); try { connector.connect(); connector.subscribe(".*\\..*"); while (true) { Message message = connector.getWithoutAck(100); long batchId = message.getId(); int size = message.getEntries().size(); if (batchId != -1 && size > 0) { for (CanalEntry.Entry entry : message.getEntries()) { if (entry.getEntryType() == EntryType.ROWDATA) { RowChange rowChange = RowChange.parseFrom(entry.getStoreValue()); EventType eventType = rowChange.getEventType(); if (eventType == EventType.INSERT) { List<RowData> rowDataList = rowChange.getRowDatasList(); for (RowData rowData : rowDataList) { // 处理插入操作的数据同步逻辑 // rowData.getAfterColumns() 获取插入操作后的列数据 } } else if (eventType == EventType.UPDATE) { // 处理更新操作的数据同步逻辑 } else if (eventType == EventType.DELETE) { // 处理删除操作的数据同步逻辑 } } } connector.ack(batchId); } else { Thread.sleep(1000); } } } catch (Exception e) { e.printStackTrace(); } finally { connector.disconnect(); } } } ``` 在这个示例中,我们创建了一个CanalConnector对象,并使用Canal Server的IP地址、端口、身份验证信息进行连接。然后,我们订阅所有的数据库实例和表。在一个无限循环中,我们通过调用`connector.getWithoutAck(100)`获取一批数据。然后,我们遍历每个Entry,根据EventType来处理不同类型的操作(插入、更新、删除)。你可以根据需求编写适当的逻辑来处理数据同步。 请注意,这只是一个简化的示例,你需要根据你的具体需求进行适当的修改和扩展。还有很多更复杂的功能可以在Canal的文档中找到,例如过滤和解析Binlog事件等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值