JavaEE:Canal安装/使用

说明:

在Centos7系统上安装配置。

一、Mysql配置:

1.创建账号用于canal连接mysql,账号名canal密码111111a@,并设置REPLICATION SLAVE和 REPLICATION CLIENT权限:

CREATE USER canal IDENTIFIED BY '111111a@';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY '111111a@';

2.修改my.cnf文件,打开二进制日志:

[root@localhost ~]# vi /etc/my.cnf

增加如下内容:

log-bin=mysql-bin  #打开二进制日志
binlog-format=ROW #设置ROW模式
server_id=12345 # 设置唯一编号,不能和canal.id 的一样

二、Canal安装/启动:

前提:安装JDK

1.下载canal.deployer-1.1.4.tar.gz:

https://github.com/alibaba/canal/releases/tag/canal-1.1.4

2.用Xftp上传到/usr/local/canal目录下,并解压(canal目录手动创建):

[root@localhost ~]# tar -zxvf canal.deployer-1.1.4.tar.gz

3.canal.properties文件中配置canal.id和canal.ip信息(/usr/local/canal/conf目录下):

[root@localhost conf]# vi canal.properties

修改内容如下:

canal.id = 654321    #唯一编号
canal.ip = 172.16.122.138  #IP

4.instance.properties文件中配置mysql连接信息(/usr/local/canal/conf/example目录下):

[root@localhost example]# vi canal.properties

修改内容如下:

canal.instance.master.address=127.0.0.1:3306  #配置被监听mysql的地址
canal.instance.dbUsername=canal                     #配置被监听mysql数据库的用户名
canal.instance.dbPassword=111111a@              #配置被监听mysql数据库的密码
#.*表示所有数据库,\\..*表示所有表,此处为对mysql所有数据库所有表进行监听
canal.instance.filter.regex=.*\\..*

5.启动/关闭canal服务(/usr/local/canal/bin目录下):

(1)启动:

[root@localhost bin]# sh startup.sh

(2)重启:

[root@localhost bin]# sh restart.sh

(3)停止:

[root@localhost bin]# sh stop.sh

三、启动客户端对mysql数据变更进行监听(以下是官方例子):

官方例子:https://github.com/alibaba/canal/wiki/ClientExample

1.工程pom.xml导入canal依赖包:

<dependencies>
    <!-- 导入canal依赖 -->
    <dependency>
        <groupId>com.alibaba.otter</groupId>
        <artifactId>canal.client</artifactId>
        <version>1.1.0</version>
    </dependency>
</dependencies>

2.创建一个类监听mysql数据库数据变更事件:

public class SimpleCanalClientExample {

    public static void main(String args[]) {
        // 创建链接
        CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("172.16.122.138", 11111), "example", "canal", "123456!@");
        int batchSize = 1000;
        int emptyCount = 0;
        try {
            connector.connect();  //连接canal服务器
            connector.subscribe(".*\\..*");  //监听所有数据库所有表
            connector.rollback();
            int totalEmptyCount = 120;
            while (emptyCount < totalEmptyCount) {
                Message message = connector.getWithoutAck(batchSize); // 获取指定数量的数据
                long batchId = message.getId();
                int size = message.getEntries().size();
                if (batchId == -1 || size == 0) {//没有修改的数据
                    emptyCount++;
                    System.out.println("empty count : " + emptyCount);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                    }
                } else {//有修改过的数据
                    emptyCount = 0;
                    printEntry(message.getEntries());
                }

                connector.ack(batchId); // 提交确认,消费完成
                // connector.rollback(batchId); // 处理失败, 回滚数据
            }

            System.out.println("empty too many times, exit");
        } finally {
            connector.disconnect();
        }
    }

    private static void printEntry(List<Entry> entrys) {//处理有修改的数据
        for (Entry entry : entrys) {
            if (entry.getEntryType() == EntryType.TRANSACTIONBEGIN || entry.getEntryType() == EntryType.TRANSACTIONEND) {
                continue;
            }

            RowChange rowChage = null;
            try {
                rowChage = RowChange.parseFrom(entry.getStoreValue());
            } catch (Exception e) {
                throw new RuntimeException("ERROR ## parser of eromanga-event has an error , data:" + entry.toString(), e);
            }

            EventType eventType = rowChage.getEventType();
            System.out.println(String.format("================&gt; binlog[%s:%s] , name[%s,%s] , eventType : %s",
                    entry.getHeader().getLogfileName(), entry.getHeader().getLogfileOffset(),
                    entry.getHeader().getSchemaName(), entry.getHeader().getTableName(),
                    eventType));

            for (RowData rowData : rowChage.getRowDatasList()) {
                if (eventType == EventType.DELETE) {
                    printColumn(rowData.getBeforeColumnsList());
                } else if (eventType == EventType.INSERT) {
                    printColumn(rowData.getAfterColumnsList());
                } else {
                    System.out.println("-------&gt; before");
                    printColumn(rowData.getBeforeColumnsList());
                    System.out.println("-------&gt; after");
                    printColumn(rowData.getAfterColumnsList());
                }
            }
        }
    }

    private static void printColumn(List<Column> columns) {
        for (Column column : columns) {
            System.out.println(column.getName() + " : " + column.getValue() + "    update=" + column.getUpdated());
        }
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值