canal簡易インストール使用

7246 ワード

canal概要:https://github.com/alibaba/canal
1、データベースの構成
まずcanalを使用するには、データベース構成を変更する必要があります.
[mysqld]
log-bin=mysql-bin #    binlog
binlog-format=ROW #    ROW   
server_id=1 #    MySQL replaction     ,    canal   slaveId   

canalデータベースユーザーの作成
CREATE USER canal IDENTIFIED BY 'canal';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;

 
2、canalのインストール
ダウンロード:https://github.com/alibaba/canal/releases
解凍(修正バージョン番号):tar zxvf canal.deployer-1.1.4.tar.gz-C./canal
オープン・サーバ・ポートの構成:11110、11111、11112
canalプロファイルの変更(ここでは2つのinstance、すなわち2つのデータベースが設定されています):
vi canal/conf/canal.properties
canal.destinations = example1,example2

インストールの設定:
cp -R canal/conf/example conf/example1
mv conf/example conf/example2

最初のデータベース構成
vi canal/conf/example1/instance.properties
canal.instance.master.address=32.1.2.140:3306

2番目のデータベース構成
vi canal/conf/example2/instance.properties
canal.instance.master.address=32.1.2.140:3307

#instanceを追加する必要がある場合はcanalを変更するだけです.propertiesファイルは、canalを再起動することなくinstance構成を追加します.
実行:
sh canal/bin/startup.sh
#     
cat canal/logs/canal/canal

 
3、Java使用サンプル
pom依存を導入するには、インストールされたcanalバージョンと一致する必要があります.

    
        com.alibaba.otter
        canal.client
        1.1.4
    

サンプルコード(2つのデータベースの変更内容を非同期で印刷):
package cn.spicybar.dblog;

import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.client.CanalConnectors;
import com.alibaba.otter.canal.protocol.CanalEntry.Entry;
import com.alibaba.otter.canal.protocol.CanalEntry.EntryType;
import com.alibaba.otter.canal.protocol.CanalEntry.RowChange;
import com.alibaba.otter.canal.protocol.Message;

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

public class CanalClient {

    public static void main(String[] args) {
        new Thread(() -> initConnector("example1")).start();
        new Thread(() -> initConnector("example2")).start();
    }

    private static void initConnector(String destination) {
        CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("32.1.0.237", 11111), destination, "", "");
        try {
            connector.connect();
            connector.subscribe(".*\\..*");
            connector.rollback();
            while (true) {
                Message message = connector.getWithoutAck(1000);
                if (message.getId() != -1 && message.getEntries().size() > 0) {
                    printEntry(message.getEntries());
                }
                connector.ack(message.getId());
            }
        } finally {
            connector.disconnect();
        }
    }

    private static void printEntry(List entries) {
        for (Entry entry : entries) {
            if (entry.getEntryType() == EntryType.TRANSACTIONBEGIN || entry.getEntryType() == EntryType.TRANSACTIONEND) {
                continue;
            }
            try {
                RowChange rowChange = RowChange.parseFrom(entry.getStoreValue());
                System.out.println(rowChange.getSql());
            } catch (Exception e) {
                throw new RuntimeException("ERROR ## parser error, data:" + entry.toString(), e);
            }
        }
    }

}

 
転載先:https://www.cnblogs.com/hackyo/p/11471385.html